[llvm-commits] [llvm] r109570 - /llvm/trunk/lib/Analysis/ScalarEvolution.cpp
Daniel Dunbar
daniel at zuster.org
Tue Jul 27 21:51:10 PDT 2010
Hi Dan,
On Tue, Jul 27, 2010 at 6:09 PM, Dan Gohman <gohman at apple.com> wrote:
> Author: djg
> Date: Tue Jul 27 20:09:07 2010
> New Revision: 109570
>
> URL: http://llvm.org/viewvc/llvm-project?rev=109570&view=rev
> Log:
> Make SCEVCallbackVH::allUsesReplacedWith update the old SCEVUnknown
> object, as it may still be referenced by SCEVs not cleaned up by the
> use list traversal.
>
> Also, in ScalarEvolution::forgetValue, only check for a SCEVUnknown
> object for the original value, not for any value in the use list,
> because other SCEVUnknown values aren't necessary obsolete at that
> point.
>
> Modified:
> llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>
> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=109570&r1=109569&r2=109570&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Tue Jul 27 20:09:07 2010
> @@ -3664,6 +3664,26 @@
> /// changed a value in a way that may effect its value, or which may
> /// disconnect it from a def-use chain linking it to a loop.
> void ScalarEvolution::forgetValue(Value *V) {
> + // If there's a SCEVUnknown tying this value into the SCEV
> + // space, remove it from the folding set map. The SCEVUnknown
> + // object and any other SCEV objects which reference it
> + // (transitively) remain allocated, effectively leaked until
> + // the underlying BumpPtrAllocator is freed.
> + //
> + // This permits SCEV pointers to be used as keys in maps
> + // such as the ValuesAtScopes map.
> + FoldingSetNodeID ID;
> + ID.AddInteger(scUnknown);
> + ID.AddPointer(V);
> + void *IP;
> + if (SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) {
> + UniqueSCEVs.RemoveNode(S);
> +
> + // This isn't necessary, but we might as well remove the
> + // value from the ValuesAtScopes map too.
> + ValuesAtScopes.erase(S);
> + }
> +
> Instruction *I = dyn_cast<Instruction>(V);
> if (!I) return;
>
> @@ -3685,26 +3705,6 @@
> ConstantEvolutionLoopExitValue.erase(PN);
> }
>
> - // If there's a SCEVUnknown tying this value into the SCEV
> - // space, remove it from the folding set map. The SCEVUnknown
> - // object and any other SCEV objects which reference it
> - // (transitively) remain allocated, effectively leaked until
> - // the underlying BumpPtrAllocator is freed.
> - //
> - // This permits SCEV pointers to be used as keys in maps
> - // such as the ValuesAtScopes map.
> - FoldingSetNodeID ID;
> - ID.AddInteger(scUnknown);
> - ID.AddPointer(I);
> - void *IP;
> - if (SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) {
> - UniqueSCEVs.RemoveNode(S);
> -
> - // This isn't necessary, but we might as well remove the
> - // value from the ValuesAtScopes map too.
> - ValuesAtScopes.erase(S);
> - }
> -
> PushDefUseChildren(I, Worklist);
> }
> }
> @@ -5690,15 +5690,32 @@
> // this now dangles!
> }
>
> -void ScalarEvolution::SCEVCallbackVH::allUsesReplacedWith(Value *) {
> +void ScalarEvolution::SCEVCallbackVH::allUsesReplacedWith(Value *V) {
> assert(SE && "SCEVCallbackVH called with a null ScalarEvolution!");
>
> + Value *Old = getValPtr();
> +
> + // If there's a SCEVUnknown tying this value into the SCEV
> + // space, replace the SCEVUnknown's value with the new value
> + // for the benefit of any SCEVs still referencing it, and
> + // and remove it from the folding set map so that new scevs
> + // don't reference it.
> + FoldingSetNodeID ID;
> + ID.AddInteger(scUnknown);
> + ID.AddPointer(Old);
> + void *IP;
> + if (SCEVUnknown *S = cast_or_null<SCEVUnknown>(
> + SE->UniqueSCEVs.FindNodeOrInsertPos(ID, IP))) {
> + S->V = V;
gcc-4.0 seems unhappy with this:
--
ScalarEvolution.cpp: In member function 'virtual void
llvm::ScalarEvolution::SCEVCallbackVH::allUsesReplacedWith(llvm::Value*)':
/Users/buildslave/zorg/buildbot/smooshlab/slave/build.clang-i386-darwin9/llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h:528:
error: 'llvm::Value* llvm::SCEVUnknown::V' is private
ScalarEvolution.cpp:5709: error: within this context
--
- Daniel
> + SE->UniqueSCEVs.RemoveNode(S);
> + SE->ValuesAtScopes.erase(S);
> + }
> +
> // Forget all the expressions associated with users of the old value,
> // so that future queries will recompute the expressions using the new
> // value.
> SmallVector<User *, 16> Worklist;
> SmallPtrSet<User *, 8> Visited;
> - Value *Old = getValPtr();
> for (Value::use_iterator UI = Old->use_begin(), UE = Old->use_end();
> UI != UE; ++UI)
> Worklist.push_back(*UI);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list