isUnpredicatedTerminator should treat conditional branches as unpredicated terminator.
authorEvan Cheng <evan.cheng@apple.com>
Fri, 6 Jul 2007 23:22:03 +0000 (23:22 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 6 Jul 2007 23:22:03 +0000 (23:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37960 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/TargetInstrInfo.cpp
lib/Target/X86/X86InstrInfo.cpp

index 9e706cdcfe640b0a40fc9584ffa373ae02f3602b..11b5b635db4cf4e344f8a1d4161b2b43758c3025 100644 (file)
@@ -88,9 +88,12 @@ bool TargetInstrInfo::PredicateInstruction(MachineInstr *MI,
 bool TargetInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
   const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
   if (TID->Flags & M_TERMINATOR_FLAG) {
+    // Conditional branch is a special case.
+    if ((TID->Flags & M_BRANCH_FLAG) != 0 && (TID->Flags & M_BARRIER_FLAG) == 0)
+      return true;
     if ((TID->Flags & M_PREDICABLE) == 0)
       return true;
     return !isPredicated(MI);
-}
+  }
   return false;
 }
index 200ed45bb48cc370646fce25eb5c9bb0b691c016..06b14fe1c40fbbd53a42a981b05409400f904059 100644 (file)
@@ -404,11 +404,18 @@ X86::CondCode X86::GetOppositeBranchCondition(X86::CondCode CC) {
 
 // For purposes of branch analysis do not count FP_REG_KILL as a terminator.
 bool X86InstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
-  const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
   if (MI->getOpcode() == X86::FP_REG_KILL)
     return false;
-  if (TID->Flags & M_TERMINATOR_FLAG)
+
+  const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
+  if (TID->Flags & M_TERMINATOR_FLAG) {
+    // Conditional branch is a special case.
+    if ((TID->Flags & M_BRANCH_FLAG) != 0 && (TID->Flags & M_BARRIER_FLAG) == 0)
+      return true;
+    if ((TID->Flags & M_PREDICABLE) == 0)
+      return true;
     return !isPredicated(MI);
+  }
   return false;
 }