Correctly mark early-exit on the false path.
authorEvan Cheng <evan.cheng@apple.com>
Fri, 1 Jun 2007 20:29:21 +0000 (20:29 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 1 Jun 2007 20:29:21 +0000 (20:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37387 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/IfConversion.cpp

index 77604dd8bcf8be91a5016ff5d4ff4ac5cb092f19..9efceb08e56b530d0875aff22e443c4e32fe1362 100644 (file)
@@ -33,6 +33,7 @@ namespace {
       ICReAnalyze,     // BB must be re-analyzed.
       ICNotClassfied,  // BB data valid, but not classified.
       ICEarlyExit,     // BB is entry of an early-exit sub-CFG.
+      ICEarlyExitFalse,// Same as ICEarlyExit, but on the false path.
       ICTriangle,      // BB is entry of a triangle sub-CFG.
       ICDiamond,       // BB is entry of a diamond sub-CFG.
       ICChild,         // BB is part of the sub-CFG that'll be predicated.
@@ -151,6 +152,7 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
         // One or more of 'childrean' have been modified, abort!
         break;
       case ICEarlyExit:
+      case ICEarlyExitFalse:
         DOUT << "Ifcvt (Early exit): BB#" << BBI.BB->getNumber() << "\n";
         Change |= IfConvertEarlyExit(BBI);
         break;
@@ -239,7 +241,7 @@ void IfConverter::StructuralAnalysis(MachineBasicBlock *BB) {
     TrueBBI.Kind = ICChild;
   } else if (!(TrueBBI.hasEarlyExit && TrueNumPreds <= 1) &&
              (FalseBBI.hasEarlyExit && FalseNumPreds <=1)) {
-    BBI.Kind = ICEarlyExit;
+    BBI.Kind = ICEarlyExitFalse;
     FalseBBI.Kind = ICChild;
   } else if (TrueBBI.TrueBB && TrueBBI.TrueBB == BBI.FalseBB) {
     // Triangle:
@@ -335,6 +337,7 @@ bool IfConverter::AnalyzeBlocks(MachineFunction &MF,
       BBInfo &BBI = BBAnalysis[BB->getNumber()];
       switch (BBI.Kind) {
         case ICEarlyExit:
+        case ICEarlyExitFalse:
         case ICTriangle:
         case ICDiamond:
           Candidates.push_back(&BBI);
@@ -406,6 +409,8 @@ static void InsertUncondBranch(MachineBasicBlock *BB, MachineBasicBlock *ToBB,
 /// IfConvertEarlyExit - If convert a early exit sub-CFG.
 ///
 bool IfConverter::IfConvertEarlyExit(BBInfo &BBI) {
+  bool ReverseCond = BBI.Kind == ICEarlyExitFalse;
+
   BBI.Kind = ICNotClassfied;
 
   BBInfo &TrueBBI  = BBAnalysis[BBI.TrueBB->getNumber()];
@@ -413,15 +418,11 @@ bool IfConverter::IfConvertEarlyExit(BBInfo &BBI) {
   BBInfo *CvtBBI = &TrueBBI;
   BBInfo *NextBBI = &FalseBBI;
 
-  bool ReserveCond = false;
-  if (TrueBBI.Kind != ICChild) {
-    std::swap(CvtBBI, NextBBI);
-    ReserveCond = true;
-  }
-
   std::vector<MachineOperand> NewCond(BBI.BrCond);
-  if (ReserveCond)
+  if (ReverseCond) {
+    std::swap(CvtBBI, NextBBI);
     TII->ReverseBranchCondition(NewCond);
+  }
   FeasibilityAnalysis(*CvtBBI, NewCond);
   if (!CvtBBI->isPredicable)
     return false;