[PATCH] D35741: Add MemorySSA alternative to AliasSetTracker in LICM.
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 26 18:18:15 PDT 2017
On Tue, Sep 26, 2017 at 5:57 PM, Daniel Berlin <dberlin at dberlin.org> wrote:
> FWIW I suspect MemorySSAAliasSets will be too slow for use by anything for
> real.
I was under the impression is that it should be no worse than
AliasSetTracker, and better in some cases (large blocks with very few
memory operations). Otherwise I don't see a reason to do this.
-- Sanjoy
> 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
>>
>>
>>
>
More information about the llvm-commits
mailing list