From: Roman Lebedev Date: Mon, 15 Mar 2021 08:51:23 +0000 (+0300) Subject: [NFCI][ValueTracking] getUnderlyingObject(): assert that no cycles are encountered X-Git-Tag: llvmorg-14-init~12389 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=36f1c3db66f7268ea3183bcf0bbf05b3e1c570b4;p=platform%2Fupstream%2Fllvm.git [NFCI][ValueTracking] getUnderlyingObject(): assert that no cycles are encountered Jeroen Dobbelaere in https://lists.llvm.org/pipermail/llvm-dev/2021-March/149206.html is reporting that this function can end up in an endless loop when called from SROA w/ full restrict patches. For now, simply ensure that such problems are caught earlier/easier. --- diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 79399cf..8c44d73 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -4165,7 +4165,11 @@ static bool isSameUnderlyingObjectInLoop(const PHINode *PN, const Value *llvm::getUnderlyingObject(const Value *V, unsigned MaxLookup) { if (!V->getType()->isPointerTy()) return V; +#ifndef NDEBUG + SmallPtrSet Visited; +#endif for (unsigned Count = 0; MaxLookup == 0 || Count < MaxLookup; ++Count) { + assert(Visited.insert(V).second && "Cycle detected. Unreachable code?"); if (auto *GEP = dyn_cast(V)) { V = GEP->getPointerOperand(); } else if (Operator::getOpcode(V) == Instruction::BitCast ||