[llvm-commits] CVS: llvm/lib/CodeGen/IfConversion.cpp

Evan Cheng evan.cheng at apple.com
Tue Jun 5 19:10:26 PDT 2007



Changes in directory llvm/lib/CodeGen:

IfConversion.cpp updated: 1.31 -> 1.32
---
Log message:

If a unconditional branch is added to branch to the false path during ifcvt, the predicated block cannot be iteratively ifcvted.

---
Diffs of the changes:  (+33 -6)

 IfConversion.cpp |   39 +++++++++++++++++++++++++++++++++------
 1 files changed, 33 insertions(+), 6 deletions(-)


Index: llvm/lib/CodeGen/IfConversion.cpp
diff -u llvm/lib/CodeGen/IfConversion.cpp:1.31 llvm/lib/CodeGen/IfConversion.cpp:1.32
--- llvm/lib/CodeGen/IfConversion.cpp:1.31	Tue Jun  5 20:12:44 2007
+++ llvm/lib/CodeGen/IfConversion.cpp	Tue Jun  5 21:08:52 2007
@@ -165,8 +165,8 @@
         RetVal = IfConvertSimple(BBI);
         DOUT << (RetVal ? "succeeded!" : "failed!") << "\n";
         if (RetVal)
-          if (isRev) NumSimple++;
-          else       NumSimpleRev++;
+          if (isRev) NumSimpleRev++;
+          else       NumSimple++;
        break;
       }
       case ICTriangle:
@@ -515,12 +515,25 @@
   // to the 'false' branch.
   BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
   MergeBlocks(BBI, *CvtBBI);
-  if (!isNextBlock(BBI.BB, NextBBI->BB))
+  bool IterIfcvt = true;
+  if (!isNextBlock(BBI.BB, NextBBI->BB)) {
+    // Now ifcvt'd block will look like this:
+    // BB:
+    // ...
+    // t, f = cmp
+    // if t op
+    // b BBf
+    //
+    // We cannot further ifcvt this block because the unconditional branch will
+    // have to be predicated on the new condition, that will not be available
+    // if cmp executes.
     InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
+  }
   std::copy(Cond.begin(), Cond.end(), std::back_inserter(BBI.Predicate));
 
   // Update block info. BB can be iteratively if-converted.
-  BBI.Kind = ICReAnalyze;
+  if (IterIfcvt)
+    BBI.Kind = ICReAnalyze;
   ReTryPreds(BBI.BB);
   CvtBBI->Kind = ICDead;
 
@@ -552,11 +565,24 @@
   // predecessors. Otherwise, add a unconditional branch from 'true' to 'false'.
   BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
   bool FalseBBDead = false;
+  bool IterIfcvt = true;
   if (!HasEarlyExit && FalseBBI.BB->pred_size() == 2) {
     MergeBlocks(TrueBBI, FalseBBI);
     FalseBBDead = true;
-  } else if (!isNextBlock(TrueBBI.BB, FalseBBI.BB))
+  } else if (!isNextBlock(TrueBBI.BB, FalseBBI.BB)) {
     InsertUncondBranch(TrueBBI.BB, FalseBBI.BB, TII);
+    // Now ifcvt'd block will look like this:
+    // BB:
+    // ...
+    // t, f = cmp
+    // if t op
+    // b BBf
+    //
+    // We cannot further ifcvt this block because the unconditional branch will
+    // have to be predicated on the new condition, that will not be available
+    // if cmp executes.
+    IterIfcvt = false;
+  }
 
   // Now merge the entry of the triangle with the true block.
   BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
@@ -565,7 +591,8 @@
             std::back_inserter(BBI.Predicate));
 
   // Update block info. BB can be iteratively if-converted.
-  BBI.Kind = ICReAnalyze;
+  if (IterIfcvt) 
+    BBI.Kind = ICReAnalyze;
   ReTryPreds(BBI.BB);
   TrueBBI.Kind = ICDead;
   if (FalseBBDead)






More information about the llvm-commits mailing list