[llvm-commits] [llvm] r173610 - Re-revert r173342, without losing the compile time improvements, flat

Chandler Carruth chandlerc at gmail.com
Sat Jan 26 22:42:03 PST 2013


Author: chandlerc
Date: Sun Jan 27 00:42:03 2013
New Revision: 173610

URL: http://llvm.org/viewvc/llvm-project?rev=173610&view=rev
Log:
Re-revert r173342, without losing the compile time improvements, flat
out bug fixes, or functionality preserving refactorings.

Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
    llvm/trunk/test/Transforms/SimplifyCFG/SpeculativeExec.ll

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=173610&r1=173609&r2=173610&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Sun Jan 27 00:42:03 2013
@@ -1369,8 +1369,7 @@ static bool SinkThenElseCodeToEnd(Branch
 /// \endcode
 ///
 /// \returns true if the conditional block is removed.
-static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
-                                   const TargetTransformInfo &TTI) {
+static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB) {
   // Be conservative for now. FP select instruction can often be expensive.
   Value *BrCond = BI->getCondition();
   if (isa<FCmpInst>(BrCond))
@@ -1406,24 +1405,15 @@ static bool SpeculativelyExecuteBB(Branc
 
     // Only speculatively execution a single instruction (not counting the
     // terminator) for now.
-    SpeculationCost += TTI.getUserCost(I);
-    if (SpeculationCost > TargetTransformInfo::TCC_Basic)
+    ++SpeculationCost;
+    if (SpeculationCost > 1)
       return false;
 
     // Don't hoist the instruction if it's unsafe or expensive.
     if (!isSafeToSpeculativelyExecute(I))
       return false;
-    // FIXME: These should really be cost metrics, but our cost model doesn't
-    // accurately model the expense of selects and floating point operations.
-    // FIXME: Is it really safe to speculate floating point operations?
-    // Signaling NaNs break with this, but we shouldn't care, right?
-    if (isa<SelectInst>(I) || I->getType()->isFPOrFPVectorTy())
-      return false;
-    // FIXME: The cost metric currently doesn't reason accurately about simple
-    // versus complex GEPs, take a conservative approach here.
-    if (GEPOperator *GEP = dyn_cast<GEPOperator>(I))
-      if (!GEP->hasAllConstantIndices())
-        return false;
+    if (ComputeSpeculationCost(I) > PHINodeFoldingThreshold)
+      return false;
 
     // Do not hoist the instruction if any of its operands are defined but not
     // used in this BB. The transformation will prevent the operand from
@@ -1446,8 +1436,8 @@ static bool SpeculativelyExecuteBB(Branc
            SinkCandidateUseCounts.begin(), E = SinkCandidateUseCounts.end();
        I != E; ++I)
     if (I->first->getNumUses() == I->second) {
-      SpeculationCost += TTI.getUserCost(I->first);
-      if (SpeculationCost > TargetTransformInfo::TCC_Basic)
+      ++SpeculationCost;
+      if (SpeculationCost > 1)
         return false;
     }
 
@@ -1469,20 +1459,15 @@ static bool SpeculativelyExecuteBB(Branc
 
     if (!isSafeToSpeculativelyExecute(CE))
       return false;
-
-    // Don't speculate into a select with a constant select expression operand.
-    // FIXME: This should really be a cost metric, but our cost model doesn't
-    // accurately model the expense of select.
-    if (Operator::getOpcode(CE) == Instruction::Select)
+    if (ComputeSpeculationCost(CE) > PHINodeFoldingThreshold)
       return false;
 
     // Account for the cost of an unfolded ConstantExpr which could end up
     // getting expanded into Instructions.
     // FIXME: This doesn't account for how many operations are combined in the
-    // constant expression. The cost functions in TTI don't yet correctly model
-    // constant expression costs.
-    SpeculationCost += TargetTransformInfo::TCC_Basic;
-    if (SpeculationCost > TargetTransformInfo::TCC_Basic)
+    // constant expression.
+    ++SpeculationCost;
+    if (SpeculationCost > 1)
       return false;
   }
 
@@ -3899,7 +3884,7 @@ bool SimplifyCFGOpt::SimplifyCondBranch(
       TerminatorInst *Succ0TI = BI->getSuccessor(0)->getTerminator();
       if (Succ0TI->getNumSuccessors() == 1 &&
           Succ0TI->getSuccessor(0) == BI->getSuccessor(1))
-        if (SpeculativelyExecuteBB(BI, BI->getSuccessor(0), TTI))
+        if (SpeculativelyExecuteBB(BI, BI->getSuccessor(0)))
           return SimplifyCFG(BB, TTI, TD) | true;
     }
   } else if (BI->getSuccessor(1)->getSinglePredecessor() != 0) {
@@ -3908,7 +3893,7 @@ bool SimplifyCFGOpt::SimplifyCondBranch(
     TerminatorInst *Succ1TI = BI->getSuccessor(1)->getTerminator();
     if (Succ1TI->getNumSuccessors() == 1 &&
         Succ1TI->getSuccessor(0) == BI->getSuccessor(0))
-      if (SpeculativelyExecuteBB(BI, BI->getSuccessor(1), TTI))
+      if (SpeculativelyExecuteBB(BI, BI->getSuccessor(1)))
         return SimplifyCFG(BB, TTI, TD) | true;
   }
 

Modified: llvm/trunk/test/Transforms/SimplifyCFG/SpeculativeExec.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/SpeculativeExec.ll?rev=173610&r1=173609&r2=173610&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/SpeculativeExec.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyCFG/SpeculativeExec.ll Sun Jan 27 00:42:03 2013
@@ -44,29 +44,6 @@ join:
   ret i8 %c
 }
 
-define i8* @test3(i1* %dummy, i8* %a, i8* %b) {
-; Test that a weird, unfolded constant cast in the PHI don't block speculation.
-; CHECK: @test3
-
-entry:
-  %cond1 = load volatile i1* %dummy
-  br i1 %cond1, label %if, label %end
-
-if:
-  %cond2 = load volatile i1* %dummy
-  br i1 %cond2, label %then, label %end
-
-then:
-  br label %end
-
-end:
-  %x = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 42 to i8*), %then ]
-; CHECK-NOT: phi
-; CHECK: select i1 %cond2, i8* inttoptr
-
-  ret i8* %x
-}
-
 define i8* @test4(i1* %dummy, i8* %a, i8* %b) {
 ; Test that we don't speculate an arbitrarily large number of unfolded constant
 ; expressions.
@@ -108,95 +85,3 @@ end:
 
   ret i8* %x10
 }
-
-define i16 @test5(i1* %dummy, i16 %a, i16 %b) {
-; Test that we speculate no-op instructions.
-; CHECK: @test5
-
-entry:
-  %cond1 = load volatile i1* %dummy
-  br i1 %cond1, label %if, label %end
-
-if:
-  %cond2 = load volatile i1* %dummy
-  %a.conv = sext i16 %a to i32
-  %b.conv = sext i16 %b to i32
-  %cmp = icmp ult i32 %a.conv, %b.conv
-  br i1 %cond2, label %then, label %end
-
-then:
-  %sub = sub i32 %a.conv, %b.conv
-  %sub.conv = trunc i32 %sub to i16
-  br label %end
-
-end:
-  %x = phi i16 [ %a, %entry ], [ %b, %if ], [ %sub.conv, %then ]
-; CHECK-NOT: phi
-; CHECK: select i1
-
-  ret i16 %x
-}
-
-define i16 @test6(i1* %dummy, i64 %a, i64 %b) {
-; Test that we speculate no-op instructions when those instructions are in the
-; predecessor but could potentially be sunk.
-; CHECK: @test6
-
-entry:
-  %cond1 = load volatile i1* %dummy
-  %a.conv = trunc i64 %a to i16
-  %b.conv = trunc i64 %b to i16
-  br i1 %cond1, label %if, label %end
-
-if:
-  %cond2 = load volatile i1* %dummy
-  %cond3 = load volatile i1* %dummy
-  %cond4 = load volatile i1* %dummy
-  %cmp = icmp ult i16 %a.conv, %b.conv
-  %a.conv2 = trunc i64 %a to i32
-  %b.conv2 = trunc i64 %b to i32
-  br i1 %cond2, label %then, label %end
-
-then:
-  %sub = sub i32 %a.conv2, %b.conv2
-  %sub.conv = trunc i32 %sub to i16
-  br label %end
-
-end:
-  %x = phi i16 [ %a.conv, %entry ], [ %b.conv, %if ], [ %sub.conv, %then ]
-; CHECK-NOT: phi
-; CHECK: select i1
-
-  ret i16 %x
-}
-
-define i16 @test7(i1* %dummy, i16 %a, i16 %b, i32 %x) {
-; Test that we don't speculate when there are instructions that could
-; potentially sink into the conditional block.
-; CHECK: @test7
-
-entry:
-  %cond1 = load volatile i1* %dummy
-  br i1 %cond1, label %if, label %end
-
-if:
-  %cond2 = load volatile i1* %dummy
-  %a.conv = sext i16 %a to i32
-  %b.conv = sext i16 %b to i32
-  %cmp = icmp ult i32 %a.conv, %b.conv
-  %a.conv2 = add i32 %a.conv, %x
-  br i1 %cond2, label %then, label %end
-
-then:
-  %sub = sub i32 %a.conv2, %b.conv
-  %sub.conv = trunc i32 %sub to i16
-  br label %end
-
-end:
-  %y = phi i16 [ %a, %entry ], [ %b, %if ], [ %sub.conv, %then ]
-; CHECK-NOT: select
-; CHECK: phi i16
-
-  ret i16 %y
-}
-





More information about the llvm-commits mailing list