aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-06-22 15:53:31 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-06-22 15:53:31 +0000
commit52e734792d8cd91c77801a5263a51b79a4f2fc6c (patch)
tree1b8ee1e82a6bfa45d94396b439a5e8ea8b275c7e
parent4c45e36dd832ef0c400bb650076cf946285760b4 (diff)
downloadllvm-52e734792d8cd91c77801a5263a51b79a4f2fc6c.tar.gz
[Hexagon] Handle a global operand to A2_addi when creating duplexes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306012 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp53
-rw-r--r--test/CodeGen/Hexagon/duplex-addi-global-imm.mir22
-rw-r--r--test/MC/Hexagon/duplex-addi-global-imm.s15
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
+ }
+
+