summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/CodeGen/IfConversion.cpp11
-rw-r--r--llvm/test/CodeGen/Hexagon/ifcvt-live-subreg.mir50
2 files changed, 61 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/IfConversion.cpp b/llvm/lib/CodeGen/IfConversion.cpp
index f5f752ac27e..025eea229cc 100644
--- a/llvm/lib/CodeGen/IfConversion.cpp
+++ b/llvm/lib/CodeGen/IfConversion.cpp
@@ -1453,6 +1453,17 @@ static void UpdatePredRedefs(MachineInstr &MI, LivePhysRegs &Redefs) {
}
if (LiveBeforeMI.count(Reg))
MIB.addReg(Reg, RegState::Implicit);
+ else {
+ bool HasLiveSubReg = false;
+ for (MCSubRegIterator S(Reg, TRI); S.isValid(); ++S) {
+ if (!LiveBeforeMI.count(*S))
+ continue;
+ HasLiveSubReg = true;
+ break;
+ }
+ if (HasLiveSubReg)
+ MIB.addReg(Reg, RegState::Implicit);
+ }
}
}
diff --git a/llvm/test/CodeGen/Hexagon/ifcvt-live-subreg.mir b/llvm/test/CodeGen/Hexagon/ifcvt-live-subreg.mir
new file mode 100644
index 00000000000..12cc086bd34
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/ifcvt-live-subreg.mir
@@ -0,0 +1,50 @@
+# RUN: llc -march=hexagon -run-pass if-converter -o - %s | FileCheck %s
+# Check that an implicit use is generated for a predicated instruction
+# when a subregister of the redefined register is live.
+
+# CHECK-LABEL: name: foo
+
+# Verify the predicated block:
+# CHECK-LABEL: bb.0:
+# CHECK: liveins: %r0, %r1, %p0, %d8
+# CHECK: %d8 = A2_combinew killed %r0, killed %r1
+# CHECK: %d8 = L2_ploadrdf_io %p0, %r29, 0, implicit %d8
+# CHECK: J2_jumprf %p0, killed %r31, implicit-def %pc, implicit-def %pc, implicit killed %d8
+
+--- |
+ define void @foo() {
+ ret void
+ }
+...
+
+
+---
+name: foo
+alignment: 4
+tracksRegLiveness: true
+liveins:
+ - { reg: '%r0' }
+ - { reg: '%r1' }
+ - { reg: '%p0' }
+ - { reg: '%d8' }
+body: |
+ bb.0:
+ successors: %bb.1, %bb.2
+ liveins: %r0, %r1, %p0, %d8
+ %d8 = A2_combinew killed %r0, killed %r1
+ J2_jumpf killed %p0, %bb.2, implicit-def %pc
+
+ bb.1:
+ liveins: %d0, %r17
+ %r0 = A2_tfrsi 0
+ %r1 = A2_tfrsi 0
+ A2_nop ; non-predicable
+ J2_jumpr killed %r31, implicit-def dead %pc, implicit killed %d0
+
+ bb.2:
+ ; Predicate this block.
+ %d8 = L2_loadrd_io %r29, 0
+ J2_jumpr killed %r31, implicit-def dead %pc, implicit killed %d8
+
+...
+
OpenPOWER on IntegriCloud