[llvm] f9f52c8 - [NFCI][SCEV] getPointerBase(): de-recursify
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 27 01:37:46 PDT 2020
Author: Roman Lebedev
Date: 2020-06-27T11:37:17+03:00
New Revision: f9f52c88cafb11952a20eaa6d3b6cb2fcc79bbf9
URL: https://github.com/llvm/llvm-project/commit/f9f52c88cafb11952a20eaa6d3b6cb2fcc79bbf9
DIFF: https://github.com/llvm/llvm-project/commit/f9f52c88cafb11952a20eaa6d3b6cb2fcc79bbf9.diff
LOG: [NFCI][SCEV] getPointerBase(): de-recursify
Summary:
This is boringly straight-forward, each iteration we see if
V is some expression that we can look into, and if it has
a single pointer operand, then set V to that operand
and repeat.
Reviewers: efriedma, mkazantsev, reames, nikic
Reviewed By: nikic
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D82632
Added:
Modified:
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index e2afbb74867d..1affa94b6ab3 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -3953,23 +3953,25 @@ const SCEV *ScalarEvolution::getPointerBase(const SCEV *V) {
if (!V->getType()->isPointerTy())
return V;
- if (const SCEVCastExpr *Cast = dyn_cast<SCEVCastExpr>(V)) {
- return getPointerBase(Cast->getOperand());
- } else if (const SCEVNAryExpr *NAry = dyn_cast<SCEVNAryExpr>(V)) {
- const SCEV *PtrOp = nullptr;
- for (const SCEV *NAryOp : NAry->operands()) {
- if (NAryOp->getType()->isPointerTy()) {
- // Cannot find the base of an expression with multiple pointer operands.
- if (PtrOp)
- return V;
- PtrOp = NAryOp;
+ while (true) {
+ if (const SCEVCastExpr *Cast = dyn_cast<SCEVCastExpr>(V)) {
+ V = Cast->getOperand();
+ } else if (const SCEVNAryExpr *NAry = dyn_cast<SCEVNAryExpr>(V)) {
+ const SCEV *PtrOp = nullptr;
+ for (const SCEV *NAryOp : NAry->operands()) {
+ if (NAryOp->getType()->isPointerTy()) {
+ // Cannot find the base of an expression with multiple pointer ops.
+ if (PtrOp)
+ return V;
+ PtrOp = NAryOp;
+ }
}
- }
- if (!PtrOp)
+ if (!PtrOp) // All operands were non-pointer.
+ return V;
+ V = PtrOp;
+ } else // Not something we can look further into.
return V;
- return getPointerBase(PtrOp);
}
- return V;
}
/// Push users of the given Instruction onto the given Worklist.
More information about the llvm-commits
mailing list