[llvm] 6a84af7 - [LAA] Use computeConstantDifference() (#103725)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 16 03:53:00 PDT 2024
Author: Nikita Popov
Date: 2024-08-16T12:52:57+02:00
New Revision: 6a84af704f57defd919a4ec2e34b70a48d548719
URL: https://github.com/llvm/llvm-project/commit/6a84af704f57defd919a4ec2e34b70a48d548719
DIFF: https://github.com/llvm/llvm-project/commit/6a84af704f57defd919a4ec2e34b70a48d548719.diff
LOG: [LAA] Use computeConstantDifference() (#103725)
Use computeConstantDifference() instead of casting getMinusSCEV() to
SCEVConstant. This can be much faster in some cases, because
computeConstantDifference() computes the result without creating new
SCEV expressions.
This improves LTO/ThinLTO compile-time for lencod by more than 10%.
I've verified that computeConstantDifference() does not produce worse
results than the previous code for anything in llvm-test-suite. This
required raising the iteration cutoff to 6. I ended up increasing it to
8 just to be on the safe side (for code outside llvm-test-suite), and
because this doesn't materially affect compile-time anyway (we'll almost
always bail out earlier).
Added:
Modified:
llvm/lib/Analysis/LoopAccessAnalysis.cpp
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index d67fd7985f6a50..872bc52b82cca7 100644
--- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp
+++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
@@ -412,12 +412,10 @@ bool RuntimePointerChecking::needsChecking(
/// Return nullptr in case we couldn't find an answer.
static const SCEV *getMinFromExprs(const SCEV *I, const SCEV *J,
ScalarEvolution *SE) {
- const SCEV *Diff = SE->getMinusSCEV(J, I);
- const SCEVConstant *C = dyn_cast<const SCEVConstant>(Diff);
-
- if (!C)
+ std::optional<APInt> Diff = SE->computeConstantDifference(J, I);
+ if (!Diff)
return nullptr;
- return C->getValue()->isNegative() ? J : I;
+ return Diff->isNegative() ? J : I;
}
bool RuntimeCheckingPtrGroup::addPointer(
@@ -1599,11 +1597,11 @@ std::optional<int> llvm::getPointersDiff(Type *ElemTyA, Value *PtrA,
// Otherwise compute the distance with SCEV between the base pointers.
const SCEV *PtrSCEVA = SE.getSCEV(PtrA);
const SCEV *PtrSCEVB = SE.getSCEV(PtrB);
- const auto *Diff =
- dyn_cast<SCEVConstant>(SE.getMinusSCEV(PtrSCEVB, PtrSCEVA));
+ std::optional<APInt> Diff =
+ SE.computeConstantDifference(PtrSCEVB, PtrSCEVA);
if (!Diff)
return std::nullopt;
- Val = Diff->getAPInt().getSExtValue();
+ Val = Diff->getSExtValue();
}
int Size = DL.getTypeStoreSize(ElemTyA);
int Dist = Val / Size;
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 487844f000ac69..a19358dee8ef49 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -11956,7 +11956,7 @@ ScalarEvolution::computeConstantDifference(const SCEV *More, const SCEV *Less) {
APInt DiffMul(BW, 1);
// Try various simplifications to reduce the
diff erence to a constant. Limit
// the number of allowed simplifications to keep compile-time low.
- for (unsigned I = 0; I < 5; ++I) {
+ for (unsigned I = 0; I < 8; ++I) {
if (More == Less)
return Diff;
More information about the llvm-commits
mailing list