[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