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

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 15 14:38:39 PDT 2016


cc'ed  Chandler directly for comments.

David

On Wed, Jun 15, 2016 at 2:21 PM, Davide Italiano via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> 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
> >
> >
> _______________________________________________
> 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/20160615/d9e77376/attachment.html>


More information about the llvm-commits mailing list