fix rdar://7590304, an infinite loop in instcombine. In the invoke

case, instcombine can't zap the invoke for fear of changing the CFG.
However, we have to do something to prevent the next iteration of
instcombine from inserting another store -> undef before the invoke
thereby getting into infinite iteration between dead store elim and
store insertion.

Just zap the callee to null, which will prevent the next iteration
from doing anything.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94985 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-02-01 18:04:58 +00:00
parent 3cb8509b68
commit 830f3f205d
2 changed files with 28 additions and 1 deletions

View File

@ -703,8 +703,13 @@ Instruction *InstCombiner::visitCallSite(CallSite CS) {
// This allows ValueHandlers and custom metadata to adjust itself.
if (!OldCall->getType()->isVoidTy())
OldCall->replaceAllUsesWith(UndefValue::get(OldCall->getType()));
if (isa<CallInst>(OldCall)) // Not worth removing an invoke here.
if (isa<CallInst>(OldCall))
return EraseInstFromFunction(*OldCall);
// We cannot remove an invoke, because it would change the CFG, just
// change the callee to a null pointer.
cast<InvokeInst>(OldCall)->setOperand(0,
Constant::getNullValue(CalleeF->getType()));
return 0;
}

View File

@ -204,3 +204,25 @@ declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind
declare void @_ZSt9terminatev()
declare void @_Unwind_Resume_or_Rethrow(i8*)
; rdar://7590304
define i8* @test10(i8* %self, i8* %tmp3) {
entry:
store i1 true, i1* undef
store i1 true, i1* undef
invoke arm_apcscc void @test10a()
to label %invoke.cont unwind label %try.handler ; <i8*> [#uses=0]
invoke.cont: ; preds = %entry
unreachable
try.handler: ; preds = %entry
ret i8* %self
}
define void @test10a() {
ret void
}