summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp9
-rw-r--r--llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir33
2 files changed, 41 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp b/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp
index 823c9040c87..15ccef8ac83 100644
--- a/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp
+++ b/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp
@@ -504,6 +504,9 @@ void SILowerI1Copies::lowerPhis() {
SmallVector<MachineBasicBlock *, 4> IncomingBlocks;
SmallVector<unsigned, 4> IncomingRegs;
SmallVector<unsigned, 4> IncomingUpdated;
+#ifndef NDEBUG
+ DenseSet<unsigned> PhiRegisters;
+#endif
for (MachineBasicBlock &MBB : *MF) {
LF.initialize(MBB);
@@ -531,13 +534,17 @@ void SILowerI1Copies::lowerPhis() {
} else if (IncomingDef->getOpcode() == AMDGPU::IMPLICIT_DEF) {
continue;
} else {
- assert(IncomingDef->isPHI());
+ assert(IncomingDef->isPHI() || PhiRegisters.count(IncomingReg));
}
IncomingBlocks.push_back(IncomingMBB);
IncomingRegs.push_back(IncomingReg);
}
+#ifndef NDEBUG
+ PhiRegisters.insert(DstReg);
+#endif
+
// Phis in a loop that are observed outside the loop receive a simple but
// conservatively correct treatment.
MachineBasicBlock *PostDomBound = &MBB;
diff --git a/llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir b/llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir
new file mode 100644
index 00000000000..9312322c04a
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir
@@ -0,0 +1,33 @@
+# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -run-pass=si-i1-copies -o - %s | FileCheck -check-prefixes=GCN %s
+
+# GCN-LABEL: name: lcssa_phi
+---
+name: lcssa_phi
+tracksRegLiveness: true
+body: |
+ bb.0:
+ %0:sreg_64 = S_MOV_B64 0
+ %8:vreg_1 = IMPLICIT_DEF
+ %10:sreg_64 = IMPLICIT_DEF
+ %11:sreg_64 = SI_IF %10, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ S_BRANCH %bb.1
+
+ bb.1:
+ %1:sreg_64 = PHI %0, %bb.0, %3, %bb.1
+ %2:sreg_64 = IMPLICIT_DEF
+ %3:sreg_64 = SI_IF_BREAK %2, %1, implicit-def dead $scc
+ %4:sreg_64 = IMPLICIT_DEF
+ %5:vreg_1 = COPY %4
+ SI_LOOP %3, %bb.1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ S_BRANCH %bb.2
+
+ bb.2:
+ %6:vreg_1 = PHI %5, %bb.1
+ SI_END_CF %3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+
+ bb.3:
+ %7:vreg_1 = PHI %6, %bb.2, %8, %bb.0
+ SI_END_CF %11, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ S_ENDPGM 0
+
+...
OpenPOWER on IntegriCloud