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 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: 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 + +...