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

Whitney T Tsang via llvm-dev llvm-dev at lists.llvm.org
Sat Jul 18 12:32:10 PDT 2020


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 is for
NewPassManager, and both create LoopFuser and do the transformation there.

Looking forward to your first patch!

Regards,
Whitney Tsang




From:	Ta-Wei Tu <tu.da.wei at gmail.com>
To:	Whitney Tsang <whitney.uwaterloo at gmail.com>
Cc:	llvm-dev <llvm-dev at lists.llvm.org>, 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> 於 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 , 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> 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
   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/20200718/48f05473/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/20200718/48f05473/attachment.gif>


More information about the llvm-dev mailing list