Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- FunctionAttrs.h - Compute function attributes ------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. /// \file
  10. /// Provides passes for computing function attributes based on interprocedural
  11. /// analyses.
  12. //
  13. //===----------------------------------------------------------------------===//
  14.  
  15. #ifndef LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H
  16. #define LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H
  17.  
  18. #include "llvm/Analysis/AliasAnalysis.h"
  19. #include "llvm/Analysis/CGSCCPassManager.h"
  20. #include "llvm/Analysis/LazyCallGraph.h"
  21. #include "llvm/IR/PassManager.h"
  22.  
  23. namespace llvm {
  24.  
  25. class GlobalValueSummary;
  26. class ModuleSummaryIndex;
  27. class Function;
  28. class Module;
  29. class Pass;
  30.  
  31. /// Returns the memory access properties of this copy of the function.
  32. MemoryEffects computeFunctionBodyMemoryAccess(Function &F, AAResults &AAR);
  33.  
  34. /// Propagate function attributes for function summaries along the index's
  35. /// callgraph during thinlink
  36. bool thinLTOPropagateFunctionAttrs(
  37.     ModuleSummaryIndex &Index,
  38.     function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
  39.         isPrevailing);
  40.  
  41. /// Computes function attributes in post-order over the call graph.
  42. ///
  43. /// By operating in post-order, this pass computes precise attributes for
  44. /// called functions prior to processsing their callers. This "bottom-up"
  45. /// approach allows powerful interprocedural inference of function attributes
  46. /// like memory access patterns, etc. It can discover functions that do not
  47. /// access memory, or only read memory, and give them the readnone/readonly
  48. /// attribute. It also discovers function arguments that are not captured by
  49. /// the function and marks them with the nocapture attribute.
  50. struct PostOrderFunctionAttrsPass : PassInfoMixin<PostOrderFunctionAttrsPass> {
  51.   PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM,
  52.                         LazyCallGraph &CG, CGSCCUpdateResult &UR);
  53. };
  54.  
  55. /// Create a legacy pass manager instance of a pass to compute function attrs
  56. /// in post-order.
  57. Pass *createPostOrderFunctionAttrsLegacyPass();
  58.  
  59. /// A pass to do RPO deduction and propagation of function attributes.
  60. ///
  61. /// This pass provides a general RPO or "top down" propagation of
  62. /// function attributes. For a few (rare) cases, we can deduce significantly
  63. /// more about function attributes by working in RPO, so this pass
  64. /// provides the complement to the post-order pass above where the majority of
  65. /// deduction is performed.
  66. // FIXME: Currently there is no RPO CGSCC pass structure to slide into and so
  67. // this is a boring module pass, but eventually it should be an RPO CGSCC pass
  68. // when such infrastructure is available.
  69. class ReversePostOrderFunctionAttrsPass
  70.     : public PassInfoMixin<ReversePostOrderFunctionAttrsPass> {
  71. public:
  72.   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
  73. };
  74.  
  75. } // end namespace llvm
  76.  
  77. #endif // LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H
  78.