From c786b31233f58b8edb2909bf94a072041aae0119 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Fri, 30 Nov 2012 22:08:55 +0000 Subject: Replace r168930 with a more reasonable patch. The original patch removed a bunch of code that the SjLjEHPrepare pass placed into the entry block if all of the landing pads were removed during the CodeGenPrepare class. The more natural way of doing things is to run the CGP *before* we run the SjLjEHPrepare pass. Make it so! llvm-svn: 169044 --- llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp | 75 --------------------------- 1 file changed, 75 deletions(-) (limited to 'llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp') diff --git a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp index c4df1545299..61adb2dc12b 100644 --- a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -22,7 +22,6 @@ #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/IntrinsicInst.h" -#include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallSet.h" @@ -184,12 +183,8 @@ bool CodeGenPrepare::runOnFunction(Function &F) { if (!DisableBranchOpts) { MadeChange = false; SmallPtrSet WorkList; - SmallPtrSet LPadList; - SmallVector ReturnList; for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { SmallVector Successors(succ_begin(BB), succ_end(BB)); - if (BB->isLandingPad()) LPadList.insert(BB); - if (isa(BB->getTerminator())) ReturnList.push_back(BB); MadeChange |= ConstantFoldTerminator(BB, true); if (!MadeChange) continue; @@ -200,11 +195,9 @@ bool CodeGenPrepare::runOnFunction(Function &F) { } // Delete the dead blocks and any of their dead successors. - bool HadLPads = !LPadList.empty(); while (!WorkList.empty()) { BasicBlock *BB = *WorkList.begin(); WorkList.erase(BB); - LPadList.erase(BB); SmallVector Successors(succ_begin(BB), succ_end(BB)); DeleteDeadBlock(BB); @@ -215,74 +208,6 @@ bool CodeGenPrepare::runOnFunction(Function &F) { WorkList.insert(*II); } - if (HadLPads && LPadList.empty()) { - // All of the landing pads were removed. Get rid of the SjLj EH context - // code. - Module *M = F.getParent(); - - // These functions must exist if we have SjLj EH code to clean up. - Constant *RegisterFn = M->getFunction("_Unwind_SjLj_Register"); - Constant *UnregisterFn = M->getFunction("_Unwind_SjLj_Unregister"); - - if (RegisterFn) { - Constant *LSDAAddrFn = - Intrinsic::getDeclaration(M, Intrinsic::eh_sjlj_lsda); - Constant *FrameAddrFn = - Intrinsic::getDeclaration(M, Intrinsic::frameaddress); - Constant *StackAddrFn = - Intrinsic::getDeclaration(M, Intrinsic::stacksave); - Constant *BuiltinSetjmpFn = - Intrinsic::getDeclaration(M, Intrinsic::eh_sjlj_setjmp); - Constant *FuncCtxFn = - Intrinsic::getDeclaration(M, Intrinsic::eh_sjlj_functioncontext); - - BasicBlock &Entry = F.getEntryBlock(); - SmallVector DeadInsts; - for (BasicBlock::iterator I = Entry.begin(), E = Entry.end(); - I != E; ++I) { - if (CallInst *CI = dyn_cast(I)) { - Value *Callee = CI->getCalledValue(); - bool IsDead = true; - if (Callee != LSDAAddrFn && Callee != FrameAddrFn && - Callee != StackAddrFn && Callee != BuiltinSetjmpFn && - Callee != FuncCtxFn && Callee != RegisterFn) - IsDead = false; - - if (IsDead) { - Type *Ty = CI->getType(); - if (!Ty->isVoidTy()) - CI->replaceAllUsesWith(UndefValue::get(Ty)); - DeadInsts.push_back(CI); - } - } - } - - // Find and remove the unregister calls. - for (SmallVectorImpl::iterator I = ReturnList.begin(), - E = ReturnList.end(); I != E; ++I) { - BasicBlock *BB = *I; - typedef BasicBlock::InstListType::reverse_iterator reverse_iterator; - - for (reverse_iterator II = BB->getInstList().rbegin(), - IE = BB->getInstList().rend(); II != IE; ++II) { - if (CallInst *CI = dyn_cast(&*II)) { - Value *Callee = CI->getCalledValue(); - - if (Callee == UnregisterFn) { - DeadInsts.push_back(CI); - break; - } - } - } - } - - // Kill the dead instructions. - for (SmallVectorImpl::iterator I = DeadInsts.begin(), - E = DeadInsts.end(); I != E; ++I) - (*I)->eraseFromParent(); - } - } - // Merge pairs of basic blocks with unconditional branches, connected by // a single edge. if (EverMadeChange || MadeChange) -- cgit v1.2.3