diff options
-rw-r--r-- | lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp | 53 | ||||
-rw-r--r-- | test/CodeGen/Hexagon/duplex-addi-global-imm.mir | 22 | ||||
-rw-r--r-- | test/MC/Hexagon/duplex-addi-global-imm.s | 15 |
3 files changed, 63 insertions, 27 deletions
diff --git a/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp b/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp index e8f154a1fa5..c7114c7f18a 100644 --- a/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp +++ b/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp @@ -701,33 +701,32 @@ MCInst HexagonMCInstrInfo::deriveSubInst(MCInst const &Inst) { break; case Hexagon::A2_addi: Absolute = Inst.getOperand(2).getExpr()->evaluateAsAbsolute(Value); - assert(Absolute);(void)Absolute; - if (Value == 1) { - Result.setOpcode(Hexagon::SA1_inc); - addOps(Result, Inst, 0); - addOps(Result, Inst, 1); - break; - } // 1,2 SUBInst $Rd = add($Rs, #1) - else if (Value == -1) { - Result.setOpcode(Hexagon::SA1_dec); - addOps(Result, Inst, 0); - addOps(Result, Inst, 1); - addOps(Result, Inst, 2); - break; - } // 1,2 SUBInst $Rd = add($Rs,#-1) - else if (Inst.getOperand(1).getReg() == Hexagon::R29) { - Result.setOpcode(Hexagon::SA1_addsp); - addOps(Result, Inst, 0); - addOps(Result, Inst, 2); - break; - } // 1,3 SUBInst $Rd = add(r29, #$u6_2) - else { - Result.setOpcode(Hexagon::SA1_addi); - addOps(Result, Inst, 0); - addOps(Result, Inst, 1); - addOps(Result, Inst, 2); - break; - } // 1,2,3 SUBInst $Rx = add($Rx, #$s7) + if (Absolute) { + if (Value == 1) { + Result.setOpcode(Hexagon::SA1_inc); + addOps(Result, Inst, 0); + addOps(Result, Inst, 1); + break; + } // 1,2 SUBInst $Rd = add($Rs, #1) + if (Value == -1) { + Result.setOpcode(Hexagon::SA1_dec); + addOps(Result, Inst, 0); + addOps(Result, Inst, 1); + addOps(Result, Inst, 2); + break; + } // 1,2 SUBInst $Rd = add($Rs,#-1) + if (Inst.getOperand(1).getReg() == Hexagon::R29) { + Result.setOpcode(Hexagon::SA1_addsp); + addOps(Result, Inst, 0); + addOps(Result, Inst, 2); + break; + } // 1,3 SUBInst $Rd = add(r29, #$u6_2) + } + Result.setOpcode(Hexagon::SA1_addi); + addOps(Result, Inst, 0); + addOps(Result, Inst, 1); + addOps(Result, Inst, 2); + break; // 1,2,3 SUBInst $Rx = add($Rx, #$s7) case Hexagon::A2_add: Result.setOpcode(Hexagon::SA1_addrx); addOps(Result, Inst, 0); diff --git a/test/CodeGen/Hexagon/duplex-addi-global-imm.mir b/test/CodeGen/Hexagon/duplex-addi-global-imm.mir new file mode 100644 index 00000000000..be86abb9508 --- /dev/null +++ b/test/CodeGen/Hexagon/duplex-addi-global-imm.mir @@ -0,0 +1,22 @@ +# RUN: llc -march=hexagon -start-after if-converter %s -o - | FileCheck %s +# This used to crash. +# CHECK: add(r0,##g0) + +--- | + @g = global i32 0 + define void @fred() { + ret void + } +... + +--- +name: fred +tracksRegLiveness: true + +body: | + bb.0: + liveins: %r0 + %r0 = A2_addi %r0, @g + %r1 = A2_tfrsi 0 +... + diff --git a/test/MC/Hexagon/duplex-addi-global-imm.s b/test/MC/Hexagon/duplex-addi-global-imm.s new file mode 100644 index 00000000000..e8e338c6a58 --- /dev/null +++ b/test/MC/Hexagon/duplex-addi-global-imm.s @@ -0,0 +1,15 @@ +# RUN: llvm-mc -arch=hexagon -show-encoding %s | FileCheck %s +# Check that we generate a duplex for this packet. +# CHECK: encoding: [A,0x40'A',A,A,0x01'B',0x28'B',B,0x20'B'] + +.data +g: +.long 0 + +.text + { + r0 = add(r0,##g) + r1 = #0 + } + + |