forked from OSchip/llvm-project
SpeculativeExecution: Stop using whitelist for costs
Just let TTI's cost do this instead of arbitrarily restricting this. llvm-svn: 301950
This commit is contained in:
parent
49f7e0a98b
commit
9ac7d6be3c
|
@ -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<const Instruction *, 8> 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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue