[llvm] [LAA] Strip isNoWrapGEP: dead code (NFC) (PR #140308)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Fri May 16 14:03:29 PDT 2025
https://github.com/artagnon created https://github.com/llvm/llvm-project/pull/140308
isNoWrap is the only caller of isNoWrapGEP, and it has subsuming check on the GEP immediately after.
>From 97837df8fb5edc245aa4a9e7154695c58c1126b4 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Fri, 16 May 2025 22:00:39 +0100
Subject: [PATCH] [LAA] Strip isNoWrapGEP: dead code (NFC)
isNoWrap is the only caller of isNoWrapGEP, and it has subsuming check
on the GEP immediately after.
---
llvm/lib/Analysis/LoopAccessAnalysis.cpp | 51 ------------------------
1 file changed, 51 deletions(-)
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index ab407e945bc53..8d6355c23b019 100644
--- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp
+++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
@@ -842,9 +842,6 @@ getStrideFromAddRec(const SCEVAddRecExpr *AR, const Loop *Lp, Type *AccessTy,
return Stride;
}
-static bool isNoWrapGEP(Value *Ptr, PredicatedScalarEvolution &PSE,
- const Loop *L);
-
/// Check whether \p AR is a non-wrapping AddRec. If \p Ptr is not nullptr, use
/// informating from the IR pointer value to determine no-wrap.
static bool isNoWrap(PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,
@@ -857,11 +854,6 @@ static bool isNoWrap(PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,
if (Ptr && PSE.hasNoOverflow(Ptr, SCEVWrapPredicate::IncrementNUSW))
return true;
- // The address calculation must not wrap. Otherwise, a dependence could be
- // inverted.
- if (Ptr && isNoWrapGEP(Ptr, PSE, L))
- return true;
-
// An nusw getelementptr that is an AddRec cannot wrap. If it would wrap,
// the distance between the previously accessed location and the wrapped
// location will be larger than half the pointer index type space. In that
@@ -1457,49 +1449,6 @@ void AccessAnalysis::processMemAccesses() {
}
}
-/// Check whether \p Ptr is non-wrapping GEP.
-static bool isNoWrapGEP(Value *Ptr, PredicatedScalarEvolution &PSE,
- const Loop *L) {
- // Scalar evolution does not propagate the non-wrapping flags to values that
- // are derived from a non-wrapping induction variable because non-wrapping
- // could be flow-sensitive.
- //
- // Look through the potentially overflowing instruction to try to prove
- // non-wrapping for the *specific* value of Ptr.
-
- // The arithmetic implied by an nusw GEP can't overflow.
- const auto *GEP = dyn_cast<GetElementPtrInst>(Ptr);
- if (!GEP || !GEP->hasNoUnsignedSignedWrap())
- return false;
-
- // Make sure there is only one non-const index and analyze that.
- Value *NonConstIndex = nullptr;
- for (Value *Index : GEP->indices())
- if (!isa<ConstantInt>(Index)) {
- if (NonConstIndex)
- return false;
- NonConstIndex = Index;
- }
- if (!NonConstIndex)
- // The recurrence is on the pointer, ignore for now.
- return false;
-
- // The index in GEP is signed. It is non-wrapping if it's derived from a NSW
- // AddRec using a NSW operation.
- if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(NonConstIndex))
- if (OBO->hasNoSignedWrap() &&
- // Assume constant for other the operand so that the AddRec can be
- // easily found.
- isa<ConstantInt>(OBO->getOperand(1))) {
- const SCEV *OpScev = PSE.getSCEV(OBO->getOperand(0));
-
- if (auto *OpAR = dyn_cast<SCEVAddRecExpr>(OpScev))
- return OpAR->getLoop() == L && OpAR->getNoWrapFlags(SCEV::FlagNSW);
- }
-
- return false;
-}
-
/// Check whether the access through \p Ptr has a constant stride.
std::optional<int64_t>
llvm::getPtrStride(PredicatedScalarEvolution &PSE, Type *AccessTy, Value *Ptr,
More information about the llvm-commits
mailing list