aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-11-30 22:08:55 +0000
committerBill Wendling <isanbard@gmail.com>2012-11-30 22:08:55 +0000
commit08510b14d4fe5d9b1a979fbee8a7aad11dbc6cea (patch)
treebffe39f76d8df42d0557b40e7c80bc2d3359fa47
parentc2a08d28eb1199d67dff5b66061cf7f6a25d2527 (diff)
downloadexternal_llvm-08510b14d4fe5d9b1a979fbee8a7aad11dbc6cea.zip
external_llvm-08510b14d4fe5d9b1a979fbee8a7aad11dbc6cea.tar.gz
external_llvm-08510b14d4fe5d9b1a979fbee8a7aad11dbc6cea.tar.bz2
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
-rw-r--r--include/llvm/CodeGen/Passes.h4
-rw-r--r--lib/CodeGen/LLVMTargetMachine.cpp2
-rw-r--r--lib/CodeGen/Passes.cpp10
-rw-r--r--lib/Transforms/Scalar/CodeGenPrepare.cpp75
4 files changed, 13 insertions, 78 deletions
diff --git a/include/llvm/CodeGen/Passes.h b/include/llvm/CodeGen/Passes.h
index 44c9676..282e4ed 100644
--- a/include/llvm/CodeGen/Passes.h
+++ b/include/llvm/CodeGen/Passes.h
@@ -141,6 +141,10 @@ public:
/// Add passes to lower exception handling for the code generator.
void addPassesToHandleExceptions();
+ /// Add pass to prepare the LLVM IR for code generation. This should be done
+ /// before exception handling preparation passes.
+ virtual void addCodeGenPrepare();
+
/// Add common passes that perform LLVM IR to IR transforms in preparation for
/// instruction selection.
virtual void addISelPrepare();
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp
index 91ec038..db2a54f 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 526d994..36c60b4 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 c4df154..61adb2d 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)