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
23namespace llvm {
24
25class AAResults;
26class Function;
27class Module;
28class Pass;
29
30/// The three kinds of memory access relevant to 'readonly' and
31/// 'readnone' attributes.
32enum 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.
40MemoryAccessKind 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.
51struct 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.
58Pass *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.
70class ReversePostOrderFunctionAttrsPass
71 : public PassInfoMixin<ReversePostOrderFunctionAttrsPass> {
72public:
73 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
74};
75
76} // end namespace llvm
77
78#endif // LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H
79