[PATCH] D147117: [SCEV] When computing trip count, only zext if necessary
Joshua Cao via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 2 00:42:03 PDT 2023
caojoshua updated this revision to Diff 510313.
caojoshua added a comment.
Convert more sign extend to zero extend
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
@@ -8046,6 +8046,12 @@
if (!Extend)
return getAddExpr(ExitCount, getOne(ExitCountType));
+ ConstantRange ExitCountRange =
+ getRangeRef(ExitCount, RangeSignHint::HINT_RANGE_UNSIGNED);
+ if (!ExitCountRange.contains(
+ APInt::getMaxValue(ExitCountRange.getBitWidth())))
+ return getAddExpr(ExitCount, getOne(ExitCountType));
+
auto *WiderType = Type::getIntNTy(ExitCountType->getContext(),
1 + ExitCountType->getScalarSizeInBits());
return getAddExpr(getNoopOrZeroExtend(ExitCount, WiderType),
@@ -8228,15 +8234,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);
@@ -323,8 +323,8 @@
const SCEV *TripCount =
computeTripCount(*AR->getLoop(), *Sizes.back(), SE);
Type *WiderType = SE.getWiderType(RefCost->getType(), TripCount->getType());
- RefCost = SE.getMulExpr(SE.getNoopOrAnyExtend(RefCost, WiderType),
- SE.getNoopOrAnyExtend(TripCount, WiderType));
+ RefCost = SE.getMulExpr(SE.getNoopOrZeroExtend(RefCost, WiderType),
+ SE.getNoopOrZeroExtend(TripCount, WiderType));
}
LLVM_DEBUG(dbgs().indent(4)
@@ -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.510313.patch
Type: text/x-patch
Size: 3061 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230402/89d02508/attachment.bin>
More information about the llvm-commits
mailing list