aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2020-02-25 21:51:16 +0300
committerRoman Lebedev <lebedev.ri@gmail.com>2020-02-25 23:05:57 +0300
commitf90973f48645d1d1799d7bdb81cd6873e3a8ab71 (patch)
treef59cd7590ea13b6d1d5b2bbc614ab6e93b9c2c6a /llvm/lib/Analysis/ScalarEvolutionExpander.cpp
parent2d8275d72e1602a1869e6286b0ffbf9034ab102b (diff)
downloadllvm-f90973f48645d1d1799d7bdb81cd6873e3a8ab71.zip
llvm-f90973f48645d1d1799d7bdb81cd6873e3a8ab71.tar.gz
llvm-f90973f48645d1d1799d7bdb81cd6873e3a8ab71.tar.bz2
[SCEV] SCEVExpander::isHighCostExpansionHelper(): begin cost modelling - model cast cost
Summary: This is not a NFC, although it does not change any of the existing tests. I'm not really sure if we should have specific tests for the cost modelling itself. This is the first patch that actually makes `SCEVExpander::isHighCostExpansionHelper()` account for the cost of the SCEV expression, and consider the budget available, by modelling cast expressions. I believe the logic itself is "pretty obviously correct" - from budget, we need to subtract the cost of the cast expression from inner type `Op->getType()` to the `S->getType()` type, and recurse into the expression we are casting. Reviewers: reames, mkazantsev, wmi, sanjoy Reviewed By: mkazantsev Subscribers: xbolva00, hiraditya, javed.absar, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D73716
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolutionExpander.cpp')
-rw-r--r--llvm/lib/Analysis/ScalarEvolutionExpander.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolutionExpander.cpp b/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
index 989e864..34d3ff2 100644
--- a/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
+++ b/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
@@ -2138,6 +2138,9 @@ SCEVExpander::getRelatedExistingExpansion(const SCEV *S, const Instruction *At,
bool SCEVExpander::isHighCostExpansionHelper(
const SCEV *S, Loop *L, const Instruction *At, int &BudgetRemaining,
const TargetTransformInfo &TTI, SmallPtrSetImpl<const SCEV *> &Processed) {
+ if (BudgetRemaining < 0)
+ return true; // Already run out of budget, give up.
+
// Was the cost of expansion of this expression already accounted for?
if (!Processed.insert(S).second)
return false; // We have already accounted for this expression.
@@ -2153,17 +2156,26 @@ bool SCEVExpander::isHighCostExpansionHelper(
return false; // Assume to be zero-cost.
}
- // Zero/One operand expressions
- switch (S->getSCEVType()) {
- case scTruncate:
- return isHighCostExpansionHelper(cast<SCEVTruncateExpr>(S)->getOperand(), L,
- At, BudgetRemaining, TTI, Processed);
- case scZeroExtend:
- return isHighCostExpansionHelper(cast<SCEVZeroExtendExpr>(S)->getOperand(),
- L, At, BudgetRemaining, TTI, Processed);
- case scSignExtend:
- return isHighCostExpansionHelper(cast<SCEVSignExtendExpr>(S)->getOperand(),
- L, At, BudgetRemaining, TTI, Processed);
+ if (auto *CastExpr = dyn_cast<SCEVCastExpr>(S)) {
+ unsigned Opcode;
+ switch (S->getSCEVType()) {
+ case scTruncate:
+ Opcode = Instruction::Trunc;
+ break;
+ case scZeroExtend:
+ Opcode = Instruction::ZExt;
+ break;
+ case scSignExtend:
+ Opcode = Instruction::SExt;
+ break;
+ default:
+ llvm_unreachable("There are no other cast types.");
+ }
+ const SCEV *Op = CastExpr->getOperand();
+ BudgetRemaining -=
+ TTI.getOperationCost(Opcode, S->getType(), Op->getType());
+ return isHighCostExpansionHelper(Op, L, At, BudgetRemaining, TTI,
+ Processed);
}