[llvm-dev] Regarding the project "Create LoopNestPass"

Ta-Wei Tu via llvm-dev llvm-dev at lists.llvm.org
Wed Jul 29 12:41:57 PDT 2020


Hi,

I've just submitted the patch to Phabricator:
https://reviews.llvm.org/D84886 and I've added you as reviewers.
Please kindly provide feedback on the patch.
Thank you very much!

Sincerely,
Ta-Wei Tu


Whitney T Tsang <whitneyt at ca.ibm.com> 於 2020年7月27日 週一 下午11:10寫道:

> > One of the problems now is on parsing the pipeline. In the current
> `PassBuilder`, a function pass is implicitly created and wrapping the
> subsequent loop passes. If we allow putting `LoopPass` into `LoopNestPass`
> in the future as described above, what would be a good way to distinguish
> whether we should choose "function - loopnest - loop" or "function - loop"
> in this case?
>
> If we allow putting LoopPass into LoopNestPass, then both cases should be
> supported, and it depends on the use case, similar idea as for "Module -
> CGCSS - Function" or "Module - Function".
> createModuleToPostOrderCGSCCPassAdaptor, createCGSCCToFunctionPassAdaptor,
> createModuleToFunctionPassAdaptor
>
> > As this is my first patch to LLVM, I would also like to ask what would
> generally be a good time to submit a patch like this. As most of the
> functionalities are completed but not tested, should I submit the patch as
> soon as all the existing tests pass and add tests specific to the
> `LoopNestPass` later so that people can provide feedback on the overall
> design first, or should I submit the patch after implementing fine-grained
> tests?
>
> I prefer submit the patch as soon as all the existing tests pass and add
> tests specific to the `LoopNestPass` later so that people can provide
> feedback on the overall design first. You can specify in the description
> your intention and that tests are planning to be added.
>
> Regards,
> Whitney Tsang
>
> [image: Inactive hide details for Ta-Wei Tu ---2020/07/24 06:08:37
> AM---Hi, I misunderstood what addSiblingLoops() does - the analogy]Ta-Wei
> Tu ---2020/07/24 06:08:37 AM---Hi, I misunderstood what `addSiblingLoops()`
> does - the analogy should be
>
> From: Ta-Wei Tu <tu.da.wei at gmail.com>
> To: Ettore Tiotto <etiotto at ca.ibm.com>
> Cc: Whitney T Tsang <whitneyt at ca.ibm.com>, llvm-dev <
> llvm-dev at lists.llvm.org>, Whitney Tsang <whitney.uwaterloo at gmail.com>
> Date: 2020/07/24 06:08 AM
> Subject: [EXTERNAL] Re: [llvm-dev] Regarding the project "Create
> LoopNestPass"
> ------------------------------
>
>
>
> Hi,
>
> I misunderstood what `addSiblingLoops()` does - the analogy should be
> something like "addNewLoopNests()" which deals with the insertion of new
> loop nests into the function. I will add this functionality into
> `LNPMUpdater`.
> Also, I just realized that some regression tests rely on the type names of
> the passes, so `FunctionToLoopNestPassAdaptor` should be implemented
> separately or the tests will have to be modified.
> Sorry for the confusion.
>
> Sincerely,
> Ta-Wei, Tu
>
> Ta-Wei Tu <*tu.da.wei at gmail.com* <tu.da.wei at gmail.com>> 於 2020年7月24日 週五
> 下午1:27寫道:
>
>    Hi,
>
>    I would like to give a quick update on what my current design and
>    implementation go like.
>
>    Basically, the `FunctionToLoopPassAdaptor` is now modified to a
>    generic version `FunctionToLoopUnitPassAdaptor`, which allows re-using the
>    existing codes to implement `FunctionToLoopNestPassAdaptor`, with the help
>    of additional metadata associated with `Loop` and `LoopNest`. Both
>    `FunctionToLoopPassAdaptor` and `FunctionToLoopNestPassAdaptor` are aliases
>    to `FunctionToLoopUnitPassAdaptor` and they operates on `Loop`, and the
>    `FunctionToLoopNestPassAdaptor` will construct the `LoopNest` object lazily
>    for the given `LoopNestPass` to run on.
>
>    The `LNPMUpdater` only support `revisitCurrentLoopNest()` and
>    `markLoopNestAsDeleted()` since other functionalities like
>    `addChildLoops()` and `addSiblingLoops()` that `LPMUpdater` provide don't
>    seem to be meaningful since we're dealing with outer-most `LoopNest`s.
>    Still, an analogy of `addSiblingLoops()` can be implemented as something
>    like `addAllLoopNests()`. What's your opinion on that?
>
>    Currently, `LoopNestToLoopPassAdaptor` is also implemented to allow
>    injecting a `LoopPassManager` into a `LoopNestPassManager`. The reason why
>    I think this is useful is that both `LoopPass` and `LoopNestPass` requires
>    loop canonicalization passes to be run first, and composing both of them
>    and promoting them into a single `FunctionPass` can reduce unnecessary runs
>    of the canonicalization phases. With these, the pipeline can be built like:
>
>    ```
>    FunctionPassManager FPM;
>    LoopNestPassManager LNPM;
>    LoopPassManager LPM;
>    LNPM.addPass(SomeLoopNestPass());
>    LPM.addPass(SomeLoopPass());
>    LNPM.addPass(createLoopNestToLoopPassAdaptor(LPM));
>    FPM.addPass(createFunctionToLoopNestPassAdaptor(LNPM));
>
>    // This still works, but the loop canonicalization passes will be run
>    twice:
>    // FPM.addPass(createFunctionToLoopPassAdaptor(LPM));
>    // FPM.addPass(createFunctionToLoopNestPassAdaptor(LNPM));
>    ```
>
>    `LoopNestAnalysisManager` and the proxies between `LoopAnalysis`,
>    `LoopNestAnalysis` and `FunctionAnalysis` are also implemented.
>    One of the problems now is on parsing the pipeline. In the current
>    `PassBuilder`, a function pass is implicitly created and wrapping the
>    subsequent loop passes. If we allow putting `LoopPass` into `LoopNestPass`
>    in the future as described above, what would be a good way to distinguish
>    whether we should choose "function - loopnest - loop" or "function - loop"
>    in this case?
>
>    As this is my first patch to LLVM, I would also like to ask what would
>    generally be a good time to submit a patch like this. As most of the
>    functionalities are completed but not tested, should I submit the patch as
>    soon as all the existing tests pass and add tests specific to the
>    `LoopNestPass` later so that people can provide feedback on the overall
>    design first, or should I submit the patch after implementing fine-grained
>    tests?
>
>    What are your thoughts on the design? Thank you very much!
>
>    Sincerely,
>    Ta-Wei Tu
>
>    Ettore Tiotto <*etiotto at ca.ibm.com* <etiotto at ca.ibm.com>> 於 2020年7月21日
>    週二 下午8:43寫道:
>    > One question I have is whether the IRUnit LoopNestPass operates on
>    should be Loop or LoopNest, since I'm not quite sure about the usage of
>    LoopNest and why it should be constructed with a ScalarEvolution.
>
>    That's a good point, we can make ScalarEvolution optional for
>    LoopNest. Currently, the only use case is to check if the loop nest is
>    perfect, which can provide a more conservative result if ScalarEvolution is
>    not given.
>    Having said that, ScalarEvolution is one of the analyses in
>    LoopStandardAnalysisResults, so all LoopPasses already have access to
>    ScalarEvolution.
>    LoopNest provides some useful utilities, although it is still not at a
>    manual phrase.
>    My personal opinion is all the mechanism of the LoopNest,
>    e.g. LoopNestPassManager, LPMUpdater, etc, should operates on Loop. While
>    IRUnitT which is used by loop nest transformations/analyses should operates
>    on LoopNest.
>    @etiotto What's your opinion on that?
>
>    Determining whether a loop nest is perfect is a fundamental feature
>    for LoopNest analysis, and ScalarEvolution is required to catch not-trivial
>    cases. I agree that SE should be always available to a LoopNest pass. The
>    LoopNest analysis should be available to a LoopNest pass manager, and a
>    LoopNest pass IMO should operate on a LoopNest IR unit rather than a Loop.
>
>    Ettore Tiotto
>    IBM Canada Laboratory, 8200 Warden Ave, Markham, ON L6G 1C7, Canada
> *etiotto at ca.ibm.com* <etiotto at ca.ibm.com> -- Phone: (905) 413-2387
>
>    “No great discovery was ever made without a bold guess.” - Isaac Newton
>
>
>    ----- Original message -----
>    From: Whitney T Tsang/Toronto/IBM
>    To: Ta-Wei Tu <*tu.da.wei at gmail.com* <tu.da.wei at gmail.com>>
>    Cc: llvm-dev <*llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>>,
>    Whitney Tsang <*whitney.uwaterloo at gmail.com*
>    <whitney.uwaterloo at gmail.com>>, Ettore Tiotto/Toronto/IBM at IBMCA
>    Subject: Re: [EXTERNAL] Re: [llvm-dev] Regarding the project "Create
>    LoopNestPass"
>    Date: Sat, Jul 18, 2020 3:32 PM
>
>    Hi Ta-Wei,
>
>    > We might also need a LNPMUpdater (LoopNestPassManagerUpdater) which
>    disallows adding inner-loops back into the pipeline, and
>    LoopNestPassManager will simply be PassManager<Loop, LoopAnalysisManager,
>    LoopStandardAnalysisResult &, LNPMUpdater &>.
>
>    LNPMUpdater should have some functionalities of LPMUpdater, e.g.
>    adding sibling loop nest, revisit the current loop nest, etc.
>
>    > One question I have is whether the IRUnit LoopNestPass operates on
>    should be Loop or LoopNest, since I'm not quite sure about the usage of
>    LoopNest and why it should be constructed with a ScalarEvolution.
>
>    That's a good point, we can make ScalarEvolution optional for
>    LoopNest. Currently, the only use case is to check if the loop nest is
>    perfect, which can provide a more conservative result if ScalarEvolution is
>    not given.
>    Having said that, ScalarEvolution is one of the analyses in
>    LoopStandardAnalysisResults, so all LoopPasses already have access to
>    ScalarEvolution.
>    LoopNest provides some useful utilities, although it is still not at a
>    manual phrase.
>    My personal opinion is all the mechanism of the LoopNest,
>    e.g. LoopNestPassManager, LPMUpdater, etc, should operates on Loop. While
>    IRUnitT which is used by loop nest transformations/analyses should operates
>    on LoopNest.
>    @etiotto What's your opinion on that?
>
>    > Also, it is stated that "we want to create a LoopNestPass, where
>    transformations intended for loop nest can inherit from it" in the original
>    GSoC project description, but I believe that inheriting from a Pass
>    subclass is no longer required in the New Pass Manager. So should we also
>    implement a LoopNestPass subclass that allows implementing loop-nest-passes
>    for the Legacy Pass Manager?
>
>    Right, the wording should be corrected. Given that the New Pass
>    Manager will soon be the default Pass Manager, we should not spend extra
>    effort to create LoopNestPass in Legacy Pass Manager.
>
>    > Finally, I have some questions that might not be very relevant to
>    the project. But currently, how does the LegacyPassManager and the
>    NewPassManager interact? Also, is it possible to add passes designed for
>    LegacyPassManager into the NewPassManager and vice versa?
>
>    Most transformations have both for LegacyPassManager and
>    NewPassManager, and have the actual implementation of the transformations
>    in a separate class, or a static function that can be call by both.
>    e.g. LoopFuseLegacy is for LegacyPassManager , *LoopFusePass*
>    <https://llvm.org/doxygen/classllvm_1_1LoopFusePass.html#a971f40ada3f1410759faede02bfbace7> is
>    for NewPassManager, and both create LoopFuser and do the transformation
>    there.
>
>    Looking forward to your first patch!
>
>    Regards,
>    Whitney Tsang
>
>
>    Ta-Wei Tu ---2020/07/18 07:38:44 AM---Hi, Thanks for your help! I've
>    checked the sources that you mentioned.
>
>    From: Ta-Wei Tu <*tu.da.wei at gmail.com* <tu.da.wei at gmail.com>>
>    To: Whitney Tsang <*whitney.uwaterloo at gmail.com*
>    <whitney.uwaterloo at gmail.com>>
>    Cc: llvm-dev <*llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>>,
>    *whitneyt at ca.ibm.com* <whitneyt at ca.ibm.com>
>    Date: 2020/07/18 07:38 AM
>    Subject: [EXTERNAL] Re: [llvm-dev] Regarding the project "Create
>    LoopNestPass"
>    ------------------------------
>
>
>
>    Hi,
>
>    Thanks for your help! I've checked the sources that you mentioned.
>    Currently, I think that I would need to implement a
>    FunctionToLoopNestPassAdaptor which is essentially the same as the
>    FunctionToLoopPassAdaptor but operates only on LI.getTopLevelLoops().
>
>    We might also need a LNPMUpdater (LoopNestPassManagerUpdater) which
>    disallows adding inner-loops back into the pipeline, and
>    LoopNestPassManager will simply be PassManager<Loop, LoopAnalysisManager,
>    LoopStandardAnalysisResult &, LNPMUpdater &>.
>
>    One question I have is whether the IRUnit LoopNestPass operates on
>    should be Loop or LoopNest, since I'm not quite sure about the usage of
>    LoopNest and why it should be constructed with a ScalarEvolution.
>
>    Also, it is stated that "we want to create a LoopNestPass, where
>    transformations intended for loop nest can inherit from it" in the original
>    GSoC project description, but I believe that inheriting from a Pass
>    subclass is no longer required in the New Pass Manager. So should we also
>    implement a LoopNestPass subclass that allows implementing loop-nest-passes
>    for the Legacy Pass Manager?
>
>    Finally, I have some questions that might not be very relevant to the
>    project. But currently, how does the LegacyPassManager and the
>    NewPassManager interact? Also, is it possible to add passes designed for
>    LegacyPassManager into the NewPassManager and vice versa?
>
>    What do you think about the plan? I'm quite likely to miss something
>    important, so please kindly correct me if I'm in the wrong direction.
>
>    Thank you very much!
>    Sincerely, Ta-Wei Tu
>
>    Whitney Tsang <*whitney.uwaterloo at gmail.com*
>    <whitney.uwaterloo at gmail.com>> 於 2020年7月15日 週三 下午6:14寫道:
>    Hi Wayne,
>
>    As far as I know, no one is working on this project. Your contribution
>    is always appreciated.
>
>    This project aims to create LoopNestPass in the new pass manager (NPM).
>    In *https://www.youtube.com/watch?v=3pRhvQi7Z10*
>    <https://www.youtube.com/watch?v=3pRhvQi7Z10> , you can try to follow
>    along to create a LLVM loop pass in NPM.
>
>    There exist different kinds of passes in the NPM, e.g. ModulePass,
>    FunctionPass, LoopPass.
>    One or more loop passes can be added in a LoopPassManager, which then
>    can be added in FunctionPassManager through
>    createFunctionToLoopPassAdaptor.
>    Examples can be found in llvm/lib/Passes/PassBuilder.cpp.
>    There exist passes that best operate as a loop nest, e.g.
>    LoopInterchange. For those passes, currently can be written as either
>    FunctionPass or LoopPass.
>    However, choosing one or the other needs to sacrifice the ability of
>    the other.
>    The idea of a LoopNestPass is to combine the benefits of FunctionPass
>    and LoopPass needed for a loop nest.
>
>    On top of LoopNest I would suggest to also get familiar with different
>    PassAdaptor classes (e.g. FunctionToLoopPassAdaptor).
>    - llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
>
>    I am happy to provide feedback once you have a plan of how to proceed,
>    or review your patches on Phabricator.
>
>    Regards,
>    Whitney Tsang
>
>    On Wed, Jul 15, 2020 at 5:49 AM Wayne Tu via llvm-dev <
>    *llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>> wrote:
>    Hi,
>
>    I'm a college student who is quite new to the community and is
>    interested in contributing to the LLVM project. Although I haven't applied
>    to GSoC, I notice that the project "Create LoopNestPass" seems to be
>    unassigned.
>    So I'm curious whether anyone is currently working on it, and if not,
>    is it possible for me to work on it as a side-project?
>
>    I've been programming in C++ for quite a while, and I've walked
>    through the `LoopPass`, `LoopNest`, and some other LLVM classes that I
>    think would probably be related to this project. I've also watched some of
>    the videos in the llvm-dev conference regarding loops, so I now have a
>    rough idea on how to implement the LoopNestPass.
>
>    I'm looking forward to working on this project.
>
>    Thank you very much.
>
>    Sincerely,
>    Ta-Wei Tu
>    _______________________________________________
>    LLVM Developers mailing list
> *llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>
> *https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev*
>    <https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200730/cbd93878/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: graycol.gif
Type: image/gif
Size: 105 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200730/cbd93878/attachment.gif>


More information about the llvm-dev mailing list