[llvm] r340255 - [RegisterCoalescer] Do not assert when trying to remat dead values

Bjorn Pettersson via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 21 00:49:06 PDT 2018


Author: bjope
Date: Tue Aug 21 00:49:05 2018
New Revision: 340255

URL: http://llvm.org/viewvc/llvm-project?rev=340255&view=rev
Log:
[RegisterCoalescer] Do not assert when trying to remat dead values

Summary:
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.

Reviewers: kparzysz, wmi, tpr

Reviewed By: kparzysz

Subscribers: MatzeB, qcolombet, tpr, llvm-commits

Differential Revision: https://reviews.llvm.org/D50842

Added:
    llvm/trunk/test/CodeGen/X86/coalesce-dead-lanes.mir
Modified:
    llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp

Modified: llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp?rev=340255&r1=340254&r2=340255&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp Tue Aug 21 00:49:05 2018
@@ -1159,7 +1159,8 @@ bool RegisterCoalescer::reMaterializeTri
   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);

Added: llvm/trunk/test/CodeGen/X86/coalesce-dead-lanes.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/coalesce-dead-lanes.mir?rev=340255&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/coalesce-dead-lanes.mir (added)
+++ llvm/trunk/test/CodeGen/X86/coalesce-dead-lanes.mir Tue Aug 21 00:49:05 2018
@@ -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




More information about the llvm-commits mailing list