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

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 12 10:03:23 PDT 2016


Sean, thanks for working on this.


> Loop stuff / vectorization stuff:
> [ ] Alignment from assumptions
> [ ] Canonicalize natural loops
> [ ] Delete dead loops
> [ ] Loop Access Analysis
>

I started working on Loop Access Analysis which many loop related
transformation passes depend on. The first part of the changes was checked
in rr272194, but reverted in r272243.  You can probably chime in review
D20560 and make discussion going there (many of the discussions there are
not in Phab).



> [ ] 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
>


Nice -- can you prioritize this one ? :)


> [ ] 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 F


We should get the loop access analysis issue resolved so that many loop
passes can be unlocked ..


thanks,

David


> 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/da29c74f/attachment.html>


More information about the llvm-commits mailing list