Replace r168930 with a more reasonable patch.
authorBill Wendling <isanbard@gmail.com>
Fri, 30 Nov 2012 22:08:55 +0000 (22:08 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 30 Nov 2012 22:08:55 +0000 (22:08 +0000)
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

include/llvm/CodeGen/Passes.h
lib/CodeGen/LLVMTargetMachine.cpp
lib/CodeGen/Passes.cpp
lib/Transforms/Scalar/CodeGenPrepare.cpp

index 44c9676b2ce4a336488cc3928588b0956ad44507..282e4edcfb441d5cc58b9a12b4bc51a80ac38ad7 100644 (file)
@@ -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();
index 91ec0387250c67f79e30d1cc356a2a5f262080dc..db2a54fcad49be0c41761e42857cbfba7f31886f 100644 (file)
@@ -96,6 +96,8 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,
 
   PassConfig->addIRPasses();
 
+  PassConfig->addCodeGenPrepare();
+
   PassConfig->addPassesToHandleExceptions();
 
   PassConfig->addISelPrepare();
index 526d994abbc71b7f255e7c2431fdee9ab3090707..36c60b415de268bfee5c8a5810e82ca56231f388 100644 (file)
@@ -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();
index c4df15452998a6b99ef7b7e49a859ed6516ce81e..61adb2dc12bd8f7322335c8383e25d7732137d22 100644 (file)
@@ -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)