Correctly mark early-exit on the false path.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37387 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/IfConversion.cpp b/lib/CodeGen/IfConversion.cpp
index 77604dd..9efceb0 100644
--- a/lib/CodeGen/IfConversion.cpp
+++ b/lib/CodeGen/IfConversion.cpp
@@ -33,6 +33,7 @@
       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 @@
         // 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 @@
     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 @@
       BBInfo &BBI = BBAnalysis[BB->getNumber()];
       switch (BBI.Kind) {
         case ICEarlyExit:
+        case ICEarlyExitFalse:
         case ICTriangle:
         case ICDiamond:
           Candidates.push_back(&BBI);
@@ -406,6 +409,8 @@
 /// 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 @@
   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;