[llvm-commits] [llvm] r53528 - /llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp

Chris Lattner sabre at nondot.org
Sun Jul 13 14:20:20 PDT 2008


Author: lattner
Date: Sun Jul 13 16:20:19 2008
New Revision: 53528

URL: http://llvm.org/viewvc/llvm-project?rev=53528&view=rev
Log:
Final bit of simplification for FoldBranchToCommonDest.

Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=53528&r1=53527&r2=53528&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Sun Jul 13 16:20:19 2008
@@ -1460,13 +1460,25 @@
         !SafeToMergeTerminators(BI, PBI))
       continue;
     
-    // Canonicalize the predecessors condition (inverting it) if needed to allow
-    // this xform to trigger.
-    if (PBI->getSuccessor(0) == FalseDest ||
-        PBI->getSuccessor(1) == TrueDest) {
+    Instruction::BinaryOps Opc;
+    bool InvertPredCond = false;
+
+    if (PBI->getSuccessor(0) == TrueDest)
+      Opc = Instruction::Or;
+    else if (PBI->getSuccessor(1) == FalseDest)
+      Opc = Instruction::And;
+    else if (PBI->getSuccessor(0) == FalseDest)
+      Opc = Instruction::And, InvertPredCond = true;
+    else if (PBI->getSuccessor(1) == TrueDest)
+      Opc = Instruction::Or, InvertPredCond = true;
+    else
+      continue;
+
+    // If we need to invert the condition in the pred block to match, do so now.
+    if (InvertPredCond) {
       Value *NewCond =
         BinaryOperator::CreateNot(PBI->getCondition(),
-                        PBI->getCondition()->getName()+".not", PBI);
+                                  PBI->getCondition()->getName()+".not", PBI);
       PBI->setCondition(NewCond);
       BasicBlock *OldTrue = PBI->getSuccessor(0);
       BasicBlock *OldFalse = PBI->getSuccessor(1);
@@ -1474,34 +1486,25 @@
       PBI->setSuccessor(1, OldTrue);
     }
     
-    Instruction::BinaryOps Opc = Instruction::Shl; // sentinel.
+    // Clone Cond into the predecessor basic block, and or/and the
+    // two conditions together.
+    Instruction *New = Cond->clone();
+    PredBlock->getInstList().insert(PBI, New);
+    New->takeName(Cond);
+    Cond->setName(New->getName()+".old");
     
-    if (PBI->getSuccessor(0) == TrueDest && FalseDest != BB)
-      Opc = Instruction::Or;
-    else if (PBI->getSuccessor(1) == FalseDest && TrueDest != BB)
-      Opc = Instruction::And;
-
-    if (Opc != Instruction::Shl) {
-      // Clone Cond into the predecessor basic block, and or/and the
-      // two conditions together.
-      Instruction *New = Cond->clone();
-      PredBlock->getInstList().insert(PBI, New);
-      New->takeName(Cond);
-      Cond->setName(New->getName()+".old");
-      
-      Value *NewCond = BinaryOperator::Create(Opc, PBI->getCondition(),
-                                              New, "or.cond", PBI);
-      PBI->setCondition(NewCond);
-      if (PBI->getSuccessor(0) == BB) {
-        AddPredecessorToBlock(TrueDest, PredBlock, BB);
-        PBI->setSuccessor(0, TrueDest);
-      }
-      if (PBI->getSuccessor(1) == BB) {
-        AddPredecessorToBlock(FalseDest, PredBlock, BB);
-        PBI->setSuccessor(1, FalseDest);
-      }
-      return true;
+    Value *NewCond = BinaryOperator::Create(Opc, PBI->getCondition(),
+                                            New, "or.cond", PBI);
+    PBI->setCondition(NewCond);
+    if (PBI->getSuccessor(0) == BB) {
+      AddPredecessorToBlock(TrueDest, PredBlock, BB);
+      PBI->setSuccessor(0, TrueDest);
+    }
+    if (PBI->getSuccessor(1) == BB) {
+      AddPredecessorToBlock(FalseDest, PredBlock, BB);
+      PBI->setSuccessor(1, FalseDest);
     }
+    return true;
   }
   return false;
 }
@@ -1742,7 +1745,6 @@
       if (FoldBranchToCommonDest(BI))
         return SimplifyCFG(BB) | 1;
 
-
       // Scan predessor blocks for conditional branches.
       for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
         if (BranchInst *PBI = dyn_cast<BranchInst>((*PI)->getTerminator()))





More information about the llvm-commits mailing list