diff --git a/llvm/lib/CodeGen/LiveVariables.cpp b/llvm/lib/CodeGen/LiveVariables.cpp --- a/llvm/lib/CodeGen/LiveVariables.cpp +++ b/llvm/lib/CodeGen/LiveVariables.cpp @@ -828,7 +828,8 @@ BBE = SuccBB->end(); BBI != BBE && BBI->isPHI(); ++BBI) { for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2) - if (BBI->getOperand(i + 1).getMBB() == BB) + if (BBI->getOperand(i + 1).getMBB() == BB && + BBI->getOperand(i).readsReg()) getVarInfo(BBI->getOperand(i).getReg()) .AliveBlocks.set(NumNew); } diff --git a/llvm/test/CodeGen/AArch64/PHIElimination-crash.mir b/llvm/test/CodeGen/AArch64/PHIElimination-crash.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/PHIElimination-crash.mir @@ -0,0 +1,25 @@ +# RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs -o /dev/null %s \ +# RUN: -run-pass=livevars,phi-node-elimination,twoaddressinstruction \ +# RUN: -no-phi-elim-live-out-early-exit=1 -phi-elim-split-all-critical-edges=1 + +# Used to result in +# +# *** Bad machine code: LiveVariables: Block should not be in AliveBlocks *** +# +# Just verify that we do not crash (or get verifier error). + +--- +name: test +tracksRegLiveness: true +body: | + bb.0: + liveins: $nzcv, $wzr + Bcc 8, %bb.2, implicit $nzcv + + bb.1: + %x:gpr32 = COPY $wzr + + bb.2: + %y:gpr32 = PHI %x:gpr32, %bb.1, undef %undef:gpr32, %bb.0 + $wzr = COPY %y:gpr32 +...