[llvm] [TLI] ReplaceWithVecLib pass uses CostModel (PR #78688)
Graham Hunter via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 22 03:29:05 PST 2024
================
@@ -96,15 +102,55 @@ static void replaceWithTLIFunction(Instruction &I, VFInfo &Info,
Replacement->copyFastMathFlags(&I);
}
+/// Returns whether the vector library call \p TLIFunc costs more than the
+/// original instruction \p I.
+static bool isVeclibCallSlower(const TargetLibraryInfo &TLI,
+ const TargetTransformInfo &TTI, Instruction &I,
+ VectorType *VectorTy, CallInst *CI,
+ Function *TLIFunc) {
+ SmallVector<Type *, 4> OpTypes;
+ for (auto &Op : CI ? CI->args() : I.operands())
+ OpTypes.push_back(Op->getType());
+
+ TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
+ InstructionCost DefaultCost;
+ if (CI) {
+ FastMathFlags FMF;
+ if (auto *FPMO = dyn_cast<FPMathOperator>(CI))
+ FMF = FPMO->getFastMathFlags();
+
+ SmallVector<const Value *> Args(CI->args());
+ IntrinsicCostAttributes CostAttrs(CI->getIntrinsicID(), VectorTy, Args,
+ OpTypes, FMF,
+ dyn_cast<IntrinsicInst>(CI));
+ DefaultCost = TTI.getIntrinsicInstrCost(CostAttrs, CostKind);
+ } else {
+ assert((I.getOpcode() == Instruction::FRem) && "Only FRem is supported");
+ auto Op2Info = TTI.getOperandInfo(I.getOperand(1));
+ SmallVector<const Value *, 4> OpValues(I.operand_values());
+ DefaultCost = TTI.getArithmeticInstrCost(
+ I.getOpcode(), VectorTy, CostKind,
+ {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
----------------
huntergr-arm wrote:
Are the arguments after CostKind actually needed? (They have defaults)
https://github.com/llvm/llvm-project/pull/78688
More information about the llvm-commits
mailing list