OSDN Git Service

ifcvt should ignore cfg where true and false successors are the same.
authorEvan Cheng <evan.cheng@apple.com>
Mon, 15 Jun 2009 21:24:34 +0000 (21:24 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 15 Jun 2009 21:24:34 +0000 (21:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73423 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/IfConversion.cpp
test/CodeGen/ARM/ifcvt9.ll [new file with mode: 0644]

index 1d0887f..4d5c3c2 100644 (file)
@@ -547,7 +547,11 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {
     // fallthrough.
     if (!BBI.FalseBB)
       BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB);  
-    assert(BBI.FalseBB && "Expected to find the fallthrough block!");
+    if (!BBI.FalseBB) {
+      // Malformed bcc? True and false blocks are the same?
+      BBI.IsUnpredicable = true;
+      return;
+    }
   }
 
   // Then scan all the instructions.
@@ -663,6 +667,13 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
     return BBI;
   }
 
+  // Do not ifcvt if true and false fallthrough blocks are the same.
+  if (!BBI.FalseBB) {
+    BBI.IsBeingAnalyzed = false;
+    BBI.IsAnalyzed = true;
+    return BBI;
+  }
+
   BBInfo &TrueBBI  = AnalyzeBlock(BBI.TrueBB, Tokens);
   BBInfo &FalseBBI = AnalyzeBlock(BBI.FalseBB, Tokens);
 
diff --git a/test/CodeGen/ARM/ifcvt9.ll b/test/CodeGen/ARM/ifcvt9.ll
new file mode 100644 (file)
index 0000000..bbd2f2e
--- /dev/null
@@ -0,0 +1,12 @@
+; RUN: llvm-as < %s | llc -march=arm
+
+define fastcc void @t() nounwind {
+entry:
+       br i1 undef, label %bb.i.i3, label %growMapping.exit
+
+bb.i.i3:               ; preds = %entry
+       unreachable
+
+growMapping.exit:              ; preds = %entry
+       unreachable
+}