[llvm-commits] [llvm] r52655 - in /llvm/trunk: lib/CodeGen/LiveVariables.cpp test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll

Bill Wendling isanbard at gmail.com
Mon Jun 23 16:41:14 PDT 2008


Author: void
Date: Mon Jun 23 18:41:14 2008
New Revision: 52655

URL: http://llvm.org/viewvc/llvm-project?rev=52655&view=rev
Log:
This situation can occur:

    ,------.
    |      |
    |      v
    |   t2 = phi ... t1 ...
    |      |
    |      v
    |   t1 = ...
    |  ... = ... t1 ...
    |      |
    `------'

where there is a use in a PHI node that's a predecessor to the defining
block. We don't want to mark all predecessors as having the value "alive" in
this case. Also, the assert was too restrictive and didn't handle this case.

Added:
    llvm/trunk/test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll
Modified:
    llvm/trunk/lib/CodeGen/LiveVariables.cpp

Modified: llvm/trunk/lib/CodeGen/LiveVariables.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveVariables.cpp?rev=52655&r1=52654&r2=52655&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/LiveVariables.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveVariables.cpp Mon Jun 23 18:41:14 2008
@@ -139,8 +139,23 @@
     assert(VRInfo.Kills[i]->getParent() != MBB && "entry should be at end!");
 #endif
 
-  assert(MBB != MRI->getVRegDef(reg)->getParent() &&
-         "Should have kill for defblock!");
+  // This situation can occur:
+  //
+  //     ,------.
+  //     |      |
+  //     |      v
+  //     |   t2 = phi ... t1 ...
+  //     |      |
+  //     |      v
+  //     |   t1 = ...
+  //     |  ... = ... t1 ...
+  //     |      |
+  //     `------'
+  //
+  // where there is a use in a PHI node that's a predecessor to the defining
+  // block. We don't want to mark all predecessors as having the value "alive"
+  // in this case.
+  if (MBB == MRI->getVRegDef(reg)->getParent()) return;
 
   // Add a new kill entry for this basic block. If this virtual register is
   // already marked as alive in this basic block, that means it is alive in at

Added: llvm/trunk/test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll?rev=52655&view=auto

==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll (added)
+++ llvm/trunk/test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll Mon Jun 23 18:41:14 2008
@@ -0,0 +1,25 @@
+; RUN: llvm-as < %s | llc -march=ppc32
+; <rdar://problem/6020042>
+
+define i32 @bork() nounwind  {
+entry:
+	br i1 true, label %bb1, label %bb3
+
+bb1:
+	%tmp1 = load i8* null, align 1
+	%tmp2 = icmp eq i8 %tmp1, 0
+	br label %bb2
+
+bb2:
+	%val1 = phi i32 [ 0, %bb1 ], [ %val2, %bb2 ]
+	%val2 = select i1 %tmp2, i32 -1, i32 %val1
+	switch i32 %val2, label %bb2 [
+		 i32 -1, label %bb3
+		 i32 0, label %bb1
+		 i32 1, label %bb3
+		 i32 2, label %bb1
+	]
+
+bb3:
+	ret i32 -1
+}





More information about the llvm-commits mailing list