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,
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -741,47 +774,16 @@ public:
|
|||
|
||||
unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
||||
ArrayRef<Type *> ParamTys, const User *U,
|
||||
TTI::TargetCostKind TCK_SizeAndLatency) {
|
||||
TTI::TargetCostKind CostKind) {
|
||||
switch (IID) {
|
||||
default:
|
||||
// Intrinsics rarely (if ever) have normal argument setup constraints.
|
||||
// Model them as having a basic instruction cost.
|
||||
return TTI::TCC_Basic;
|
||||
|
||||
break;
|
||||
// TODO: other libc intrinsics.
|
||||
case Intrinsic::memcpy:
|
||||
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,
|
||||
|
|
Loading…
Reference in New Issue