diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-11-30 22:08:55 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-11-30 22:08:55 +0000 |
commit | 08510b14d4fe5d9b1a979fbee8a7aad11dbc6cea (patch) | |
tree | bffe39f76d8df42d0557b40e7c80bc2d3359fa47 /lib | |
parent | c2a08d28eb1199d67dff5b66061cf7f6a25d2527 (diff) | |
download | llvm-08510b14d4fe5d9b1a979fbee8a7aad11dbc6cea.tar.gz llvm-08510b14d4fe5d9b1a979fbee8a7aad11dbc6cea.tar.bz2 llvm-08510b14d4fe5d9b1a979fbee8a7aad11dbc6cea.tar.xz |
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!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169044 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/LLVMTargetMachine.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/Passes.cpp | 10 | ||||
-rw-r--r-- | lib/Transforms/Scalar/CodeGenPrepare.cpp | 75 |
3 files changed, 9 insertions, 78 deletions
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index 91ec038725..db2a54fcad 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -96,6 +96,8 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM, PassConfig->addIRPasses(); + PassConfig->addCodeGenPrepare(); + PassConfig->addPassesToHandleExceptions(); PassConfig->addISelPrepare(); diff --git a/lib/CodeGen/Passes.cpp b/lib/CodeGen/Passes.cpp index 526d994abb..36c60b415d 100644 --- a/lib/CodeGen/Passes.cpp +++ b/lib/CodeGen/Passes.cpp @@ -400,12 +400,16 @@ void TargetPassConfig::addPassesToHandleExceptions() { } } -/// Add common passes that perform LLVM IR to IR transforms in preparation for -/// instruction selection. -void TargetPassConfig::addISelPrepare() { +/// Add pass to prepare the LLVM IR for code generation. This should be done +/// before exception handling preparation passes. +void TargetPassConfig::addCodeGenPrepare() { if (getOptLevel() != CodeGenOpt::None && !DisableCGP) addPass(createCodeGenPreparePass(getTargetLowering())); +} +/// Add common passes that perform LLVM IR to IR transforms in preparation for +/// instruction selection. +void TargetPassConfig::addISelPrepare() { addPass(createStackProtectorPass(getTargetLowering())); addPreISel(); diff --git a/lib/Transforms/Scalar/CodeGenPrepare.cpp b/lib/Transforms/Scalar/CodeGenPrepare.cpp index c4df154529..61adb2dc12 100644 --- a/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/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<BasicBlock*, 8> WorkList; - SmallPtrSet<BasicBlock*, 8> LPadList; - SmallVector<BasicBlock*, 8> ReturnList; for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { SmallVector<BasicBlock*, 2> Successors(succ_begin(BB), succ_end(BB)); - if (BB->isLandingPad()) LPadList.insert(BB); - if (isa<ReturnInst>(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<BasicBlock*, 2> 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<Instruction*, 8> DeadInsts; - for (BasicBlock::iterator I = Entry.begin(), E = Entry.end(); - I != E; ++I) { - if (CallInst *CI = dyn_cast<CallInst>(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<BasicBlock*>::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<CallInst>(&*II)) { - Value *Callee = CI->getCalledValue(); - - if (Callee == UnregisterFn) { - DeadInsts.push_back(CI); - break; - } - } - } - } - - // Kill the dead instructions. - for (SmallVectorImpl<Instruction*>::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) |