1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

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.

llvm-svn: 94985
This commit is contained in:
Chris Lattner 2010-02-01 18:04:58 +00:00
parent 8207d33d94
commit a336497d3f
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
}