aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Analysis/CostModel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Analysis/CostModel.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Analysis/CostModel.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/contrib/llvm-project/llvm/lib/Analysis/CostModel.cpp b/contrib/llvm-project/llvm/lib/Analysis/CostModel.cpp
index 52e424ae324b..3c162f604cd5 100644
--- a/contrib/llvm-project/llvm/lib/Analysis/CostModel.cpp
+++ b/contrib/llvm-project/llvm/lib/Analysis/CostModel.cpp
@@ -25,6 +25,7 @@
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"
+#include "llvm/IR/IntrinsicInst.h"
using namespace llvm;
static cl::opt<TargetTransformInfo::TargetCostKind> CostKind(
@@ -39,6 +40,9 @@ static cl::opt<TargetTransformInfo::TargetCostKind> CostKind(
clEnumValN(TargetTransformInfo::TCK_SizeAndLatency,
"size-latency", "Code size and latency")));
+static cl::opt<bool> TypeBasedIntrinsicCost("type-based-intrinsic-cost",
+ cl::desc("Calculate intrinsics cost based only on argument types"),
+ cl::init(false));
#define CM_NAME "cost-model"
#define DEBUG_TYPE CM_NAME
@@ -103,7 +107,16 @@ void CostModelAnalysis::print(raw_ostream &OS, const Module*) const {
for (BasicBlock &B : *F) {
for (Instruction &Inst : B) {
- InstructionCost Cost = TTI->getInstructionCost(&Inst, CostKind);
+ InstructionCost Cost;
+ if (TypeBasedIntrinsicCost && isa<IntrinsicInst>(&Inst)) {
+ auto *II = dyn_cast<IntrinsicInst>(&Inst);
+ IntrinsicCostAttributes ICA(II->getIntrinsicID(), *II,
+ InstructionCost::getInvalid(), true);
+ Cost = TTI->getIntrinsicInstrCost(ICA, CostKind);
+ }
+ else {
+ Cost = TTI->getInstructionCost(&Inst, CostKind);
+ }
if (auto CostVal = Cost.getValue())
OS << "Cost Model: Found an estimated cost of " << *CostVal;
else
@@ -122,7 +135,16 @@ PreservedAnalyses CostModelPrinterPass::run(Function &F,
for (Instruction &Inst : B) {
// TODO: Use a pass parameter instead of cl::opt CostKind to determine
// which cost kind to print.
- InstructionCost Cost = TTI.getInstructionCost(&Inst, CostKind);
+ InstructionCost Cost;
+ if (TypeBasedIntrinsicCost && isa<IntrinsicInst>(&Inst)) {
+ auto *II = dyn_cast<IntrinsicInst>(&Inst);
+ IntrinsicCostAttributes ICA(II->getIntrinsicID(), *II,
+ InstructionCost::getInvalid(), true);
+ Cost = TTI.getIntrinsicInstrCost(ICA, CostKind);
+ }
+ else {
+ Cost = TTI.getInstructionCost(&Inst, CostKind);
+ }
if (auto CostVal = Cost.getValue())
OS << "Cost Model: Found an estimated cost of " << *CostVal;
else