diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -3953,23 +3953,25 @@ if (!V->getType()->isPointerTy()) return V; - if (const SCEVCastExpr *Cast = dyn_cast(V)) { - return getPointerBase(Cast->getOperand()); - } else if (const SCEVNAryExpr *NAry = dyn_cast(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(V)) { + V = Cast->getOperand(); + } else if (const SCEVNAryExpr *NAry = dyn_cast(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.