[PATCH] D147117: [SCEV] When computing trip count, only zext if necessary
Joshua Cao via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 30 00:24:12 PDT 2023
caojoshua updated this revision to Diff 509561.
caojoshua added a comment.
Use `willNotOverflow()`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D147117/new/
https://reviews.llvm.org/D147117
Files:
llvm/lib/Analysis/LoopCacheAnalysis.cpp
llvm/lib/Analysis/ScalarEvolution.cpp
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -8043,8 +8043,9 @@
auto *ExitCountType = ExitCount->getType();
assert(ExitCountType->isIntegerTy());
- if (!Extend)
- return getAddExpr(ExitCount, getOne(ExitCountType));
+ const SCEV *One = getOne(ExitCountType);
+ if (!Extend || willNotOverflow(Instruction::Add, false, ExitCount, One))
+ return getAddExpr(ExitCount, One);
auto *WiderType = Type::getIntNTy(ExitCountType->getContext(),
1 + ExitCountType->getScalarSizeInBits());
@@ -8228,15 +8229,14 @@
return 1;
// Get the trip count
- const SCEV *TCExpr = getTripCountFromExitCount(ExitCount);
+ const SCEV *TCExpr = getTripCountFromExitCount(applyLoopGuards(ExitCount, L));
const SCEVConstant *TC = dyn_cast<SCEVConstant>(TCExpr);
if (!TC)
// Attempt to factor more general cases. Returns the greatest power of
// two divisor. If overflow happens, the trip count expression is still
// divisible by the greatest power of 2 divisor returned.
- return 1U << std::min((uint32_t)31,
- GetMinTrailingZeros(applyLoopGuards(TCExpr, L)));
+ return 1U << std::min((uint32_t)31, GetMinTrailingZeros(TCExpr));
ConstantInt *Result = TC->getValue();
Index: llvm/lib/Analysis/LoopCacheAnalysis.cpp
===================================================================
--- llvm/lib/Analysis/LoopCacheAnalysis.cpp
+++ llvm/lib/Analysis/LoopCacheAnalysis.cpp
@@ -297,7 +297,7 @@
Type *WiderType = SE.getWiderType(Stride->getType(), TripCount->getType());
const SCEV *CacheLineSize = SE.getConstant(WiderType, CLS);
Stride = SE.getNoopOrAnyExtend(Stride, WiderType);
- TripCount = SE.getNoopOrAnyExtend(TripCount, WiderType);
+ TripCount = SE.getNoopOrZeroExtend(TripCount, WiderType);
const SCEV *Numerator = SE.getMulExpr(Stride, TripCount);
RefCost = SE.getUDivExpr(Numerator, CacheLineSize);
@@ -334,7 +334,7 @@
// Attempt to fold RefCost into a constant.
if (auto ConstantCost = dyn_cast<SCEVConstant>(RefCost))
- return ConstantCost->getValue()->getSExtValue();
+ return ConstantCost->getValue()->getZExtValue();
LLVM_DEBUG(dbgs().indent(4)
<< "RefCost is not a constant! Setting to RefCost=InvalidCost "
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147117.509561.patch
Type: text/x-patch
Size: 2445 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230330/de0ca2cf/attachment.bin>
More information about the llvm-commits
mailing list