[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