[llvm] 36f1c3d - [NFCI][ValueTracking] getUnderlyingObject(): assert that no cycles are encountered

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 15 01:53:27 PDT 2021


Author: Roman Lebedev
Date: 2021-03-15T11:52:31+03:00
New Revision: 36f1c3db66f7268ea3183bcf0bbf05b3e1c570b4

URL: https://github.com/llvm/llvm-project/commit/36f1c3db66f7268ea3183bcf0bbf05b3e1c570b4
DIFF: https://github.com/llvm/llvm-project/commit/36f1c3db66f7268ea3183bcf0bbf05b3e1c570b4.diff

LOG: [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.

Added: 
    

Modified: 
    llvm/lib/Analysis/ValueTracking.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 79399cf058bd..8c44d73d4e33 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<const Value *, 8> 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<GEPOperator>(V)) {
       V = GEP->getPointerOperand();
     } else if (Operator::getOpcode(V) == Instruction::BitCast ||


        


More information about the llvm-commits mailing list