From: Roman Lebedev Date: Wed, 17 Jun 2020 19:33:44 +0000 (+0300) Subject: [InstCombine] Negator: while there, add detection for cycles during negation X-Git-Tag: llvmorg-12-init~2763 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=84b4f5a6a6bc834c325edef7baec335b81b6e367;p=platform%2Fupstream%2Fllvm.git [InstCombine] Negator: while there, add detection for cycles during negation I don't have any testcases showing it happening, and i haven't succeeded in creating one, but i'm also not positive it can't ever happen, and i recall having something that looked like that in the very beginning of Negator creation. But since we now already have a negation cache, we can now detect such cases practically for free. Let's do so instead of "relying" on stack overflow :D --- diff --git a/llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp b/llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp index deb14f1..3fe615a 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp @@ -388,16 +388,30 @@ LLVM_NODISCARD Value *Negator::negate(Value *V, unsigned Depth) { ++NumValuesVisitedInThisNegator; #endif +#ifndef NDEBUG + // We can't ever have a Value with such an address. + Value *Placeholder = reinterpret_cast(static_cast(-1)); +#endif + // Did we already try to negate this value? auto NegationsCacheIterator = NegationsCache.find(V); if (NegationsCacheIterator != NegationsCache.end()) { ++NegatorNumNegationsFoundInCache; - return NegationsCacheIterator->second; + Value *NegatedV = NegationsCacheIterator->second; + assert(NegatedV != Placeholder && "Encountered a cycle during negation."); + return NegatedV; } +#ifndef NDEBUG + // We did not find a cached result for negation of V. While there, + // let's temporairly cache a placeholder value, with the idea that if later + // during negation we fetch it from cache, we'll know we're in a cycle. + NegationsCache[V] = Placeholder; +#endif + // No luck. Try negating it for real. Value *NegatedV = visitImpl(V, Depth); - // And cache the result for the future. + // And cache the (real) result for the future. NegationsCache[V] = NegatedV; return NegatedV;