[PATCH] D50842: [RegisterCoalescer] Do not assert when trying to remat dead values
Bjorn Pettersson via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 16 07:12:19 PDT 2018
bjope created this revision.
Herald added subscribers: tpr, qcolombet, MatzeB.
RegisterCoalescer::reMaterializeTrivialDef used to assert that
the input register was live in. But as shown by the new
coalesce-dead-lanes.mir test case that seems to be a valid
scenario. We now return false instead of the assert, simply
avoiding to remat the dead def.
Normally a COPY of an undef value is eliminated by
eliminateUndefCopy(). Although we only do that when the
destination isn't a physical register. So the situation
above should be limited to the case when we copy an undef
value to a physical register.
Repository:
rL LLVM
https://reviews.llvm.org/D50842
Files:
lib/CodeGen/RegisterCoalescer.cpp
test/CodeGen/X86/coalesce-dead-lanes.mir
Index: test/CodeGen/X86/coalesce-dead-lanes.mir
===================================================================
--- /dev/null
+++ test/CodeGen/X86/coalesce-dead-lanes.mir
@@ -0,0 +1,19 @@
+# RUN: llc -run-pass simple-register-coalescing -O0 -mtriple x86_64-pc-linux-gnu -o - %s | FileCheck %s
+
+---
+name: foo
+tracksRegLiveness: true
+body: |
+ bb.0:
+ undef %18.sub_8bit_hi:gr16_abcd = COPY undef $al
+ %1:gr16_abcd = COPY killed %18
+ dead %8:gr8 = COPY undef %1.sub_8bit_hi
+ $al = COPY undef %8
+...
+
+# This used to hit an assertion:
+# lib/CodeGen/RegisterCoalescer.cpp:1110: RegisterCoalescer::reMaterializeTrivialDef(...): Assertion `ValNo && "CopyMI input register not live"' failed.
+#
+# CHECK_LABEL: name: foo
+# CHECK: bb.0:
+# CHECK-NEXT: $al = COPY undef %2:gr8
Index: lib/CodeGen/RegisterCoalescer.cpp
===================================================================
--- lib/CodeGen/RegisterCoalescer.cpp
+++ lib/CodeGen/RegisterCoalescer.cpp
@@ -1138,7 +1138,8 @@
LiveInterval &SrcInt = LIS->getInterval(SrcReg);
SlotIndex CopyIdx = LIS->getInstructionIndex(*CopyMI);
VNInfo *ValNo = SrcInt.Query(CopyIdx).valueIn();
- assert(ValNo && "CopyMI input register not live");
+ if (!ValNo)
+ return false;
if (ValNo->isPHIDef() || ValNo->isUnused())
return false;
MachineInstr *DefMI = LIS->getInstructionFromIndex(ValNo->def);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D50842.161025.patch
Type: text/x-patch
Size: 1432 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180816/05134f84/attachment.bin>
More information about the llvm-commits
mailing list