From: Sanjoy Das Date: Tue, 8 Dec 2015 23:16:52 +0000 (+0000) Subject: [OperandBundles] Have PruneEH work correct with operand bundles. X-Git-Tag: android-x86-7.1-r4~40429 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9c609eaad830ef4d94c43ca50e41b766dddcd8d7;p=android-x86%2Fexternal-llvm.git [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255073 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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(...)