From 8133778d3c8d481891143e21e0c5081a02a9889d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 17 Feb 2022 10:03:58 +0100 Subject: [PATCH] [SCEV] Fully invalidate SCEVUnknown on RAUW When a SCEVUnknown gets RAUWd, we currently drop it from the folding set, but don't forget memoized values. I believe we should be treating RAUW the same way as deletion here and invalidate all caches and dependent expressions. I don't have any specific cases where this causes issues right now, but it does address the FIXME in https://reviews.llvm.org/D119488. Differential Revision: https://reviews.llvm.org/D120033 --- llvm/lib/Analysis/ScalarEvolution.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index e66e9ec..7d2d338 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -526,12 +526,13 @@ void SCEVUnknown::deleted() { } void SCEVUnknown::allUsesReplacedWith(Value *New) { + // Clear this SCEVUnknown from various maps. + SE->forgetMemoizedResults(this); + // Remove this SCEVUnknown from the uniquing map. SE->UniqueSCEVs.RemoveNode(this); - // Update this SCEVUnknown to point to the new value. This is needed - // because there may still be outstanding SCEVs which still point to - // this SCEVUnknown. + // Replace the value pointer in case someone is still using this SCEVUnknown. setValPtr(New); } -- 2.7.4