[llvm] r272505 - [PM] Port ReversePostOrderFunctionAttrs to the new PM

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 12 02:28:08 PDT 2016


On Sun, Jun 12, 2016 at 12:48 AM, Sean Silva via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: silvas
> Date: Sun Jun 12 02:48:51 2016
> New Revision: 272505
>
> URL: http://llvm.org/viewvc/llvm-project?rev=272505&view=rev
> Log:
> [PM] Port ReversePostOrderFunctionAttrs to the new PM
>
> Below are my super rough notes when porting. They can probably serve as
> a basic guide for porting other passes to the new PM. As I port more
> passes I'll expand and generalize this and make a proper
> docs/HowToPortToNewPassManager.rst document. There is also missing
> documentation for general concepts and API's in the new PM which will
> require some documentation.
> Once there is proper documentation in place we can put up a list of
> passes that have to be ported and game-ify/crowdsource the rest of the
> porting (at least of the middle end; the backend is still unclear).
>
> I will however be taking personal responsibility for ensuring that the
> LLD/ELF LTO pipeline is ported in a timely fashion. The remaining passes
> to be ported are (do something like
> `git grep "<the string in the bullet point below>"` to find the pass):
>
> General Scalar:
> [ ] Simplify the CFG
>

Just noticed the simplifycfg is already ported. So scratch that one off the
list.

-- Sean Silva


> [ ] Jump Threading
> [ ] MemCpy Optimization
> [ ] Promote Memory to Register
> [ ] MergedLoadStoreMotion
> [ ] Lazy Value Information Analysis
>
> General IPO:
> [ ] Dead Argument Elimination
> [ ] Deduce function attributes in RPO
>
> Loop stuff / vectorization stuff:
> [ ] Alignment from assumptions
> [ ] Canonicalize natural loops
> [ ] Delete dead loops
> [ ] Loop Access Analysis
> [ ] Loop Invariant Code Motion
> [ ] Loop Vectorization
> [ ] SLP Vectorizer
> [ ] Unroll loops
>
> Devirtualization / CFI:
> [ ] Cross-DSO CFI
> [ ] Whole program devirtualization
> [ ] Lower bitset metadata
>
> CGSCC passes:
> [ ] Function Integration/Inlining
> [ ] Remove unused exception handling info
> [ ] Promote 'by reference' arguments to scalars
>
> Please let me know if you are interested in working on any of the passes
> in the above list (e.g. reply to the post-commit thread for this patch).
> I'll probably be tackling "General Scalar" and "General IPO" first FWIW.
>
> Steps as I port "Deduce function attributes in RPO"
> ---------------------------------------------------
>
> (note: if you are doing any work based on these notes, please leave a
> note in the post-commit review thread for this commit with any
> improvements / suggestions / incompleteness you ran into!)
>
> Note: "Deduce function attributes in RPO" is a module pass.
>
> 1. Do preparatory refactoring.
>
> Do preparatory factoring. In this case all I had to do was to pull out a
> static helper (r272503).
> (TODO: give more advice here e.g. if pass holds state or something)
>
> 2. Rename the old pass class.
>
> llvm/lib/Transforms/IPO/FunctionAttrs.cpp
> Rename class ReversePostOrderFunctionAttrs ->
> ReversePostOrderFunctionAttrsLegacyPass
> in preparation for adding a class ReversePostOrderFunctionAttrs as the
> pass in the new PM.
> (edit: actually wait what? The new class name will be
> ReversePostOrderFunctionAttrsPass, so it doesn't conflict. So this step is
> sort of useless churn).
>
> llvm/include/llvm/InitializePasses.h
> llvm/lib/LTO/LTOCodeGenerator.cpp
> llvm/lib/Transforms/IPO/IPO.cpp
> llvm/lib/Transforms/IPO/FunctionAttrs.cpp
> Rename initializeReversePostOrderFunctionAttrsPass ->
> initializeReversePostOrderFunctionAttrsLegacyPassPass
> (note that the "PassPass" thing falls out of
> `s/ReversePostOrderFunctionAttrs/ReversePostOrderFunctionAttrsLegacyPass/`)
> Note that the INITIALIZE_PASS macro is what creates this identifier name,
> so renaming the class requires this renaming too.
>
> Note that createReversePostOrderFunctionAttrsPass does not need to be
> renamed since its name is not generated from the class name.
>
> 3. Add the new PM pass class.
>
> In the new PM all passes need to have their
> declaration in a header somewhere, so you will often need to add a header.
> In this case
> llvm/include/llvm/Transforms/IPO/FunctionAttrs.h is already there because
> PostOrderFunctionAttrsPass was already ported.
> The file-level comment from the .cpp file can be used as the file-level
> comment for the new header. You may want to tweak the wording slightly
> from "this file implements" to "this file provides" or similar.
>
> Add declaration for the new PM pass in this header:
>
>     class ReversePostOrderFunctionAttrsPass
>         : public PassInfoMixin<ReversePostOrderFunctionAttrsPass> {
>     public:
>       PreservedAnalyses run(Module &M, AnalysisManager<Module> &AM);
>     };
>
> Its name should end with `Pass` for consistency (note that this doesn't
> collide with the names of most old PM passes). E.g. call it
> `<name of the old PM pass>Pass`.
>
> Also, move the doxygen comment from the old PM pass to the declaration of
> this class in the header.
> Also, include the declaration for the new PM class
> `llvm/Transforms/IPO/FunctionAttrs.h` at the top of the file (in this case,
> it was already done when the other pass in this file was ported).
>
> Now define the `run` method for the new class.
> The main things here are:
> a) Use AM.getResult<...>(M) to get results instead of `getAnalysis<...>()`
>
> b) If the old PM pass would have returned "false" (i.e. `Changed ==
> false`), then you should return PreservedAnalyses::all();
>
> c) In the old PM getAnalysisUsage method, observe the calls
>    `AU.addPreserved<...>();`.
>
>    In the case `Changed == true`, for each preserved analysis you should do
>    call `PA.preserve<...>()` on a PreservedAnalyses object and return it.
>    E.g.:
>
>        PreservedAnalyses PA;
>        PA.preserve<CallGraphAnalysis>();
>        return PA;
>
> Note that calls to skipModule/skipFunction are not supported in the new PM
> currently, so optnone and optimization bisect support do not work. You can
> just drop those calls for now.
>
> 4. Add the pass to the new PM pass registry to make it available in opt.
>
> In llvm/lib/Passes/PassBuilder.cpp add a #include for your header.
> `#include "llvm/Transforms/IPO/FunctionAttrs.h"`
> In this case there is already an include (from when
> PostOrderFunctionAttrsPass was ported).
>
> Add your pass to llvm/lib/Passes/PassRegistry.def
> In this case, I added
> `MODULE_PASS("rpo-functionattrs", ReversePostOrderFunctionAttrsPass())`
> The string is from the `INITIALIZE_PASS*` macros used in the old pass
> manager.
>
> Then choose a test that uses the pass and use the new PM `-passes=...` to
> run it.
> E.g. in this case there is a test that does:
> ; RUN: opt < %s -basicaa -functionattrs -rpo-functionattrs -S | FileCheck
> %s
> I have added the line:
> ; RUN: opt < %s -aa-pipeline=basic-aa
> -passes='require<targetlibinfo>,cgscc(function-attrs),rpo-functionattrs' -S
> | FileCheck %s
> The `-aa-pipeline=basic-aa` and
> `require<targetlibinfo>,cgscc(function-attrs)` are what is needed to run
> functionattrs in the new PM (note that in the new PM "functionattrs"
> becomes "function-attrs" for some reason). This is just pulled from
> `readattrs.ll` which contains the change from when functionattrs was ported
> to the new PM.
> Adding rpo-functionattrs causes the pass that was just ported to run.
>
> Modified:
>     llvm/trunk/include/llvm/InitializePasses.h
>     llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h
>     llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
>     llvm/trunk/lib/Passes/PassRegistry.def
>     llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp
>     llvm/trunk/lib/Transforms/IPO/IPO.cpp
>     llvm/trunk/test/Transforms/FunctionAttrs/norecurse.ll
>
> Modified: llvm/trunk/include/llvm/InitializePasses.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=272505&r1=272504&r2=272505&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/InitializePasses.h (original)
> +++ llvm/trunk/include/llvm/InitializePasses.h Sun Jun 12 02:48:51 2016
> @@ -279,7 +279,7 @@ void initializeRegionPrinterPass(PassReg
>  void initializeRegionViewerPass(PassRegistry&);
>  void initializeRegisterCoalescerPass(PassRegistry&);
>  void initializeRenameIndependentSubregsPass(PassRegistry&);
> -void initializeReversePostOrderFunctionAttrsPass(PassRegistry&);
> +void initializeReversePostOrderFunctionAttrsLegacyPassPass(PassRegistry&);
>  void initializeRewriteStatepointsForGCPass(PassRegistry&);
>  void initializeRewriteSymbolsPass(PassRegistry&);
>  void initializeSCCPLegacyPassPass(PassRegistry &);
>
> Modified: llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h?rev=272505&r1=272504&r2=272505&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h (original)
> +++ llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h Sun Jun 12
> 02:48:51 2016
> @@ -37,6 +37,21 @@ struct PostOrderFunctionAttrsPass : Pass
>  /// in post-order.
>  Pass *createPostOrderFunctionAttrsLegacyPass();
>
> +/// A pass to do RPO deduction and propagation of function attributes.
> +///
> +/// This pass provides a general RPO or "top down" propagation of
> +/// function attributes. For a few (rare) cases, we can deduce
> significantly
> +/// more about function attributes by working in RPO, so this pass
> +/// provides the compliment to the post-order pass above where the
> majority of
> +/// deduction is performed.
> +// FIXME: Currently there is no RPO CGSCC pass structure to slide into
> and so
> +// this is a boring module pass, but eventually it should be an RPO CGSCC
> pass
> +// when such infrastructure is available.
> +class ReversePostOrderFunctionAttrsPass
> +    : public PassInfoMixin<ReversePostOrderFunctionAttrsPass> {
> +public:
> +  PreservedAnalyses run(Module &M, AnalysisManager<Module> &AM);
> +};
>  }
>
>  #endif // LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H
>
> Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=272505&r1=272504&r2=272505&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Sun Jun 12 02:48:51 2016
> @@ -122,7 +122,7 @@ void LTOCodeGenerator::initializeLTOPass
>    initializeSROA_DTPass(R);
>    initializeSROA_SSAUpPass(R);
>    initializePostOrderFunctionAttrsLegacyPassPass(R);
> -  initializeReversePostOrderFunctionAttrsPass(R);
> +  initializeReversePostOrderFunctionAttrsLegacyPassPass(R);
>    initializeGlobalsAAWrapperPassPass(R);
>    initializeLICMPass(R);
>    initializeMergedLoadStoreMotionPass(R);
>
> Modified: llvm/trunk/lib/Passes/PassRegistry.def
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=272505&r1=272504&r2=272505&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassRegistry.def (original)
> +++ llvm/trunk/lib/Passes/PassRegistry.def Sun Jun 12 02:48:51 2016
> @@ -56,6 +56,7 @@ MODULE_PASS("print-profile-summary", Pro
>  MODULE_PASS("print-callgraph", CallGraphPrinterPass(dbgs()))
>  MODULE_PASS("print", PrintModulePass(dbgs()))
>  MODULE_PASS("print-lcg", LazyCallGraphPrinterPass(dbgs()))
> +MODULE_PASS("rpo-functionattrs", ReversePostOrderFunctionAttrsPass())
>  MODULE_PASS("sample-profile", SampleProfileLoaderPass())
>  MODULE_PASS("strip-dead-prototypes", StripDeadPrototypesPass())
>  MODULE_PASS("verify", VerifierPass())
>
> Modified: llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp?rev=272505&r1=272504&r2=272505&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp Sun Jun 12 02:48:51
> 2016
> @@ -1137,20 +1137,10 @@ bool PostOrderFunctionAttrsLegacyPass::r
>  }
>
>  namespace {
> -/// A pass to do RPO deduction and propagation of function attributes.
> -///
> -/// This pass provides a general RPO or "top down" propagation of
> -/// function attributes. For a few (rare) cases, we can deduce
> significantly
> -/// more about function attributes by working in RPO, so this pass
> -/// provides the compliment to the post-order pass above where the
> majority of
> -/// deduction is performed.
> -// FIXME: Currently there is no RPO CGSCC pass structure to slide into
> and so
> -// this is a boring module pass, but eventually it should be an RPO CGSCC
> pass
> -// when such infrastructure is available.
> -struct ReversePostOrderFunctionAttrs : public ModulePass {
> +struct ReversePostOrderFunctionAttrsLegacyPass : public ModulePass {
>    static char ID; // Pass identification, replacement for typeid
> -  ReversePostOrderFunctionAttrs() : ModulePass(ID) {
> -
> initializeReversePostOrderFunctionAttrsPass(*PassRegistry::getPassRegistry());
> +  ReversePostOrderFunctionAttrsLegacyPass() : ModulePass(ID) {
> +
> initializeReversePostOrderFunctionAttrsLegacyPassPass(*PassRegistry::getPassRegistry());
>    }
>
>    bool runOnModule(Module &M) override;
> @@ -1163,15 +1153,15 @@ struct ReversePostOrderFunctionAttrs : p
>  };
>  }
>
> -char ReversePostOrderFunctionAttrs::ID = 0;
> -INITIALIZE_PASS_BEGIN(ReversePostOrderFunctionAttrs, "rpo-functionattrs",
> +char ReversePostOrderFunctionAttrsLegacyPass::ID = 0;
> +INITIALIZE_PASS_BEGIN(ReversePostOrderFunctionAttrsLegacyPass,
> "rpo-functionattrs",
>                        "Deduce function attributes in RPO", false, false)
>  INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass)
> -INITIALIZE_PASS_END(ReversePostOrderFunctionAttrs, "rpo-functionattrs",
> +INITIALIZE_PASS_END(ReversePostOrderFunctionAttrsLegacyPass,
> "rpo-functionattrs",
>                      "Deduce function attributes in RPO", false, false)
>
>  Pass *llvm::createReversePostOrderFunctionAttrsPass() {
> -  return new ReversePostOrderFunctionAttrs();
> +  return new ReversePostOrderFunctionAttrsLegacyPass();
>  }
>
>  static bool addNoRecurseAttrsTopDown(Function &F) {
> @@ -1229,7 +1219,7 @@ static bool deduceFunctionAttributeInRPO
>    return Changed;
>  }
>
> -bool ReversePostOrderFunctionAttrs::runOnModule(Module &M) {
> +bool ReversePostOrderFunctionAttrsLegacyPass::runOnModule(Module &M) {
>    if (skipModule(M))
>      return false;
>
> @@ -1237,3 +1227,15 @@ bool ReversePostOrderFunctionAttrs::runO
>
>    return deduceFunctionAttributeInRPO(M, CG);
>  }
> +
> +PreservedAnalyses
> +ReversePostOrderFunctionAttrsPass::run(Module &M, AnalysisManager<Module>
> &AM) {
> +  auto &CG = AM.getResult<CallGraphAnalysis>(M);
> +
> +  bool Changed = deduceFunctionAttributeInRPO(M, CG);
> +  if (!Changed)
> +    return PreservedAnalyses::all();
> +  PreservedAnalyses PA;
> +  PA.preserve<CallGraphAnalysis>();
> +  return PA;
> +}
>
> Modified: llvm/trunk/lib/Transforms/IPO/IPO.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/IPO.cpp?rev=272505&r1=272504&r2=272505&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/IPO.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/IPO.cpp Sun Jun 12 02:48:51 2016
> @@ -43,7 +43,7 @@ void llvm::initializeIPO(PassRegistry &R
>    initializeMergeFunctionsPass(Registry);
>    initializePartialInlinerPass(Registry);
>    initializePostOrderFunctionAttrsLegacyPassPass(Registry);
> -  initializeReversePostOrderFunctionAttrsPass(Registry);
> +  initializeReversePostOrderFunctionAttrsLegacyPassPass(Registry);
>    initializePruneEHPass(Registry);
>    initializeStripDeadPrototypesLegacyPassPass(Registry);
>    initializeStripSymbolsPass(Registry);
>
> Modified: llvm/trunk/test/Transforms/FunctionAttrs/norecurse.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/FunctionAttrs/norecurse.ll?rev=272505&r1=272504&r2=272505&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/FunctionAttrs/norecurse.ll (original)
> +++ llvm/trunk/test/Transforms/FunctionAttrs/norecurse.ll Sun Jun 12
> 02:48:51 2016
> @@ -1,4 +1,5 @@
>  ; RUN: opt < %s -basicaa -functionattrs -rpo-functionattrs -S | FileCheck
> %s
> +; RUN: opt < %s -aa-pipeline=basic-aa
> -passes='require<targetlibinfo>,cgscc(function-attrs),rpo-functionattrs' -S
> | FileCheck %s
>
>  ; CHECK: define i32 @leaf() #0
>  define i32 @leaf() {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160612/e87f996b/attachment.html>


More information about the llvm-commits mailing list