[LiveVariables] Don't set undef reg PHI used as live for FromMBB
authorKang Zhang <shkzhang@cn.ibm.com>
Wed, 3 Jun 2020 15:25:30 +0000 (15:25 +0000)
committerKang Zhang <shkzhang@cn.ibm.com>
Wed, 3 Jun 2020 15:25:30 +0000 (15:25 +0000)
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

llvm/lib/CodeGen/LiveVariables.cpp
llvm/test/CodeGen/AArch64/PHIElimination-crash.mir [new file with mode: 0644]

index 7e89471..6610491 100644 (file)
@@ -828,7 +828,8 @@ void LiveVariables::addNewBlock(MachineBasicBlock *BB,
          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 (file)
index 0000000..1a1ba15
--- /dev/null
@@ -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
+...