[llvm-commits] CVS: llvm/lib/Transforms/Utils/CodeExtractor.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue May 11 22:22:01 PDT 2004


Changes in directory llvm/lib/Transforms/Utils:

CodeExtractor.cpp updated: 1.17 -> 1.18

---
Log message:

Two minor improvements:
  1. Get rid of the silly abort block.  When doing bb extraction, we get one 
     abort block for every block extracted, which is kinda annoying.
  2. If the switch ends up having a single destination, turn it into an
     unconditional branch.

I would like to add support for conditional branches, but to do this we will
want to have the function return a bool instead of a ushort.


---
Diffs of the changes:  (+14 -18)

Index: llvm/lib/Transforms/Utils/CodeExtractor.cpp
diff -u llvm/lib/Transforms/Utils/CodeExtractor.cpp:1.17 llvm/lib/Transforms/Utils/CodeExtractor.cpp:1.18
--- llvm/lib/Transforms/Utils/CodeExtractor.cpp:1.17	Fri Apr 23 18:54:17 2004
+++ llvm/lib/Transforms/Utils/CodeExtractor.cpp	Tue May 11 22:22:33 2004
@@ -390,24 +390,20 @@
       }
   }
 
-  // Now that we've done the deed, make the default destination of the switch
-  // instruction be a block with a call to abort() -- since this path should not
-  // be taken, this will abort sooner rather than later.
-  if (TheSwitch->getNumSuccessors() > 1) {
-    Function *container = codeReplacer->getParent();
-    BasicBlock *abortBB = new BasicBlock("abortBlock", container);
-    std::vector<const Type*> paramTypes;
-    FunctionType *abortTy = FunctionType::get(Type::VoidTy, paramTypes, false);
-    Function *abortFunc = 
-      container->getParent()->getOrInsertFunction("abort", abortTy);
-    abortBB->getInstList().push_back(new CallInst(abortFunc));
-    Function *ParentFunc = TheSwitch->getParent()->getParent();
-    if (ParentFunc->getReturnType() == Type::VoidTy)
-      new ReturnInst(0, abortBB);
-    else
-      new ReturnInst(Constant::getNullValue(ParentFunc->getReturnType()),
-                     abortBB);
-    TheSwitch->setSuccessor(0, abortBB);
+  // Now that we've done the deed, simplify the switch instruction.
+  unsigned NumSuccs = TheSwitch->getNumSuccessors();
+  if (NumSuccs > 1) {
+    if (NumSuccs-1 == 1) {
+      // Only a single destination, change the switch into an unconditional
+      // branch.
+      new BranchInst(TheSwitch->getSuccessor(1), TheSwitch);
+      TheSwitch->getParent()->getInstList().erase(TheSwitch);
+    } else {
+      // Otherwise, make the default destination of the switch instruction be
+      // one of the other successors.
+      TheSwitch->setSuccessor(0, TheSwitch->getSuccessor(NumSuccs-1));
+      TheSwitch->removeCase(NumSuccs-1);  // Remove redundant case
+    }    
   } else {
     // There is only 1 successor (the block containing the switch itself), which
     // means that previously this was the last part of the function, and hence





More information about the llvm-commits mailing list