Teach if-conversion about instructions that were already predicated, e.g. conditional...
authorEvan Cheng <evan.cheng@apple.com>
Fri, 6 Jul 2007 23:24:39 +0000 (23:24 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 6 Jul 2007 23:24:39 +0000 (23:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37964 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/IfConversion.cpp

index 64328d6e04f4a6866a4d9a8adea69f2e06ca4039..b05f6630ea75a51219fc1c604a02312e811ac5c6 100644 (file)
@@ -529,6 +529,7 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {
   if (BBI.IsDone)
     return;
 
+  bool AlreadyPredicated = BBI.Predicate.size() > 0;
   // First analyze the end of BB branches.
   BBI.TrueBB = BBI.FalseBB = NULL;
   BBI.BrCond.clear();
@@ -558,8 +559,18 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {
     bool isCondBr = BBI.IsBrAnalyzable &&
       (TID->Flags & M_BRANCH_FLAG) != 0 && (TID->Flags & M_BARRIER_FLAG) == 0;
 
-    if (!isPredicated && !isCondBr)
-      BBI.NonPredSize++;
+    if (!isCondBr) {
+      if (!isPredicated)
+        BBI.NonPredSize++;
+      else if (!AlreadyPredicated) {
+        // FIXME: This instruction is already predicated before the
+        // if-conversion pass. It's probably something like a conditional move.
+        // Mark this block unpredicable for now.
+        BBI.IsUnpredicable = true;
+        return;
+      }
+        
+    }
 
     if (BBI.ClobbersPred && !isPredicated) {
       // Predicate modification instruction should end the block (except for
@@ -572,7 +583,7 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {
       }
 
       // Predicate may have been modified, the subsequent (currently)
-      // unpredocated instructions cannot be correctly predicated.
+      // unpredicated instructions cannot be correctly predicated.
       BBI.IsUnpredicable = true;
       return;
     }