Index: llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp =================================================================== --- llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp +++ llvm/trunk/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 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. Index: llvm/trunk/test/CodeGen/AMDGPU/coalescer-subranges-prune-kill-copy.mir =================================================================== --- llvm/trunk/test/CodeGen/AMDGPU/coalescer-subranges-prune-kill-copy.mir +++ llvm/trunk/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 + +...