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.

llvm-svn: 52655
This commit is contained in:
Bill Wendling 2008-06-23 23:41:14 +00:00
parent 95743e3078
commit 2501066409
2 changed files with 42 additions and 2 deletions

View 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

View File

@ -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
}