forked from OSchip/llvm-project
[CostModel] Sink intrinsic costs to base TTI.
Recommitting part of "[CostModel] Unify Intrinsic Costs."
de71def3f5
Move the switch statement from TTImpl::getIntrinsicCost to
TTI::getIntrinsicInstrCost. This enables BasicTTI to understand
more 'free' intrinsics instead of defaulting to a cost of 1.
Differential Revision: https://reviews.llvm.org/D80012
This commit is contained in:
parent
259eb619ff
commit
b263fee4d2
|
@ -462,6 +462,39 @@ public:
|
||||||
|
|
||||||
unsigned getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
|
unsigned getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
|
||||||
TTI::TargetCostKind CostKind) {
|
TTI::TargetCostKind CostKind) {
|
||||||
|
switch (ICA.getID()) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case Intrinsic::annotation:
|
||||||
|
case Intrinsic::assume:
|
||||||
|
case Intrinsic::sideeffect:
|
||||||
|
case Intrinsic::dbg_declare:
|
||||||
|
case Intrinsic::dbg_value:
|
||||||
|
case Intrinsic::dbg_label:
|
||||||
|
case Intrinsic::invariant_start:
|
||||||
|
case Intrinsic::invariant_end:
|
||||||
|
case Intrinsic::launder_invariant_group:
|
||||||
|
case Intrinsic::strip_invariant_group:
|
||||||
|
case Intrinsic::is_constant:
|
||||||
|
case Intrinsic::lifetime_start:
|
||||||
|
case Intrinsic::lifetime_end:
|
||||||
|
case Intrinsic::objectsize:
|
||||||
|
case Intrinsic::ptr_annotation:
|
||||||
|
case Intrinsic::var_annotation:
|
||||||
|
case Intrinsic::experimental_gc_result:
|
||||||
|
case Intrinsic::experimental_gc_relocate:
|
||||||
|
case Intrinsic::coro_alloc:
|
||||||
|
case Intrinsic::coro_begin:
|
||||||
|
case Intrinsic::coro_free:
|
||||||
|
case Intrinsic::coro_end:
|
||||||
|
case Intrinsic::coro_frame:
|
||||||
|
case Intrinsic::coro_size:
|
||||||
|
case Intrinsic::coro_suspend:
|
||||||
|
case Intrinsic::coro_param:
|
||||||
|
case Intrinsic::coro_subfn_addr:
|
||||||
|
// These intrinsics don't actually represent code after lowering.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -741,47 +774,16 @@ public:
|
||||||
|
|
||||||
unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
||||||
ArrayRef<Type *> ParamTys, const User *U,
|
ArrayRef<Type *> ParamTys, const User *U,
|
||||||
TTI::TargetCostKind TCK_SizeAndLatency) {
|
TTI::TargetCostKind CostKind) {
|
||||||
switch (IID) {
|
switch (IID) {
|
||||||
default:
|
default:
|
||||||
// Intrinsics rarely (if ever) have normal argument setup constraints.
|
break;
|
||||||
// Model them as having a basic instruction cost.
|
|
||||||
return TTI::TCC_Basic;
|
|
||||||
|
|
||||||
// TODO: other libc intrinsics.
|
// TODO: other libc intrinsics.
|
||||||
case Intrinsic::memcpy:
|
case Intrinsic::memcpy:
|
||||||
return static_cast<T *>(this)->getMemcpyCost(dyn_cast<Instruction>(U));
|
return static_cast<T *>(this)->getMemcpyCost(dyn_cast<Instruction>(U));
|
||||||
|
|
||||||
case Intrinsic::annotation:
|
|
||||||
case Intrinsic::assume:
|
|
||||||
case Intrinsic::sideeffect:
|
|
||||||
case Intrinsic::dbg_declare:
|
|
||||||
case Intrinsic::dbg_value:
|
|
||||||
case Intrinsic::dbg_label:
|
|
||||||
case Intrinsic::invariant_start:
|
|
||||||
case Intrinsic::invariant_end:
|
|
||||||
case Intrinsic::launder_invariant_group:
|
|
||||||
case Intrinsic::strip_invariant_group:
|
|
||||||
case Intrinsic::is_constant:
|
|
||||||
case Intrinsic::lifetime_start:
|
|
||||||
case Intrinsic::lifetime_end:
|
|
||||||
case Intrinsic::objectsize:
|
|
||||||
case Intrinsic::ptr_annotation:
|
|
||||||
case Intrinsic::var_annotation:
|
|
||||||
case Intrinsic::experimental_gc_result:
|
|
||||||
case Intrinsic::experimental_gc_relocate:
|
|
||||||
case Intrinsic::coro_alloc:
|
|
||||||
case Intrinsic::coro_begin:
|
|
||||||
case Intrinsic::coro_free:
|
|
||||||
case Intrinsic::coro_end:
|
|
||||||
case Intrinsic::coro_frame:
|
|
||||||
case Intrinsic::coro_size:
|
|
||||||
case Intrinsic::coro_suspend:
|
|
||||||
case Intrinsic::coro_param:
|
|
||||||
case Intrinsic::coro_subfn_addr:
|
|
||||||
// These intrinsics don't actually represent code after lowering.
|
|
||||||
return TTI::TCC_Free;
|
|
||||||
}
|
}
|
||||||
|
IntrinsicCostAttributes Attrs(IID, RetTy, ParamTys);
|
||||||
|
return getIntrinsicInstrCost(Attrs, CostKind);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
||||||
|
|
Loading…
Reference in New Issue