From 41688b499e2dc8595a8f52dfeb8378b74c2cfd7d Mon Sep 17 00:00:00 2001 From: David Green Date: Tue, 3 Nov 2020 09:58:28 +0000 Subject: [PATCH] [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 --- include/llvm/CodeGen/BasicTTIImpl.h | 6 +++++- include/llvm/IR/Function.h | 4 ++++ lib/IR/Function.cpp | 6 +++++- test/Analysis/CostModel/ARM/target-intrinsics.ll | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/llvm/CodeGen/BasicTTIImpl.h b/include/llvm/CodeGen/BasicTTIImpl.h index 67d08813231..ebf946d0fe2 100644 --- a/include/llvm/CodeGen/BasicTTIImpl.h +++ b/include/llvm/CodeGen/BasicTTIImpl.h @@ -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 &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? diff --git a/include/llvm/IR/Function.h b/include/llvm/IR/Function.h index 350d94ea09e..061223d3bd7 100644 --- a/include/llvm/IR/Function.h +++ b/include/llvm/IR/Function.h @@ -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. diff --git a/lib/IR/Function.cpp b/lib/IR/Function.cpp index e228c3e0a4e..8c360dd1841 100644 --- a/lib/IR/Function.cpp +++ b/lib/IR/Function.cpp @@ -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 diff --git a/test/Analysis/CostModel/ARM/target-intrinsics.ll b/test/Analysis/CostModel/ARM/target-intrinsics.ll index 269f3074aad..bb2cdde7422 100644 --- a/test/Analysis/CostModel/ARM/target-intrinsics.ll +++ b/test/Analysis/CostModel/ARM/target-intrinsics.ll @@ -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'