mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[OperandBundles] Have PruneEH work correct with operand bundles.
For an invoke with operand bundles, the [op_begin(), op_end()-3] range can contain things other than invoke arguments. This change teaches PruneEH to use arg_begin() and arg_end() explicitly. llvm-svn: 255073
This commit is contained in:
parent
43afcbe1a1
commit
cb770fbcb6
@ -191,9 +191,14 @@ bool PruneEH::SimplifyFunction(Function *F) {
|
||||
for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator()))
|
||||
if (II->doesNotThrow() && canSimplifyInvokeNoUnwind(F)) {
|
||||
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
|
||||
CallSite CS(II);
|
||||
SmallVector<Value*, 8> Args(CS.arg_begin(), CS.arg_end());
|
||||
SmallVector<OperandBundleDef, 1> OpBundles;
|
||||
II->getOperandBundlesAsDefs(OpBundles);
|
||||
|
||||
// Insert a call instruction before the invoke.
|
||||
CallInst *Call = CallInst::Create(II->getCalledValue(), Args, "", II);
|
||||
CallInst *Call = CallInst::Create(II->getCalledValue(), Args, OpBundles,
|
||||
"", II);
|
||||
Call->takeName(II);
|
||||
Call->setCallingConv(II->getCallingConv());
|
||||
Call->setAttributes(II->getAttributes());
|
||||
|
26
test/Transforms/PruneEH/operand-bundles.ll
Normal file
26
test/Transforms/PruneEH/operand-bundles.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; RUN: opt < %s -prune-eh -S | FileCheck %s
|
||||
|
||||
declare void @nounwind() nounwind
|
||||
|
||||
define internal void @foo() {
|
||||
call void @nounwind()
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @caller() personality i32 (...)* @__gxx_personality_v0 {
|
||||
; CHECK-LABEL: @caller(
|
||||
; CHECK-NOT: invoke
|
||||
; CHECK: call void @foo() [ "foo"(i32 0, i8 1) ]
|
||||
invoke void @foo() [ "foo"(i32 0, i8 1) ]
|
||||
to label %Normal unwind label %Except
|
||||
|
||||
Normal: ; preds = %0
|
||||
ret i32 0
|
||||
|
||||
Except: ; preds = %0
|
||||
landingpad { i8*, i32 }
|
||||
catch i8* null
|
||||
ret i32 1
|
||||
}
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
Loading…
Reference in New Issue
Block a user