Summary:
In the patch D73152, it adds a new function LiveVariables::addNewBlock.
This new function will add the reg which PHI used to the MBB which reg
is from.
But the new function may cause LiveVariable Verification failed when the
Src reg in PHI is undef.
Reviewed By: bjope
Differential Revision: https://reviews.llvm.org/D80077
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);
}
--- /dev/null
+# 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
+...