mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2026-01-31 01:35:20 +01:00
As far as I know, ipconstprop has not been used in years and ipsccp has been used instead. This has the potential for confusion and sometimes leads people to spend time finding & reporting bugs as well as updating it to work with the latest API changes. This patch moves the tests over to SCCP. There's one functional difference I am aware of: ipconstprop propagates for each call-site individually, so for functions that are called with different constant arguments it can sometimes produce better results than ipsccp (at much higher compile-time cost).But IPSCCP can be thought to do so as well for internal functions and as mentioned earlier, the pass seems unused in practice (and there are no plans on working towards enabling it anytime). Also discussed on llvm-dev: http://lists.llvm.org/pipermail/llvm-dev/2020-July/143773.html Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D84447
141 lines
4.8 KiB
C++
141 lines
4.8 KiB
C++
//===-- IPO.cpp -----------------------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the common infrastructure (including C bindings) for
|
|
// libLLVMIPO.a, which implements several transformations over the LLVM
|
|
// intermediate representation.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm-c/Transforms/IPO.h"
|
|
#include "llvm-c/Initialization.h"
|
|
#include "llvm/IR/LegacyPassManager.h"
|
|
#include "llvm/InitializePasses.h"
|
|
#include "llvm/Transforms/IPO.h"
|
|
#include "llvm/Transforms/IPO/AlwaysInliner.h"
|
|
#include "llvm/Transforms/IPO/FunctionAttrs.h"
|
|
|
|
using namespace llvm;
|
|
|
|
void llvm::initializeIPO(PassRegistry &Registry) {
|
|
initializeOpenMPOptLegacyPassPass(Registry);
|
|
initializeArgPromotionPass(Registry);
|
|
initializeCalledValuePropagationLegacyPassPass(Registry);
|
|
initializeConstantMergeLegacyPassPass(Registry);
|
|
initializeCrossDSOCFIPass(Registry);
|
|
initializeDAEPass(Registry);
|
|
initializeDAHPass(Registry);
|
|
initializeForceFunctionAttrsLegacyPassPass(Registry);
|
|
initializeGlobalDCELegacyPassPass(Registry);
|
|
initializeGlobalOptLegacyPassPass(Registry);
|
|
initializeGlobalSplitPass(Registry);
|
|
initializeHotColdSplittingLegacyPassPass(Registry);
|
|
initializeAlwaysInlinerLegacyPassPass(Registry);
|
|
initializeSimpleInlinerPass(Registry);
|
|
initializeInferFunctionAttrsLegacyPassPass(Registry);
|
|
initializeInternalizeLegacyPassPass(Registry);
|
|
initializeLoopExtractorPass(Registry);
|
|
initializeBlockExtractorPass(Registry);
|
|
initializeSingleLoopExtractorPass(Registry);
|
|
initializeLowerTypeTestsPass(Registry);
|
|
initializeMergeFunctionsLegacyPassPass(Registry);
|
|
initializePartialInlinerLegacyPassPass(Registry);
|
|
initializeAttributorLegacyPassPass(Registry);
|
|
initializeAttributorCGSCCLegacyPassPass(Registry);
|
|
initializePostOrderFunctionAttrsLegacyPassPass(Registry);
|
|
initializeReversePostOrderFunctionAttrsLegacyPassPass(Registry);
|
|
initializePruneEHPass(Registry);
|
|
initializeIPSCCPLegacyPassPass(Registry);
|
|
initializeStripDeadPrototypesLegacyPassPass(Registry);
|
|
initializeStripSymbolsPass(Registry);
|
|
initializeStripDebugDeclarePass(Registry);
|
|
initializeStripDeadDebugInfoPass(Registry);
|
|
initializeStripNonDebugSymbolsPass(Registry);
|
|
initializeBarrierNoopPass(Registry);
|
|
initializeEliminateAvailableExternallyLegacyPassPass(Registry);
|
|
initializeSampleProfileLoaderLegacyPassPass(Registry);
|
|
initializeFunctionImportLegacyPassPass(Registry);
|
|
initializeWholeProgramDevirtPass(Registry);
|
|
}
|
|
|
|
void LLVMInitializeIPO(LLVMPassRegistryRef R) {
|
|
initializeIPO(*unwrap(R));
|
|
}
|
|
|
|
void LLVMAddArgumentPromotionPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createArgumentPromotionPass());
|
|
}
|
|
|
|
void LLVMAddCalledValuePropagationPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createCalledValuePropagationPass());
|
|
}
|
|
|
|
void LLVMAddConstantMergePass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createConstantMergePass());
|
|
}
|
|
|
|
void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createDeadArgEliminationPass());
|
|
}
|
|
|
|
void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createPostOrderFunctionAttrsLegacyPass());
|
|
}
|
|
|
|
void LLVMAddFunctionInliningPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createFunctionInliningPass());
|
|
}
|
|
|
|
void LLVMAddAlwaysInlinerPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(llvm::createAlwaysInlinerLegacyPass());
|
|
}
|
|
|
|
void LLVMAddGlobalDCEPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createGlobalDCEPass());
|
|
}
|
|
|
|
void LLVMAddGlobalOptimizerPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createGlobalOptimizerPass());
|
|
}
|
|
|
|
void LLVMAddPruneEHPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createPruneEHPass());
|
|
}
|
|
|
|
void LLVMAddIPSCCPPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createIPSCCPPass());
|
|
}
|
|
|
|
void LLVMAddMergeFunctionsPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createMergeFunctionsPass());
|
|
}
|
|
|
|
void LLVMAddInternalizePass(LLVMPassManagerRef PM, unsigned AllButMain) {
|
|
auto PreserveMain = [=](const GlobalValue &GV) {
|
|
return AllButMain && GV.getName() == "main";
|
|
};
|
|
unwrap(PM)->add(createInternalizePass(PreserveMain));
|
|
}
|
|
|
|
void LLVMAddInternalizePassWithMustPreservePredicate(
|
|
LLVMPassManagerRef PM,
|
|
void *Context,
|
|
LLVMBool (*Pred)(LLVMValueRef, void *)) {
|
|
unwrap(PM)->add(createInternalizePass([=](const GlobalValue &GV) {
|
|
return Pred(wrap(&GV), Context) == 0 ? false : true;
|
|
}));
|
|
}
|
|
|
|
void LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createStripDeadPrototypesPass());
|
|
}
|
|
|
|
void LLVMAddStripSymbolsPass(LLVMPassManagerRef PM) {
|
|
unwrap(PM)->add(createStripSymbolsPass());
|
|
}
|