[PATCH] D49097: [RegisterCoalescer] Another fix for subrange join unreachable
Matt Arsenault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 14 10:13:31 PST 2018
arsenm updated this revision to Diff 174060.
arsenm added a comment.
Reduce testcase
https://reviews.llvm.org/D49097
Files:
lib/CodeGen/RegisterCoalescer.cpp
test/CodeGen/AMDGPU/coalescing-subreg-was-undef-but-became-def.mir
Index: test/CodeGen/AMDGPU/coalescing-subreg-was-undef-but-became-def.mir
===================================================================
--- /dev/null
+++ test/CodeGen/AMDGPU/coalescing-subreg-was-undef-but-became-def.mir
@@ -0,0 +1,37 @@
+# RUN: llc -march=amdgcn -mcpu=gfx803 -run-pass simple-register-coalescing -verify-machineinstrs -o - %s
+#
+# This is another example of a test giving "Couldn't join subrange!"
+#
+# This shows a case where a whole reg use point of the whole register was
+# undefined in one subreg, but after coalescing it became defined but the
+# subrange was not updated to reflect that.
+#
+
+---
+name: coalescing_makes_lane_defined
+tracksRegLiveness: true
+body: |
+ bb.0:
+ successors: %bb.1, %bb.2
+
+ %0:sreg_32_xm0 = S_MOV_B32 0
+ undef %1.sub2:sreg_128 = COPY %0
+ undef %2.sub0:sreg_128 = S_MOV_B32 0
+ undef %3.sub2:sreg_128 = COPY %0
+ S_CBRANCH_SCC0 %bb.2, implicit undef $scc
+
+ bb.1:
+ successors: %bb.2
+
+ undef %4.sub0:sreg_128 = S_MOV_B32 -1
+ %4.sub2:sreg_128 = COPY killed %0
+ %5:sreg_128 = COPY killed %4
+ %6:sreg_128 = COPY killed %1
+ %3:sreg_128 = COPY killed %6
+ %2:sreg_128 = COPY killed %5
+
+ bb.2:
+ S_NOP 0, implicit killed %3
+ S_ENDPGM implicit %2
+
+...
Index: lib/CodeGen/RegisterCoalescer.cpp
===================================================================
--- lib/CodeGen/RegisterCoalescer.cpp
+++ lib/CodeGen/RegisterCoalescer.cpp
@@ -1922,6 +1922,28 @@
// Update regalloc hint.
TRI->updateRegAllocHint(CP.getSrcReg(), CP.getDstReg(), *MF);
+ if (!CP.isPhys()) {
+ // Fix up the case that some subreg was undefined at a use, and thus the
+ // use was not in the live range, but due to merging it has now become
+ // defined.
+ LiveInterval &LI = LIS->getInterval(CP.getDstReg());
+ LLVM_DEBUG(dbgs() << "\tBefore extending subranges: " << LI << '\n');
+ for (auto &S : LI.subranges()) {
+ SmallVector<SlotIndex, 8> Uses;
+ for (auto &MO : MRI->reg_operands(CP.getDstReg())) {
+ if (!MO.isUse() || MO.isUndef() || MO.isDebug())
+ continue;
+ auto OperandMask = TRI->getSubRegIndexLaneMask(MO.getSubReg());
+ if ((OperandMask & S.LaneMask).none())
+ continue;
+ Uses.push_back(LIS->getInstructionIndex(*MO.getParent()).getRegSlot());
+ }
+ SmallVector<SlotIndex, 8> Undefs;
+ LI.computeSubRangeUndefs(Undefs, S.LaneMask, *MRI, *LIS->getSlotIndexes());
+ LIS->extendToIndices(S, Uses, Undefs);
+ }
+ }
+
LLVM_DEBUG({
dbgs() << "\tSuccess: " << printReg(CP.getSrcReg(), TRI, CP.getSrcIdx())
<< " -> " << printReg(CP.getDstReg(), TRI, CP.getDstIdx()) << '\n';
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49097.174060.patch
Type: text/x-patch
Size: 2721 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181114/01766862/attachment.bin>
More information about the llvm-commits
mailing list