// 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;
// 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.
--- /dev/null
+# 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
+
+...