[llvm] r302640 - Revert r301950: SpeculativeExecution: Stop using whitelist for costs

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Wed May 10 05:30:07 PDT 2017


Author: chandlerc
Date: Wed May 10 07:30:07 2017
New Revision: 302640

URL: http://llvm.org/viewvc/llvm-project?rev=302640&view=rev
Log:
Revert r301950: SpeculativeExecution: Stop using whitelist for costs

This pass doesn't correctly handle testing for when it is legal to hoist
arbitrary instructions. The whitelist happens to make it safe, so before
it is removed the pass's legality checks will need to be enhanced.

Details have been added to the code review thread for the patch.

Removed:
    llvm/trunk/test/Transforms/SpeculativeExecution/spec-other.ll
    llvm/trunk/test/Transforms/SpeculativeExecution/spec-vector.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/SpeculativeExecution.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/SpeculativeExecution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SpeculativeExecution.cpp?rev=302640&r1=302639&r2=302640&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SpeculativeExecution.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SpeculativeExecution.cpp Wed May 10 07:30:07 2017
@@ -208,6 +208,47 @@ bool SpeculativeExecutionPass::runOnBasi
   return false;
 }
 
+static unsigned ComputeSpeculationCost(const Instruction *I,
+                                       const TargetTransformInfo &TTI) {
+  switch (Operator::getOpcode(I)) {
+    case Instruction::GetElementPtr:
+    case Instruction::Add:
+    case Instruction::Mul:
+    case Instruction::And:
+    case Instruction::Or:
+    case Instruction::Select:
+    case Instruction::Shl:
+    case Instruction::Sub:
+    case Instruction::LShr:
+    case Instruction::AShr:
+    case Instruction::Xor:
+    case Instruction::ZExt:
+    case Instruction::SExt:
+    case Instruction::Call:
+    case Instruction::BitCast:
+    case Instruction::PtrToInt:
+    case Instruction::IntToPtr:
+    case Instruction::AddrSpaceCast:
+    case Instruction::FPToUI:
+    case Instruction::FPToSI:
+    case Instruction::UIToFP:
+    case Instruction::SIToFP:
+    case Instruction::FPExt:
+    case Instruction::FPTrunc:
+    case Instruction::FAdd:
+    case Instruction::FSub:
+    case Instruction::FMul:
+    case Instruction::FDiv:
+    case Instruction::FRem:
+    case Instruction::ICmp:
+    case Instruction::FCmp:
+      return TTI.getUserCost(I);
+
+    default:
+      return UINT_MAX; // Disallow anything not whitelisted.
+  }
+}
+
 bool SpeculativeExecutionPass::considerHoistingFromTo(
     BasicBlock &FromBlock, BasicBlock &ToBlock) {
   SmallSet<const Instruction *, 8> NotHoisted;
@@ -223,7 +264,7 @@ bool SpeculativeExecutionPass::considerH
 
   unsigned TotalSpeculationCost = 0;
   for (auto& I : FromBlock) {
-    const unsigned Cost = TTI->getUserCost(&I);
+    const unsigned Cost = ComputeSpeculationCost(&I, *TTI);
     if (Cost != UINT_MAX && isSafeToSpeculativelyExecute(&I) &&
         AllPrecedingUsesFromBlockHoisted(&I)) {
       TotalSpeculationCost += Cost;

Removed: llvm/trunk/test/Transforms/SpeculativeExecution/spec-other.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SpeculativeExecution/spec-other.ll?rev=302639&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SpeculativeExecution/spec-other.ll (original)
+++ llvm/trunk/test/Transforms/SpeculativeExecution/spec-other.ll (removed)
@@ -1,32 +0,0 @@
-; RUN: opt < %s -S -speculative-execution \
-; RUN:   -spec-exec-max-speculation-cost 4 -spec-exec-max-not-hoisted 3 \
-; RUN:   | FileCheck %s
-
-; CHECK-LABEL: @ifThen_extractvalue(
-; CHECK: extractvalue
-; CHECK: br i1 true
-define void @ifThen_extractvalue() {
-  br i1 true, label %a, label %b
-
-a:
-  %x = extractvalue { i32, i32 } undef, 0
-  br label %b
-
-b:
-  ret void
-}
-
-; CHECK-LABEL: @ifThen_insertvalue(
-; CHECK: insertvalue
-; CHECK: br i1 true
-define void @ifThen_insertvalue() {
-  br i1 true, label %a, label %b
-
-a:
-  %x = insertvalue { i32, i32 } undef, i32 undef, 0
-  br label %b
-
-b:
-  ret void
-}
-

Removed: llvm/trunk/test/Transforms/SpeculativeExecution/spec-vector.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SpeculativeExecution/spec-vector.ll?rev=302639&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SpeculativeExecution/spec-vector.ll (original)
+++ llvm/trunk/test/Transforms/SpeculativeExecution/spec-vector.ll (removed)
@@ -1,73 +0,0 @@
-; RUN: opt < %s -S -speculative-execution \
-; RUN:   -spec-exec-max-speculation-cost 4 -spec-exec-max-not-hoisted 3 \
-; RUN:   | FileCheck %s
-
-; CHECK-LABEL: @ifThen_extractelement_constindex(
-; CHECK: extractelement
-; CHECK: br i1 true
-define void @ifThen_extractelement_constindex() {
-  br i1 true, label %a, label %b
-
-a:
-  %x = extractelement <4 x i32> undef, i32 0
-  br label %b
-
-b:
-  ret void
-}
-
-; CHECK-LABEL: @ifThen_extractelement_varindex(
-; CHECK: extractelement
-; CHECK: br i1 true
-define void @ifThen_extractelement_varindex(i32 %idx) {
-  br i1 true, label %a, label %b
-
-a:
-  %x = extractelement <4 x i32> undef, i32 %idx
-  br label %b
-
-b:
-  ret void
-}
-
-; CHECK-LABEL: @ifThen_insertelement_constindex(
-; CHECK: insertelement
-; CHECK: br i1 true
-define void @ifThen_insertelement_constindex() {
-  br i1 true, label %a, label %b
-
-a:
-  %x = insertelement <4 x i32> undef, i32 undef, i32 0
-  br label %b
-
-b:
-  ret void
-}
-
-; CHECK-LABEL: @ifThen_insertelement_varindex(
-; CHECK: insertelement
-; CHECK: br i1 true
-define void @ifThen_insertelement_varindex(i32 %idx) {
-  br i1 true, label %a, label %b
-
-a:
-  %x = insertelement <4 x i32> undef, i32 undef, i32 %idx
-  br label %b
-
-b:
-  ret void
-}
-
-; CHECK-LABEL: @ifThen_shufflevector(
-; CHECK: shufflevector
-; CHECK: br i1 true
-define void @ifThen_shufflevector() {
-  br i1 true, label %a, label %b
-
-a:
-  %x = shufflevector <4 x i32> undef, <4 x i32> undef, <4 x i32> undef
-  br label %b
-
-b:
-  ret void
-}




More information about the llvm-commits mailing list