Index: llvm/include/llvm/CodeGen/BasicTTIImpl.h =================================================================== --- llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -1290,6 +1290,10 @@ unsigned ScalarizationCostPassed = ICA.getScalarizationCost(); bool SkipScalarizationCost = ICA.skipScalarizationCost(); + // Assume that target intrinsics are cheap + if (Function::isTargetIntrinsic(IID)) + return TargetTransformInfo::TCC_Basic; + VectorType *VecOpTy = nullptr; if (!Tys.empty()) { // The vector reduction operand is operand 0 except for fadd/fmul. Index: llvm/include/llvm/IR/Function.h =================================================================== --- llvm/include/llvm/IR/Function.h +++ llvm/include/llvm/IR/Function.h @@ -199,6 +199,10 @@ /// returns Intrinsic::not_intrinsic! bool isIntrinsic() const { return HasLLVMReservedName; } + /// isTargetIntrinsic - Returns true if this IID is an intrinsic specific to a + /// certain target. If this 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. Index: llvm/lib/IR/Function.cpp =================================================================== --- llvm/lib/IR/Function.cpp +++ llvm/lib/IR/Function.cpp @@ -640,8 +640,12 @@ #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 Index: llvm/test/Analysis/CostModel/ARM/target-intrinsics.ll =================================================================== --- llvm/test/Analysis/CostModel/ARM/target-intrinsics.ll +++ llvm/test/Analysis/CostModel/ARM/target-intrinsics.ll @@ -9,7 +9,7 @@ ; 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'