-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[LAA] Strip isNoWrapGEP: dead code (NFC) #140308
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
isNoWrap is the only caller of isNoWrapGEP, and it has subsuming check on the GEP immediately after.
@llvm/pr-subscribers-llvm-analysis Author: Ramkumar Ramachandra (artagnon) ChangesisNoWrap is the only caller of isNoWrapGEP, and it has subsuming check on the GEP immediately after. Full diff: https://github.com/llvm/llvm-project/pull/140308.diff 1 Files Affected:
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,
|
Gentle ping. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM thanks.
The checks in isNoWrapGEP
are a subset of the checks below the call, so removing it should be fine and NFC
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!
isNoWrap is the only caller of isNoWrapGEP, and it has subsuming check on the GEP immediately after.
isNoWrap is the only caller of isNoWrapGEP, and it has subsuming check on the GEP immediately after.
isNoWrap is the only caller of isNoWrapGEP, and it has subsuming check on the GEP immediately after.