forked from OSchip/llvm-project
Teach globalopt how to evaluate an invoke with a non-void return type.
llvm-svn: 152634
This commit is contained in:
parent
ece209afbc
commit
eab06fa3c9
|
@ -2561,11 +2561,6 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst,
|
|||
return false;
|
||||
delete ValueStack.pop_back_val();
|
||||
InstResult = RetVal;
|
||||
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(CurInst)) {
|
||||
NextBB = II->getNormalDest();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else if (isa<TerminatorInst>(CurInst)) {
|
||||
if (BranchInst *BI = dyn_cast<BranchInst>(CurInst)) {
|
||||
|
@ -2610,6 +2605,12 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst,
|
|||
setVal(CurInst, InstResult);
|
||||
}
|
||||
|
||||
// If we just processed an invoke, we finished evaluating the block.
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(CurInst)) {
|
||||
NextBB = II->getNormalDest();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Advance program counter.
|
||||
++CurInst;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
; RUN: opt -S -globalopt < %s | FileCheck %s
|
||||
; rdar://11022897
|
||||
|
||||
; Globalopt should be able to evaluate an invoke.
|
||||
; CHECK: @tmp = global i32 1
|
||||
|
||||
@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
|
||||
@tmp = global i32 0
|
||||
|
||||
define i32 @one() {
|
||||
ret i32 1
|
||||
}
|
||||
|
||||
define void @_GLOBAL__I_a() {
|
||||
bb:
|
||||
%tmp1 = invoke i32 @one()
|
||||
to label %bb2 unwind label %bb4
|
||||
|
||||
bb2: ; preds = %bb
|
||||
store i32 %tmp1, i32* @tmp
|
||||
ret void
|
||||
|
||||
bb4: ; preds = %bb
|
||||
%tmp5 = landingpad { i8*, i32 } personality i8* undef
|
||||
filter [0 x i8*] zeroinitializer
|
||||
unreachable
|
||||
}
|
Loading…
Reference in New Issue