This situation can occur:
authorBill Wendling <isanbard@gmail.com>
Mon, 23 Jun 2008 23:41:14 +0000 (23:41 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 23 Jun 2008 23:41:14 +0000 (23:41 +0000)
    ,------.
    |      |
    |      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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52655 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveVariables.cpp
test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll [new file with mode: 0644]

index 4a4ef37b004e4dfd480b785dc9ba2d69bea1e8ba..bc73b6841c4db9584ec99765a6fdacd725e8090f 100644 (file)
@@ -139,8 +139,23 @@ void LiveVariables::HandleVirtRegUse(unsigned reg, MachineBasicBlock *MBB,
     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
diff --git a/test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll b/test/CodeGen/PowerPC/2008-06-23-LiveVariablesCrash.ll
new file mode 100644 (file)
index 0000000..d3238d2
--- /dev/null
@@ -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
+}