a top-down manner into a true top-down or RPO pass over the call graph. There are specific patterns of function attributes, notably the norecurse attribute, which are most effectively propagated top-down because all they us caller information. Walk in RPO over the call graph SCCs takes the form of a module pass run immediately after the CGSCC pass managers postorder walk of the SCCs, trying again to deduce norerucrse for each singular SCC in the call graph. This removes a very legacy pass manager specific trick of using a lazy revisit list traversed during finalization of the CGSCC pass. There is no analogous finalization step in the new pass manager, and a lazy revisit list is just trying to produce an RPO iteration of the call graph. We can do that more directly if more expensively. It seems unlikely that this will be the expensive part of any compilation though as we never examine the function bodies here. Even in an LTO run over a very large module, this should be a reasonable fast set of operations over a reasonably small working set -- the function call graph itself. In the future, if this really is a compile time performance issue, we can look at building support for both post order and RPO traversals directly into a pass manager that builds and maintains the PO list of SCCs. Differential Revision: http://reviews.llvm.org/D15785 llvm-svn: 257163
120 lines
3.8 KiB
C++
120 lines
3.8 KiB
C++
//===-- IPO.cpp -----------------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the common infrastructure (including C bindings) for
|
|
// libLLVMIPO.a, which implements several transformations over the LLVM
|
|
// intermediate representation.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm-c/Initialization.h"
|
|
#include "llvm-c/Transforms/IPO.h"
|
|
#include "llvm/InitializePasses.h"
|
|
#include "llvm/IR/LegacyPassManager.h"
|
|
#include "llvm/Transforms/IPO.h"
|
|
|
|
using namespace llvm;
|
|
|
|
void llvm::initializeIPO(PassRegistry &Registry) {
|
|
initializeArgPromotionPass(Registry);
|
|
initializeConstantMergePass(Registry);
|
|
initializeCrossDSOCFIPass(Registry);
|
|
initializeDAEPass(Registry);
|
|
initializeDAHPass(Registry);
|
|
initializeForceFunctionAttrsLegacyPassPass(Registry);
|
|
initializeGlobalDCEPass(Registry);
|
|
initializeGlobalOptPass(Registry);
|
|
initializeIPCPPass(Registry);
|
|
initializeAlwaysInlinerPass(Registry);
|
|
initializeSimpleInlinerPass(Registry);
|
|
initializeInferFunctionAttrsLegacyPassPass(Registry);
|
|
initializeInternalizePassPass(Registry);
|
|
initializeLoopExtractorPass(Registry);
|
|
initializeBlockExtractorPassPass(Registry);
|
|
initializeSingleLoopExtractorPass(Registry);
|
|
initializeLowerBitSetsPass(Registry);
|
|
initializeMergeFunctionsPass(Registry);
|
|
initializePartialInlinerPass(Registry);
|
|
initializePostOrderFunctionAttrsPass(Registry);
|
|
initializeReversePostOrderFunctionAttrsPass(Registry);
|
|
initializePruneEHPass(Registry);
|
|
initializeStripDeadPrototypesLegacyPassPass(Registry);
|
|
initializeStripSymbolsPass(Registry);
|
|
initializeStripDebugDeclarePass(Registry);
|
|
initializeStripDeadDebugInfoPass(Registry);
|
|
initializeStripNonDebugSymbolsPass(Registry);
|
|
initializeBarrierNoopPass(Registry);
|
|
initializeEliminateAvailableExternallyPass(Registry);
|
|
initializeSampleProfileLoaderPass(Registry);
|
|
initializeFunctionImportPassPass(Registry);
|
|
}
|
|
|
|
void LLVMInitializeIPO(LLVMPassRegistryRef R) {
|
|
initializeIPO(*unwrap(R));
|
|
}
|
|
|
|
void LLVMAddArgumentPromotionPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createArgumentPromotionPass());
|
|
}
|
|
|
|
void LLVMAddConstantMergePass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createConstantMergePass());
|
|
}
|
|
|
|
void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createDeadArgEliminationPass());
|
|
}
|
|
|
|
void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createPostOrderFunctionAttrsPass());
|
|
}
|
|
|
|
void LLVMAddFunctionInliningPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createFunctionInliningPass());
|
|
}
|
|
|
|
void LLVMAddAlwaysInlinerPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(llvm::createAlwaysInlinerPass());
|
|
}
|
|
|
|
void LLVMAddGlobalDCEPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createGlobalDCEPass());
|
|
}
|
|
|
|
void LLVMAddGlobalOptimizerPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createGlobalOptimizerPass());
|
|
}
|
|
|
|
void LLVMAddIPConstantPropagationPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createIPConstantPropagationPass());
|
|
}
|
|
|
|
void LLVMAddPruneEHPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createPruneEHPass());
|
|
}
|
|
|
|
void LLVMAddIPSCCPPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createIPSCCPPass());
|
|
}
|
|
|
|
void LLVMAddInternalizePass(LLVMPassManagerRef PM, unsigned AllButMain) {
|
|
std::vector<const char *> Export;
|
|
if (AllButMain)
|
|
Export.push_back("main");
|
|
unwrap(PM)->add(createInternalizePass(Export));
|
|
}
|
|
|
|
void LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createStripDeadPrototypesPass());
|
|
}
|
|
|
|
void LLVMAddStripSymbolsPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createStripSymbolsPass());
|
|
}
|