The select instruction is not neccesarily in the same block as the

phi nodes.  Make sure to phi translate from the right block. 

This fixes a llvm-building-llvm failure on GVN-PRE.cpp

llvm-svn: 82970
This commit is contained in:
Chris Lattner 2009-09-28 06:49:44 +00:00
parent 14d1bf4361
commit 0261b5d2d2
2 changed files with 19 additions and 2 deletions

View File

@ -2002,10 +2002,11 @@ Instruction *InstCombiner::FoldOpIntoPhi(Instruction &I,
// not the true/false values.
Value *TrueV = SI->getTrueValue();
Value *FalseV = SI->getFalseValue();
BasicBlock *PhiTransBB = PN->getParent();
for (unsigned i = 0; i != NumPHIValues; ++i) {
BasicBlock *ThisBB = PN->getIncomingBlock(i);
Value *TrueVInPred = TrueV->DoPHITranslation(I.getParent(), ThisBB);
Value *FalseVInPred = FalseV->DoPHITranslation(I.getParent(), ThisBB);
Value *TrueVInPred = TrueV->DoPHITranslation(PhiTransBB, ThisBB);
Value *FalseVInPred = FalseV->DoPHITranslation(PhiTransBB, ThisBB);
Value *InV = 0;
if (Constant *InC = dyn_cast<Constant>(PN->getIncomingValue(i))) {
InV = InC->isNullValue() ? FalseVInPred : TrueVInPred;

View File

@ -247,3 +247,19 @@ ret:
%b = select i1 %a, i32 %A, i32 %c
ret i32 %b
}
define i32 @test29(i1 %cond, i32 %A, i32 %B) {
entry:
br i1 %cond, label %jump, label %ret
jump:
br label %ret
ret:
%c = phi i32 [%A, %jump], [%B, %entry]
%a = phi i1 [true, %jump], [false, %entry]
br label %next
next:
%b = select i1 %a, i32 %A, i32 %c
ret i32 %b
}