diff --git a/lib/Transforms/IPO/PruneEH.cpp b/lib/Transforms/IPO/PruneEH.cpp index 714e1d6e42d..c9c0b197eae 100644 --- a/lib/Transforms/IPO/PruneEH.cpp +++ b/lib/Transforms/IPO/PruneEH.cpp @@ -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(BB->getTerminator())) if (II->doesNotThrow() && canSimplifyInvokeNoUnwind(F)) { - SmallVector Args(II->op_begin(), II->op_end() - 3); + CallSite CS(II); + SmallVector Args(CS.arg_begin(), CS.arg_end()); + SmallVector 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()); diff --git a/test/Transforms/PruneEH/operand-bundles.ll b/test/Transforms/PruneEH/operand-bundles.ll new file mode 100644 index 00000000000..efe8f62a8fb --- /dev/null +++ b/test/Transforms/PruneEH/operand-bundles.ll @@ -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(...)