diff options
| author | Chris Lattner <sabre@nondot.org> | 2011-01-21 05:29:50 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2011-01-21 05:29:50 +0000 |
| commit | b5e15d1907cd03ea3e1f6e6e675c31be947246a0 (patch) | |
| tree | 3f988de265085fac26568a369a296df94c124907 | |
| parent | 4edf1c8968ac8e96265faadcbda341aa4e1431ef (diff) | |
| download | bcm5719-llvm-b5e15d1907cd03ea3e1f6e6e675c31be947246a0.tar.gz bcm5719-llvm-b5e15d1907cd03ea3e1f6e6e675c31be947246a0.zip | |
fix PR9013, an infinite loop in instcombine.
llvm-svn: 123968
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 12 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/crash.ll | 17 |
2 files changed, 27 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 06fbaad3e48..2d5773a31fc 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -538,9 +538,11 @@ Instruction *InstCombiner::FoldOpIntoPhi(Instruction &I) { if (!PN->hasOneUse()) { // Walk the use list for the instruction, comparing them to I. for (Value::use_iterator UI = PN->use_begin(), E = PN->use_end(); - UI != E; ++UI) - if (!I.isIdenticalTo(cast<Instruction>(*UI))) + UI != E; ++UI) { + Instruction *User = cast<Instruction>(*UI); + if (User != &I && !I.isIdenticalTo(User)) return 0; + } // Otherwise, we can replace *all* users with the new PHI we form. } @@ -565,6 +567,12 @@ Instruction *InstCombiner::FoldOpIntoPhi(Instruction &I) { if (InvokeInst *II = dyn_cast<InvokeInst>(InVal)) if (II->getParent() == NonConstBB) return 0; + + // If the incoming non-constant value is in I's block, we will remove one + // instruction, but insert another equivalent one, leading to infinite + // instcombine. + if (NonConstBB == I.getParent()) + return 0; } // If there is exactly one non-constant value, we can insert a copy of the diff --git a/llvm/test/Transforms/InstCombine/crash.ll b/llvm/test/Transforms/InstCombine/crash.ll index e8babc3a1ee..e17774d7b0e 100644 --- a/llvm/test/Transforms/InstCombine/crash.ll +++ b/llvm/test/Transforms/InstCombine/crash.ll @@ -353,3 +353,20 @@ entry: ret %struct.basic_ios* %0 } +; PR9013 +define void @test18() nounwind ssp { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %l_197.0 = phi i32 [ 0, %entry ], [ %sub.i, %for.inc ] + br label %for.inc + +for.inc: ; preds = %for.cond + %conv = and i32 %l_197.0, 255 + %sub.i = add nsw i32 %conv, -1 + br label %for.cond + +return: ; No predecessors! + ret void +} |

