mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
ae65e281f3
to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
78 lines
2.9 KiB
C++
78 lines
2.9 KiB
C++
//===- FunctionAttrs.h - Compute function attributes ------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
/// \file
|
|
/// Provides passes for computing function attributes based on interprocedural
|
|
/// analyses.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H
|
|
#define LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H
|
|
|
|
#include "llvm/Analysis/CGSCCPassManager.h"
|
|
#include "llvm/Analysis/LazyCallGraph.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
|
|
namespace llvm {
|
|
|
|
class AAResults;
|
|
class Function;
|
|
class Module;
|
|
class Pass;
|
|
|
|
/// The three kinds of memory access relevant to 'readonly' and
|
|
/// 'readnone' attributes.
|
|
enum MemoryAccessKind {
|
|
MAK_ReadNone = 0,
|
|
MAK_ReadOnly = 1,
|
|
MAK_MayWrite = 2,
|
|
MAK_WriteOnly = 3
|
|
};
|
|
|
|
/// Returns the memory access properties of this copy of the function.
|
|
MemoryAccessKind computeFunctionBodyMemoryAccess(Function &F, AAResults &AAR);
|
|
|
|
/// Computes function attributes in post-order over the call graph.
|
|
///
|
|
/// By operating in post-order, this pass computes precise attributes for
|
|
/// called functions prior to processsing their callers. This "bottom-up"
|
|
/// approach allows powerful interprocedural inference of function attributes
|
|
/// like memory access patterns, etc. It can discover functions that do not
|
|
/// access memory, or only read memory, and give them the readnone/readonly
|
|
/// attribute. It also discovers function arguments that are not captured by
|
|
/// the function and marks them with the nocapture attribute.
|
|
struct PostOrderFunctionAttrsPass : PassInfoMixin<PostOrderFunctionAttrsPass> {
|
|
PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM,
|
|
LazyCallGraph &CG, CGSCCUpdateResult &UR);
|
|
};
|
|
|
|
/// Create a legacy pass manager instance of a pass to compute function attrs
|
|
/// 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 complement 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, ModuleAnalysisManager &AM);
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_TRANSFORMS_IPO_FUNCTIONATTRS_H
|