[PATCH] D35741: Add MemorySSA alternative to AliasSetTracker in LICM.

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 26 17:57:57 PDT 2017


FWIW I suspect MemorySSAAliasSets will be too slow for use by anything for
real.
But i guess we'll see :)


On Tue, Sep 26, 2017 at 5:42 PM, Sanjoy Das via Phabricator <
reviews at reviews.llvm.org> wrote:

> sanjoy requested changes to this revision.
> sanjoy added a comment.
> This revision now requires changes to proceed.
>
> I have added some generic style comments.
>
> As discussed in person, I think we should split out the
> `MemorySSAAliasSets` class, and add some targeted unit tests.
>
> Please also add a comment describing the algorithm at a high level.
>
>
>
> ================
> Comment at: include/llvm/Analysis/MemorySSAAliasSets.h:10
> +// This a a helper class that creates alias sets using MemorySSA, each
> +// set being marked with properties that enablei/disable promotion.
> +// It is used for promotion in the Loop Invariant Code Motion Pass.
> ----------------
> s/enablei/enable/
>
>
> ================
> Comment at: include/llvm/Analysis/MemorySSAAliasSets.h:49
> +    // witout a MemoryLocation.
> +    bool CanNeverPromote=false;
> +    bool LoopInvariantAccess=false;
> ----------------
> The whitespace is a bit off here (clang-format?).
>
>
> ================
> Comment at: include/llvm/Analysis/MemorySSAAliasSets.h:98
> +
> +  void addToAliasSets(const MemoryUse *Use, SmallPtrSetImpl<const
> MemoryAccess*> &Processed) {
> +    Processed.insert(Use);
> ----------------
> You probably should split this out into header and a .cpp -- that way
> telling the interface apart from the implementation will become easier.
>
>
> ================
> Comment at: include/llvm/Support/Debug.h:102
> +///
> +extern bool UseLICMwMSSA;
> +
> ----------------
> I'd prefer to spell this out as UseLICMWithMSSA.
>
>
> ================
> Comment at: include/llvm/Transforms/Scalar/LoopPassManager.h:350
>      PA.preserve<ScalarEvolutionAnalysis>();
> +    if (EnableMSSALoopDep) {
> +      PA.preserve<MemorySSAAnalysis>();
> ----------------
> LLVM style is to avoid braces around single line statements like this.
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:10
> +// This a a helper class that creates alias sets using MemorySSA, each
> +// set being marked with properties that enablei/disable promotion.
> +// It is used for promotion in the Loop Invariant Code Motion Pass.
> ----------------
> s/enablei/enable/
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:28
> +
> +using namespace llvm;
> +
> ----------------
> Opening namespaces in headers is against LLVM style.
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:34
> +  MemorySSA *MSSA;
> +  MemorySSAUpdater *MSSAUpdater;
> +
> ----------------
> I'd prefer having these under accessors.
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:43
> +
> +  class SingleMustAliasVec {
> +    MemoryLocation Loc;
> ----------------
> I'm not sure about the name -- how about `MustAliasSet`?  The "single"
> part is implied by the fact that the name is singular, and this is
> semantically a "set" and not a "vec".
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:54
> +    bool HasAGoodStore = false;
> +    SingleMustAliasVec(MemoryLocation loc) : Loc(loc),
> CanNeverPromote(false) {
> +      Vec.insert(const_cast<Value *>(Loc.Ptr));
> ----------------
> You probably don't need the `CanNeverPromote(false)` bit.
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:58
> +    void addMemoryLocation(Optional<MemoryLocation> MemLoc) {
> +      if (MemLoc == None)
> +        return;
> ----------------
> This will be a line shorter without an early return.
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:86
> +  unsigned MemorySSATraversalPenalty = 0;
> +  unsigned CAP_NO_ALIAS_SETS = 30;
> +  unsigned CAP_MSSA_TRAVERSALS = 30;
> ----------------
> These need to be `cl::opt` s
>
> You should also split this header into a .cpp file (and put the cl::opt s
> in  that .cpp file).
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:90
> +  void dump() {
> +    for (SingleMustAliasVec *Set : AllSets)
> +      Set->dump();
> ----------------
> You should use `LLVM_ENABLE_DUMP` and `LLVM_DUMP_METHOD` for this.  See
> the definition and declaration of e.g. `DominanceFrontierWrapperPass:
> :dump()`
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:96
> +    if(!L)
> +      return true;
> +    return L->isLoopInvariant(V);
> ----------------
> Can be a ternary.  Same for loopContains
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:112
> +                    MemoryLocation &MemLocJ) {
> +    if (MemLocI == None) {
> +      ModRefInfo ModRef = AA->getModRefInfo(InstrI, MemLocJ);
> ----------------
> I'd structure this as:
>
> ```
> if (MemLocI)
>   return AA->alias(MemLocI.getValue(), MemLocJ);
> // Rest of the code
> ```
>
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:247
> +    // before their children in the worklist and process the worklist in
> order.
> +    SmallVector<DomTreeNode *, 16> Worklist = collectChildrenInLoop(N, L);
> +
> ----------------
> In `loopContains` you've handled the case where `L` is `nullptr`, but
> you've not done the same here.
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:253
> +      if (Accesses)
> +        for (auto &Acc : make_range(Accesses->begin(), Accesses->end())) {
> +          if (AllSets.size() > CAP_NO_ALIAS_SETS ||
> ----------------
> Can this be `for (auto &Acc : *Accesses)`?
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:260
> +          // Process uses
> +          const MemoryUse *Use = dyn_cast_or_null<MemoryUse>(&Acc);
> +          if (Use)
> ----------------
> You can do:
>
> ```
> if (const auto *Use = dyn_cast_or_null<MemoryUse>(&Acc))
>   addToAliasSets(Use);
> ```
>
> also, the second `if` can be an `else if`.
>
>
> ================
> Comment at: include/llvm/Transforms/Utils/MemorySSAAliasSets.h:284
> +
> +  void replace(Value *LoadI, Value *Replacement) {
> +    for (auto OneAliasSet : AllSets) {
> ----------------
> Can you please give this a more obvious name, like `replaceMemoryLocation`?
>
> Also, the name `LoadI` is misleading -- it isn't the load instruction, but
> it is the memory location, right?
>
>
> https://reviews.llvm.org/D35741
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170926/9a2ab6a4/attachment.html>


More information about the llvm-commits mailing list