[PATCH] D62162: Fix register coalescer failure to prune value

Stanislav Mekhanoshin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 20 17:23:53 PDT 2019


rampitec updated this revision to Diff 200379.
rampitec marked 2 inline comments as done.
rampitec edited the summary of this revision.
rampitec added a comment.

Reduced test.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62162/new/

https://reviews.llvm.org/D62162

Files:
  lib/CodeGen/RegisterCoalescer.cpp
  test/CodeGen/AMDGPU/coalescer-subranges-prune-kill-copy.mir


Index: test/CodeGen/AMDGPU/coalescer-subranges-prune-kill-copy.mir
===================================================================
--- /dev/null
+++ test/CodeGen/AMDGPU/coalescer-subranges-prune-kill-copy.mir
@@ -0,0 +1,41 @@
+# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=simple-register-coalescing -o - %s | FileCheck -check-prefix=GCN %s
+
+# Test used to crash with message:
+# JoinVals::ConflictResolution (anonymous namespace)::JoinVals::analyzeValue(unsigned int, (anonymous namespace)::JoinVals &): Assertion `DefMI != nullptr' failed
+
+# GCN:      bb.0:
+# GCN:      undef %2.sub0:vreg_256 = IMPLICIT_DEF
+# GCN-NEXT: %2.sub1:vreg_256 = COPY %2.sub0
+# GCN-NEXT: S_BRANCH %bb.2
+
+---
+name:            test
+tracksRegLiveness: true
+body:             |
+  bb.0:
+
+    %0:vgpr_32 = IMPLICIT_DEF
+    undef %1.sub0:vreg_256 = COPY %0
+    %1.sub1:vreg_256 = COPY %0
+    %2:vreg_256 = COPY %1
+    %3:vreg_256 = COPY killed %1
+    S_BRANCH %bb.2
+
+  bb.1:
+
+    %2:vreg_256 = COPY undef killed %4:vreg_256
+
+  bb.2:
+
+    %9:vreg_256 = COPY killed %2
+    %9.sub2:vreg_256 = COPY undef %8:sreg_32
+    %3:vreg_256 = COPY killed %9
+    %10:vreg_256 = COPY killed %3
+    %11:vreg_256 = COPY killed %10:vreg_256
+    S_BRANCH %bb.3
+
+  bb.3:
+
+    SI_RETURN_TO_EPILOG %11.sub7
+
+...
Index: lib/CodeGen/RegisterCoalescer.cpp
===================================================================
--- lib/CodeGen/RegisterCoalescer.cpp
+++ lib/CodeGen/RegisterCoalescer.cpp
@@ -3032,7 +3032,9 @@
       // If a subrange starts at the copy then an undefined value has been
       // copied and we must remove that subrange value as well.
       VNInfo *ValueOut = Q.valueOutOrDead();
-      if (ValueOut != nullptr && Q.valueIn() == nullptr) {
+      if (ValueOut != nullptr && (Q.valueIn() == nullptr ||
+                                  (V.Identical && V.Resolution == CR_Erase &&
+                                   ValueOut->def == Def))) {
         LLVM_DEBUG(dbgs() << "\t\tPrune sublane " << PrintLaneMask(S.LaneMask)
                           << " at " << Def << "\n");
         SmallVector<SlotIndex,8> EndPoints;
@@ -3041,7 +3043,7 @@
         // Mark value number as unused.
         ValueOut->markUnused();
 
-        if (V.Identical && S.Query(OtherDef).valueOut()) {
+        if (V.Identical && S.Query(OtherDef).valueOutOrDead()) {
           // If V is identical to V.OtherVNI (and S was live at OtherDef),
           // then we can't simply prune V from S. V needs to be replaced
           // with V.OtherVNI.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62162.200379.patch
Type: text/x-patch
Size: 2546 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190521/d70d283c/attachment.bin>


More information about the llvm-commits mailing list