summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-09-28 06:49:44 +0000
committerChris Lattner <sabre@nondot.org>2009-09-28 06:49:44 +0000
commit0261b5d2d2f59da443196f11eb17af3aee8a4480 (patch)
treeb1c0f0a4d06787616cb51aaec1a634bf47c83b3c
parent14d1bf43618e9ba5efb53a751d8d999a44b8e918 (diff)
downloadbcm5719-llvm-0261b5d2d2f59da443196f11eb17af3aee8a4480.tar.gz
bcm5719-llvm-0261b5d2d2f59da443196f11eb17af3aee8a4480.zip
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
-rw-r--r--llvm/lib/Transforms/Scalar/InstructionCombining.cpp5
-rw-r--r--llvm/test/Transforms/InstCombine/select.ll16
2 files changed, 19 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 6826e132735..561527cbb46 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -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;
diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll
index 701d5967a67..b04382e8b11 100644
--- a/llvm/test/Transforms/InstCombine/select.ll
+++ b/llvm/test/Transforms/InstCombine/select.ll
@@ -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
+}
+
OpenPOWER on IntegriCloud