Eliminate SimplifyCFG.h file, pull everything into the UnifyMethodExitNodes class
authorChris Lattner <sabre@nondot.org>
Thu, 31 Jan 2002 01:12:06 +0000 (01:12 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 31 Jan 2002 01:12:06 +0000 (01:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1613 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h
lib/Transforms/Utils/UnifyFunctionExitNodes.cpp

index 09394685c1e86bcd4573427b4dceb7f62330568e..64dc03c98589c8bf5d852cc39494de32b238c312 100644 (file)
@@ -10,7 +10,6 @@
 #define LLVM_XFORMS_UNIFY_METHOD_EXIT_NODES_H
 
 #include "llvm/Pass.h"
-#include "llvm/Analysis/SimplifyCFG.h"   // FIXME!!
 
 struct UnifyMethodExitNodes : public MethodPass {
   BasicBlock *ExitNode;
@@ -18,10 +17,17 @@ public:
   static AnalysisID ID;            // Pass ID
   UnifyMethodExitNodes(AnalysisID id) : ExitNode(0) { assert(ID == id); }
 
-  virtual bool runOnMethod(Method *M) {
-    ExitNode = cfg::UnifyAllExitNodes(M);
+  // UnifyAllExitNodes - Unify all exit nodes of the CFG by creating a new
+  // BasicBlock, and converting all returns to unconditional branches to this
+  // new basic block.  The singular exit node is returned in ExitNode.
+  //
+  // If there are no return stmts in the Method, a null pointer is returned.
+  //
+  static bool doit(Method *M, BasicBlock *&ExitNode);
+
 
-    return true; // FIXME: This should return a correct code!!!
+  virtual bool runOnMethod(Method *M) {
+    return doit(M, ExitNode);
   }
 
   BasicBlock *getExitNode() const { return ExitNode; }
index 4716e7ebcd8c6376669a82fa5804c6626d6e52d0..15e37e399335bff3811d56a64f833ac3d9f1a5de 100644 (file)
@@ -5,7 +5,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/Analysis/SimplifyCFG.h"
 #include "llvm/Transforms/UnifyMethodExitNodes.h"
 #include "llvm/BasicBlock.h"
 #include "llvm/Method.h"
@@ -23,7 +22,7 @@ AnalysisID UnifyMethodExitNodes::ID(AnalysisID::create<UnifyMethodExitNodes>());
 //
 // If there are no return stmts in the Method, a null pointer is returned.
 //
-BasicBlock *cfg::UnifyAllExitNodes(Method *M) {
+bool UnifyMethodExitNodes::doit(Method *M, BasicBlock *&ExitNode) {
   vector<BasicBlock*> ReturningBlocks;
 
   // Loop over all of the blocks in a method, tracking all of the blocks that
@@ -33,16 +32,19 @@ BasicBlock *cfg::UnifyAllExitNodes(Method *M) {
     if ((*I)->getTerminator()->getOpcode() == Instruction::Ret)
       ReturningBlocks.push_back(*I);
 
-  if (ReturningBlocks.size() == 0) 
-    return 0;                          // No blocks return
-  else if (ReturningBlocks.size() == 1)
-    return ReturningBlocks.front();    // Already has a single return block
+  if (ReturningBlocks.size() == 0) {
+    ExitNode = 0;
+    return false;                      // No blocks return
+  } else if (ReturningBlocks.size() == 1) {
+    ExitNode = ReturningBlocks.front();    // Already has a single return block
+    return false;
+  }
 
   // Otherwise, we need to insert a new basic block into the method, add a PHI
   // node (if the function returns a value), and convert all of the return 
   // instructions into unconditional branches.
   //
-  BasicBlock *NewRetBlock = new BasicBlock("", M);
+  BasicBlock *NewRetBlock = new BasicBlock("UnifiedExitNode", M);
 
   if (M->getReturnType() != Type::VoidTy) {
     // If the method doesn't return void... add a PHI node to the block...
@@ -70,5 +72,6 @@ BasicBlock *cfg::UnifyAllExitNodes(Method *M) {
     delete (*I)->getInstList().pop_back();  // Remove the return insn
     (*I)->getInstList().push_back(new BranchInst(NewRetBlock));
   }
-  return NewRetBlock;
+  ExitNode = NewRetBlock;
+  return true;
 }