[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