forked from OSchip/llvm-project
[CostModel] Make target intrinsics cheap by default
This patch changes the intrinsics cost model to assume that by default target intrinsics are cheap. This didn't seem to be the case for all intrinsics, and is potentially an MVE problem due to our scalarization overheads. Cheap seems to be a good default in general though. Differential Revision: https://reviews.llvm.org/D90597
This commit is contained in:
parent
1667d23e58
commit
90131e3ecb
|
@ -1135,6 +1135,11 @@ public:
|
|||
if (BaseT::getIntrinsicInstrCost(ICA, CostKind) == 0)
|
||||
return 0;
|
||||
|
||||
// Assume that target intrinsics are cheap.
|
||||
Intrinsic::ID IID = ICA.getID();
|
||||
if (Function::isTargetIntrinsic(IID))
|
||||
return TargetTransformInfo::TCC_Basic;
|
||||
|
||||
if (ICA.isTypeBasedOnly())
|
||||
return getTypeBasedIntrinsicInstrCost(ICA, CostKind);
|
||||
|
||||
|
@ -1151,7 +1156,6 @@ public:
|
|||
const IntrinsicInst *I = ICA.getInst();
|
||||
const SmallVectorImpl<const Value *> &Args = ICA.getArgs();
|
||||
FastMathFlags FMF = ICA.getFlags();
|
||||
Intrinsic::ID IID = ICA.getID();
|
||||
switch (IID) {
|
||||
default:
|
||||
// FIXME: all cost kinds should default to the same thing?
|
||||
|
|
|
@ -199,6 +199,10 @@ public:
|
|||
/// returns Intrinsic::not_intrinsic!
|
||||
bool isIntrinsic() const { return HasLLVMReservedName; }
|
||||
|
||||
/// isTargetIntrinsic - Returns true if IID is an intrinsic specific to a
|
||||
/// certain target. If it is a generic intrinsic false is returned.
|
||||
static bool isTargetIntrinsic(Intrinsic::ID IID);
|
||||
|
||||
/// isTargetIntrinsic - Returns true if this function is an intrinsic and the
|
||||
/// intrinsic is specific to a certain target. If this is not an intrinsic
|
||||
/// or a generic intrinsic, false is returned.
|
||||
|
|
|
@ -640,8 +640,12 @@ static const char * const IntrinsicNameTable[] = {
|
|||
#include "llvm/IR/IntrinsicImpl.inc"
|
||||
#undef GET_INTRINSIC_TARGET_DATA
|
||||
|
||||
bool Function::isTargetIntrinsic(Intrinsic::ID IID) {
|
||||
return IID > TargetInfos[0].Count;
|
||||
}
|
||||
|
||||
bool Function::isTargetIntrinsic() const {
|
||||
return IntID > TargetInfos[0].Count;
|
||||
return isTargetIntrinsic(IntID);
|
||||
}
|
||||
|
||||
/// Find the segment of \c IntrinsicNameTable for intrinsics with the same
|
||||
|
|
|
@ -9,7 +9,7 @@ define void @intrinsics() {
|
|||
; CHECK-THUMB2-RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %t1 = call i32 @llvm.arm.ssat(i32 undef, i32 undef)
|
||||
; CHECK-THUMB2-RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %t2 = tail call { <8 x half>, <8 x half> } @llvm.arm.mve.vld2q.v8f16.p0f16(half* undef)
|
||||
; CHECK-THUMB2-RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %t3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 undef, i32 undef, i32 undef, i32 48)
|
||||
; CHECK-THUMB2-RECIP-NEXT: Cost Model: Found an estimated cost of 135 for instruction: %t4 = tail call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i16> undef, <8 x i16> undef)
|
||||
; CHECK-THUMB2-RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %t4 = tail call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i16> undef, <8 x i16> undef)
|
||||
; CHECK-THUMB2-RECIP-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
||||
;
|
||||
; CHECK-THUMB2-LAT-LABEL: 'intrinsics'
|
||||
|
|
Loading…
Reference in New Issue