mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
a standalone pass. There is no call graph or even interesting analysis for this part of function attributes -- it is literally inferring attributes based on the target library identification. As such, we can do it using a much simpler module pass that just walks the declarations. This can also happen much earlier in the pass pipeline which has benefits for any number of other passes. In the process, I've cleaned up one particular aspect of the logic which was necessary in order to separate the two passes cleanly. It now counts inferred attributes independently rather than just counting all the inferred attributes as one, and the counts are more clearly explained. The two test cases we had for this code path are both ... woefully inadequate and copies of each other. I've kept the superset test and updated it. We need more testing here, but I had to pick somewhere to stop fixing everything broken I saw here. Differential Revision: http://reviews.llvm.org/D15676 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256466 91177308-0d34-0410-b5e6-96231b3b80d8
119 lines
3.7 KiB
C++
119 lines
3.7 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);
|
|
initializeFunctionAttrsPass(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);
|
|
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(createFunctionAttrsPass());
|
|
}
|
|
|
|
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());
|
|
}
|