[llvm-commits] [llvm] r139117 - in /llvm/trunk: lib/Transforms/Utils/SimplifyCFG.cpp test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll
Devang Patel
dpatel at apple.com
Tue Sep 6 10:52:49 PDT 2011
On Sep 5, 2011, at 5:57 AM, Duncan Sands wrote:
> Author: baldrick
> Date: Mon Sep 5 07:57:57 2011
> New Revision: 139117
>
> URL: http://llvm.org/viewvc/llvm-project?rev=139117&view=rev
> Log:
> Delete trivial landing pads that just continue unwinding the caught
> exception.
>
> Added:
> llvm/trunk/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll
> Modified:
> llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
>
> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=139117&r1=139116&r2=139117&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Mon Sep 5 07:57:57 2011
> @@ -63,6 +63,7 @@
> bool FoldValueComparisonIntoPredecessors(TerminatorInst *TI,
> IRBuilder<> &Builder);
>
> + bool SimplifyResume(ResumeInst *RI, IRBuilder<> &Builder);
> bool SimplifyReturn(ReturnInst *RI, IRBuilder<> &Builder);
> bool SimplifyUnwind(UnwindInst *UI, IRBuilder<> &Builder);
> bool SimplifyUnreachable(UnreachableInst *UI);
> @@ -2138,6 +2139,52 @@
> return true;
> }
>
> +bool SimplifyCFGOpt::SimplifyResume(ResumeInst *RI, IRBuilder<> &Builder) {
> + // If this is a trivial landing pad that just continues unwinding the caught
> + // exception then zap the landing pad, turning its invokes into calls.
> + BasicBlock *BB = RI->getParent();
> + LandingPadInst *LPInst = dyn_cast<LandingPadInst>(BB->getFirstNonPHI());
> + if (RI->getValue() != LPInst)
> + // Not a landing pad, or the resume is not unwinding the exception that
> + // caused control to branch here.
> + return false;
> +
> + // Check that there are no other instructions except for debug intrinsics.
> + BasicBlock::iterator I = LPInst, E = RI;
> + while (++I != E)
> + if (!isa<DbgInfoIntrinsic>(I))
> + return false;
> +
> + // Turn all invokes that unwind here into calls and delete the basic block.
> + for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;) {
> + InvokeInst *II = cast<InvokeInst>((*PI++)->getTerminator());
> + SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
> + // Insert a call instruction before the invoke.
> + CallInst *Call = CallInst::Create(II->getCalledValue(), Args, "", II);
Any reason to not use Builder to create call inst ?
-
Devang
> + Call->takeName(II);
> + Call->setCallingConv(II->getCallingConv());
> + Call->setAttributes(II->getAttributes());
> + Call->setDebugLoc(II->getDebugLoc());
> +
> + // Anything that used the value produced by the invoke instruction now uses
> + // the value produced by the call instruction. Note that we do this even
> + // for void functions and calls with no uses so that the callgraph edge is
> + // updated.
> + II->replaceAllUsesWith(Call);
> + BB->removePredecessor(II->getParent());
> +
> + // Insert a branch to the normal destination right before the invoke.
> + BranchInst::Create(II->getNormalDest(), II);
> +
> + // Finally, delete the invoke instruction!
> + II->eraseFromParent();
> + }
> +
> + // The landingpad is now unreachable. Zap it.
> + BB->eraseFromParent();
> + return true;
> +}
> +
> bool SimplifyCFGOpt::SimplifyReturn(ReturnInst *RI, IRBuilder<> &Builder) {
> BasicBlock *BB = RI->getParent();
> if (!BB->getFirstNonPHIOrDbg()->isTerminator()) return false;
> @@ -2836,6 +2883,8 @@
> } else {
> if (SimplifyCondBranch(BI, Builder)) return true;
> }
> + } else if (ResumeInst *RI = dyn_cast<ResumeInst>(BB->getTerminator())) {
> + if (SimplifyResume(RI, Builder)) return true;
> } else if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) {
> if (SimplifyReturn(RI, Builder)) return true;
> } else if (SwitchInst *SI = dyn_cast<SwitchInst>(BB->getTerminator())) {
>
> Added: llvm/trunk/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll?rev=139117&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll (added)
> +++ llvm/trunk/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll Mon Sep 5 07:57:57 2011
> @@ -0,0 +1,22 @@
> +; RUN: opt < %s -simplifycfg -S | FileCheck %s
> +
> +; CHECK-NOT: invoke
> +; CHECK-NOT: landingpad
> +
> +declare void @bar()
> +
> +define i32 @foo() {
> +entry:
> + invoke void @bar()
> + to label %return unwind label %lpad
> +
> +return:
> + ret i32 0
> +
> +lpad:
> + %lp = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
> + cleanup
> + resume { i8*, i32 } %lp
> +}
> +
> +declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list