[llvm] r272505 - [PM] Port ReversePostOrderFunctionAttrs to the new PM
Davide Italiano via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 15 14:21:42 PDT 2016
On Wed, Jun 15, 2016 at 3:22 AM, Sean Silva <chisophugis at gmail.com> wrote:
>
>
> 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
>> [ ] 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
>
>
>
> quick update on the status of this list:
>
>
> General Scalar:
> [x] Simplify the CFG --> this one was already ported and should not have
> been included in the original list
> [x] Jump Threading
> [x] MemCpy Optimization
> [x] Promote Memory to Register
> [x] MergedLoadStoreMotion
> [x] Lazy Value Information Analysis
>
> General IPO:
> [x] Dead Argument Elimination
> [x] Deduce function attributes in RPO
>
> Loop stuff / vectorization stuff:
> [x] Alignment from assumptions
> [ ] Canonicalize natural loops --> Should be unblocked for porting.
> [ ] Delete dead loops --> Blocked on having loop deletion API in new
> loop PM (calls markAsRemoved on LoopInfo)
> [ ] Loop Access Analysis --> David is working on this one. In progress at
> http://reviews.llvm.org/D20560. "depends on preparation work to hide strides
> from the LoopAccessInfo creator interface" which it sounds like Adam Nemet
> will get to this week.
> [ ] Loop Invariant Code Motion --> Should be unblocked for porting.
> [ ] Loop Vectorization --> Blocked on "Loop Access Analysis"
> [x] SLP Vectorizer
> [ ] Unroll loops --> Blocked on having loop deletion API in new loop PM
> (calls markAsRemoved on LoopInfo)
>
> Devirtualization / CFI: --> to avoid merge pain, Peter asked us to hold off
> on porting these until his reworking of bitsets is done
> [ ] Cross-DSO CFI
> [ ] Whole program devirtualization
> [ ] Lower bitset metadata
>
> CGSCC passes: --> Exact design of CGSCC is still in the air. Esp. w.r.t.
> what happens when mutating the SCC.
> [ ] Function Integration/Inlining
> [ ] Remove unused exception handling info ---> This one does not mutate
> the SCC.
> [ ] Promote 'by reference' arguments to scalars
>
>
>
> Updated list is as follows:
>
> Loop stuff / vectorization stuff:
> [ ] Canonicalize natural loops --> Should be unblocked for porting.
> [ ] Loop Invariant Code Motion --> Should be unblocked for porting.
> [ ] Loop Access Analysis --> David is working on this one. In progress
I just ported Canonicalize natural loop (currently under review).
http://reviews.llvm.org/D21404
I took a shot at porting LICM today, and noticed that it uses an hook
provided by LPPassManager.
/// Invoke deleteAnalysisLoop hook for all passes that implement simple
/// analysis interface.
void deleteSimpleAnalysisLoop(Loop *L);
I think this needs some new API in the new LoopPM (although I'm not 100% sure).
If this is the case, I'd rather classify this as "blocked on new API".
If not, anybody has ideas on how to translate this to the new PM
logic?
> Blocked on loop deletion API in new PM: --> Blocked on having loop deletion
> API in new loop PM (call markAsRemoved on LoopInfo)
> [ ] Delete dead loops
> [ ] Unroll loops
>
> Devirtualization / CFI: --> to avoid merge pain, Peter asked us to hold off
> on porting these until his reworking of bitsets is done
> [ ] Cross-DSO CFI
> [ ] Whole program devirtualization
> [ ] Lower bitset metadata
>
> CGSCC passes: --> Exact design of CGSCC is still in the air. Esp. w.r.t.
> what happens when mutating the SCC.
> [ ] Function Integration/Inlining
> [ ] Remove unused exception handling info --> This one does not mutate the
> SCC.
> [ ] Promote 'by reference' arguments to scalars
>
> -- Sean Silva
>
>>
>> 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
>
>
More information about the llvm-commits
mailing list