diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/InitializePasses.h | 2 | ||||
| -rw-r--r-- | llvm/include/llvm/Transforms/IPO/FunctionAttrs.h | 15 | ||||
| -rw-r--r-- | llvm/lib/LTO/LTOCodeGenerator.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Passes/PassRegistry.def | 1 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/FunctionAttrs.cpp | 38 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/IPO.cpp | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/FunctionAttrs/norecurse.ll | 1 | 
7 files changed, 40 insertions, 21 deletions
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 7510d43cbba..6eed4246140 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -279,7 +279,7 @@ void initializeRegionPrinterPass(PassRegistry&);  void initializeRegionViewerPass(PassRegistry&);  void initializeRegisterCoalescerPass(PassRegistry&);  void initializeRenameIndependentSubregsPass(PassRegistry&); -void initializeReversePostOrderFunctionAttrsPass(PassRegistry&); +void initializeReversePostOrderFunctionAttrsLegacyPassPass(PassRegistry&);  void initializeRewriteStatepointsForGCPass(PassRegistry&);  void initializeRewriteSymbolsPass(PassRegistry&);  void initializeSCCPLegacyPassPass(PassRegistry &); diff --git a/llvm/include/llvm/Transforms/IPO/FunctionAttrs.h b/llvm/include/llvm/Transforms/IPO/FunctionAttrs.h index 83fad94ef84..c44cc43fc0f 100644 --- a/llvm/include/llvm/Transforms/IPO/FunctionAttrs.h +++ b/llvm/include/llvm/Transforms/IPO/FunctionAttrs.h @@ -37,6 +37,21 @@ struct PostOrderFunctionAttrsPass : PassInfoMixin<PostOrderFunctionAttrsPass> {  /// 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 diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp index 52634652932..4f556f9da03 100644 --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -122,7 +122,7 @@ void LTOCodeGenerator::initializeLTOPasses() {    initializeSROA_DTPass(R);    initializeSROA_SSAUpPass(R);    initializePostOrderFunctionAttrsLegacyPassPass(R); -  initializeReversePostOrderFunctionAttrsPass(R); +  initializeReversePostOrderFunctionAttrsLegacyPassPass(R);    initializeGlobalsAAWrapperPassPass(R);    initializeLICMPass(R);    initializeMergedLoadStoreMotionPass(R); diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index b72fcad5c54..34d09a21082 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -56,6 +56,7 @@ MODULE_PASS("print-profile-summary", ProfileSummaryPrinterPass(dbgs()))  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()) diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp index 7c14c20ba89..f437235a28d 100644 --- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp @@ -1137,20 +1137,10 @@ bool PostOrderFunctionAttrsLegacyPass::runOnSCC(CallGraphSCC &SCC) {  }  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 : public ModulePass {  };  } -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(Module &M, CallGraph &CG) {    return Changed;  } -bool ReversePostOrderFunctionAttrs::runOnModule(Module &M) { +bool ReversePostOrderFunctionAttrsLegacyPass::runOnModule(Module &M) {    if (skipModule(M))      return false; @@ -1237,3 +1227,15 @@ bool ReversePostOrderFunctionAttrs::runOnModule(Module &M) {    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; +} diff --git a/llvm/lib/Transforms/IPO/IPO.cpp b/llvm/lib/Transforms/IPO/IPO.cpp index 157a24e7d29..c80f08787bf 100644 --- a/llvm/lib/Transforms/IPO/IPO.cpp +++ b/llvm/lib/Transforms/IPO/IPO.cpp @@ -43,7 +43,7 @@ void llvm::initializeIPO(PassRegistry &Registry) {    initializeMergeFunctionsPass(Registry);    initializePartialInlinerPass(Registry);    initializePostOrderFunctionAttrsLegacyPassPass(Registry); -  initializeReversePostOrderFunctionAttrsPass(Registry); +  initializeReversePostOrderFunctionAttrsLegacyPassPass(Registry);    initializePruneEHPass(Registry);    initializeStripDeadPrototypesLegacyPassPass(Registry);    initializeStripSymbolsPass(Registry); diff --git a/llvm/test/Transforms/FunctionAttrs/norecurse.ll b/llvm/test/Transforms/FunctionAttrs/norecurse.ll index 221b539655a..d3dac3f6687 100644 --- a/llvm/test/Transforms/FunctionAttrs/norecurse.ll +++ b/llvm/test/Transforms/FunctionAttrs/norecurse.ll @@ -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() {  | 

