Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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