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

Stanislav Mekhanoshin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 21 10:45:43 PDT 2019


rampitec updated this revision to Diff 200538.
rampitec added a comment.

Use test further reduced by Matt.


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,39 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs -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
+
+---
+name:            test
+tracksRegLiveness: true
+body:             |
+  ; GCN-LABEL: name: test
+  ; GCN: bb.0:
+  ; GCN:   successors: %bb.2(0x80000000)
+  ; GCN:   undef %1.sub0:vreg_128 = IMPLICIT_DEF
+  ; GCN:   %1.sub1:vreg_128 = IMPLICIT_DEF
+  ; GCN:   S_BRANCH %bb.2
+  ; GCN: bb.1:
+  ; GCN:   successors: %bb.2(0x80000000)
+  ; GCN:   [[DEF:%[0-9]+]]:vreg_128 = IMPLICIT_DEF
+  ; GCN: bb.2:
+  ; GCN:   [[DEF]].sub2:vreg_128 = COPY undef %3:sreg_32
+  ; GCN:   S_ENDPGM 0, implicit [[DEF]]
+  bb.0:
+    undef %0.sub0:vreg_128 = IMPLICIT_DEF
+    %0.sub1:vreg_128 = IMPLICIT_DEF
+    %1:vreg_128 = COPY %0
+    %2:vreg_128 = COPY killed %0
+    S_BRANCH %bb.2
+
+  bb.1:
+    %1:vreg_128 = COPY killed undef %1
+
+  bb.2:
+    %1.sub2:vreg_128 = COPY undef %3:sreg_32
+    %2:vreg_128 = COPY killed %1
+    %4:vreg_128 = COPY killed %2
+    S_ENDPGM 0, implicit killed %4
+
+...
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.200538.patch
Type: text/x-patch
Size: 2786 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190521/8e7e35dd/attachment.bin>


More information about the llvm-commits mailing list