1 | //===- FunctionAttrs.h - Compute function attributes ------------*- C++ -*-===// |
2 | // |
3 | // The LLVM Compiler Infrastructure |
4 | // |
5 | // This file is distributed under the University of Illinois Open Source |
6 | // License. See LICENSE.TXT for details. |
7 | // |
8 | //===----------------------------------------------------------------------===// |
9 | // |
10 | /// \file |
11 | /// Provides passes for computing function attributes based on interprocedural |
12 | /// analyses. |
13 | // |
14 | //===----------------------------------------------------------------------===// |
15 | |
16 | #ifndef LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H |
17 | #define LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H |
18 | |
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 AAResults; |
26 | class Function; |
27 | class Module; |
28 | class Pass; |
29 | |
30 | /// The three kinds of memory access relevant to 'readonly' and |
31 | /// 'readnone' attributes. |
32 | enum MemoryAccessKind { |
33 | MAK_ReadNone = 0, |
34 | MAK_ReadOnly = 1, |
35 | MAK_MayWrite = 2, |
36 | MAK_WriteOnly = 3 |
37 | }; |
38 | |
39 | /// Returns the memory access properties of this copy of the function. |
40 | MemoryAccessKind computeFunctionBodyMemoryAccess(Function &F, AAResults &AAR); |
41 | |
42 | /// Computes function attributes in post-order over the call graph. |
43 | /// |
44 | /// By operating in post-order, this pass computes precise attributes for |
45 | /// called functions prior to processsing their callers. This "bottom-up" |
46 | /// approach allows powerful interprocedural inference of function attributes |
47 | /// like memory access patterns, etc. It can discover functions that do not |
48 | /// access memory, or only read memory, and give them the readnone/readonly |
49 | /// attribute. It also discovers function arguments that are not captured by |
50 | /// the function and marks them with the nocapture attribute. |
51 | struct PostOrderFunctionAttrsPass : PassInfoMixin<PostOrderFunctionAttrsPass> { |
52 | PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM, |
53 | LazyCallGraph &CG, CGSCCUpdateResult &UR); |
54 | }; |
55 | |
56 | /// Create a legacy pass manager instance of a pass to compute function attrs |
57 | /// in post-order. |
58 | Pass *createPostOrderFunctionAttrsLegacyPass(); |
59 | |
60 | /// A pass to do RPO deduction and propagation of function attributes. |
61 | /// |
62 | /// This pass provides a general RPO or "top down" propagation of |
63 | /// function attributes. For a few (rare) cases, we can deduce significantly |
64 | /// more about function attributes by working in RPO, so this pass |
65 | /// provides the complement to the post-order pass above where the majority of |
66 | /// deduction is performed. |
67 | // FIXME: Currently there is no RPO CGSCC pass structure to slide into and so |
68 | // this is a boring module pass, but eventually it should be an RPO CGSCC pass |
69 | // when such infrastructure is available. |
70 | class ReversePostOrderFunctionAttrsPass |
71 | : public PassInfoMixin<ReversePostOrderFunctionAttrsPass> { |
72 | public: |
73 | PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); |
74 | }; |
75 | |
76 | } // end namespace llvm |
77 | |
78 | #endif // LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H |
79 | |