From: Matt Arsenault Date: Tue, 2 May 2017 18:02:18 +0000 (+0000) Subject: SpeculativeExecution: Stop using whitelist for costs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5c80457142ce4d9048673907b726d938e9bedb36;p=llvm SpeculativeExecution: Stop using whitelist for costs Just let TTI's cost do this instead of arbitrarily restricting this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301950 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/SpeculativeExecution.cpp b/lib/Transforms/Scalar/SpeculativeExecution.cpp index a7c308b5987..a0fc966cee2 100644 --- a/lib/Transforms/Scalar/SpeculativeExecution.cpp +++ b/lib/Transforms/Scalar/SpeculativeExecution.cpp @@ -208,47 +208,6 @@ bool SpeculativeExecutionPass::runOnBasicBlock(BasicBlock &B) { 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 NotHoisted; @@ -264,7 +223,7 @@ bool SpeculativeExecutionPass::considerHoistingFromTo( unsigned TotalSpeculationCost = 0; for (auto& I : FromBlock) { - const unsigned Cost = ComputeSpeculationCost(&I, *TTI); + const unsigned Cost = TTI->getUserCost(&I); if (Cost != UINT_MAX && isSafeToSpeculativelyExecute(&I) && AllPrecedingUsesFromBlockHoisted(&I)) { TotalSpeculationCost += Cost; diff --git a/test/Transforms/SpeculativeExecution/spec-other.ll b/test/Transforms/SpeculativeExecution/spec-other.ll new file mode 100644 index 00000000000..65e14b69e9e --- /dev/null +++ b/test/Transforms/SpeculativeExecution/spec-other.ll @@ -0,0 +1,32 @@ +; 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 +} + diff --git a/test/Transforms/SpeculativeExecution/spec-vector.ll b/test/Transforms/SpeculativeExecution/spec-vector.ll new file mode 100644 index 00000000000..9c64f1fb100 --- /dev/null +++ b/test/Transforms/SpeculativeExecution/spec-vector.ll @@ -0,0 +1,73 @@ +; 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 +}