[llvm] r260014 - Compute live-in for MemorySSA
David Wiberg via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 7 02:42:52 PST 2016
Hi,
I may be wrong but it looks like you forgot to add "livein.ll".
Best regards
David
2016-02-07 2:52 GMT+01:00 Daniel Berlin via llvm-commits
<llvm-commits at lists.llvm.org>:
> Author: dannyb
> Date: Sat Feb 6 19:52:19 2016
> New Revision: 260014
>
> URL: http://llvm.org/viewvc/llvm-project?rev=260014&view=rev
> Log:
> Compute live-in for MemorySSA
>
> Modified:
> llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp
>
> Modified: llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp?rev=260014&r1=260013&r2=260014&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp Sat Feb 6 19:52:19 2016
> @@ -249,10 +249,11 @@ MemorySSAWalker *MemorySSA::buildMemoryS
> // could just look up the memory access for every possible instruction in the
> // stream.
> SmallPtrSet<BasicBlock *, 32> DefiningBlocks;
> -
> + SmallPtrSet<BasicBlock *, 32> DefUseBlocks;
> // Go through each block, figure out where defs occur, and chain together all
> // the accesses.
> for (BasicBlock &B : F) {
> + bool InsertIntoDefUse = false;
> bool InsertIntoDef = false;
> AccessListType *Accesses = nullptr;
> for (Instruction &I : B) {
> @@ -261,17 +262,56 @@ MemorySSAWalker *MemorySSA::buildMemoryS
> continue;
> if (isa<MemoryDef>(MA))
> InsertIntoDef = true;
> + else if (isa<MemoryUse>(MA))
> + InsertIntoDefUse = true;
> +
> if (!Accesses)
> Accesses = getOrCreateAccessList(&B);
> Accesses->push_back(MA);
> }
> if (InsertIntoDef)
> DefiningBlocks.insert(&B);
> + if (InsertIntoDefUse)
> + DefUseBlocks.insert(&B);
> + }
> +
> + // Compute live-in.
> + // Live in is normally defined as "all the blocks on the path from each def to
> + // each of it's uses".
> + // MemoryDef's are implicit uses of previous state, so they are also uses.
> + // This means we don't really have def-only instructions. The only
> + // MemoryDef's that are not really uses are those that are of the LiveOnEntry
> + // variable (because LiveOnEntry can reach anywhere, and every def is a
> + // must-kill of LiveOnEntry).
> + // In theory, you could precisely compute live-in by using alias-analysis to
> + // disambiguate defs and uses to see which really pair up with which.
> + // In practice, this would be really expensive and difficult. So we simply
> + // assume all defs are also uses that need to be kept live.
> + // Because of this, the end result of this live-in computation will be "the
> + // entire set of basic blocks that reach any use".
> +
> + SmallPtrSet<BasicBlock *, 32> LiveInBlocks;
> + SmallVector<BasicBlock *, 64> LiveInBlockWorklist(DefUseBlocks.begin(),
> + DefUseBlocks.end());
> + // Now that we have a set of blocks where a value is live-in, recursively add
> + // predecessors until we find the full region the value is live.
> + while (!LiveInBlockWorklist.empty()) {
> + BasicBlock *BB = LiveInBlockWorklist.pop_back_val();
> +
> + // The block really is live in here, insert it into the set. If already in
> + // the set, then it has already been processed.
> + if (!LiveInBlocks.insert(BB).second)
> + continue;
> +
> + // Since the value is live into BB, it is either defined in a predecessor or
> + // live into it to.
> + LiveInBlockWorklist.append(pred_begin(BB), pred_end(BB));
> }
>
> // Determine where our MemoryPhi's should go
> IDFCalculator IDFs(*DT);
> IDFs.setDefiningBlocks(DefiningBlocks);
> + IDFs.setLiveInBlocks(LiveInBlocks);
> SmallVector<BasicBlock *, 32> IDFBlocks;
> IDFs.calculate(IDFBlocks);
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list