[llvm] 2cc77b2 - [LiveVariables] Don't set undef reg PHI used as live for FromMBB

Kang Zhang via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 3 08:26:10 PDT 2020


Author: Kang Zhang
Date: 2020-06-03T15:25:30Z
New Revision: 2cc77b2b8a022c0f6c7c60bf3eda157f62007d88

URL: https://github.com/llvm/llvm-project/commit/2cc77b2b8a022c0f6c7c60bf3eda157f62007d88
DIFF: https://github.com/llvm/llvm-project/commit/2cc77b2b8a022c0f6c7c60bf3eda157f62007d88.diff

LOG: [LiveVariables] Don't set undef reg PHI used as live for FromMBB

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

Added: 
    llvm/test/CodeGen/AArch64/PHIElimination-crash.mir

Modified: 
    llvm/lib/CodeGen/LiveVariables.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/LiveVariables.cpp b/llvm/lib/CodeGen/LiveVariables.cpp
index 7e894717e079..6610491dd111 100644
--- a/llvm/lib/CodeGen/LiveVariables.cpp
+++ b/llvm/lib/CodeGen/LiveVariables.cpp
@@ -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
index 000000000000..1a1ba154062b
--- /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
+...


        


More information about the llvm-commits mailing list