blob: 34db75dd8b0380b0ef7a0e34848d5edba8dd334c [file] [log] [blame]
Craig Topperc74b6002012-10-16 02:21:30 +00001//===-- IPO.cpp -----------------------------------------------------------===//
Chris Lattnere48f8972009-03-06 16:52:18 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Chris Lattnere48f8972009-03-06 16:52:18 +00006//
7//===----------------------------------------------------------------------===//
8//
Justin Bogner48f1f882015-10-30 23:02:38 +00009// This file implements the common infrastructure (including C bindings) for
10// libLLVMIPO.a, which implements several transformations over the LLVM
Owen Andersonbf70a032010-10-07 18:09:59 +000011// intermediate representation.
Chris Lattnere48f8972009-03-06 16:52:18 +000012//
13//===----------------------------------------------------------------------===//
14
15#include "llvm-c/Transforms/IPO.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000016#include "llvm-c/Initialization.h"
Chandler Carruth30d69c22015-02-13 10:01:29 +000017#include "llvm/IR/LegacyPassManager.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000018#include "llvm/InitializePasses.h"
Chris Lattnere48f8972009-03-06 16:52:18 +000019#include "llvm/Transforms/IPO.h"
Chandler Carruth67fc52f2016-08-17 02:56:20 +000020#include "llvm/Transforms/IPO/AlwaysInliner.h"
Chandler Carruth9c4ed172016-02-18 11:03:11 +000021#include "llvm/Transforms/IPO/FunctionAttrs.h"
Chris Lattnere48f8972009-03-06 16:52:18 +000022
23using namespace llvm;
24
Owen Andersonbf70a032010-10-07 18:09:59 +000025void llvm::initializeIPO(PassRegistry &Registry) {
26 initializeArgPromotionPass(Registry);
Matthew Simpsoncb585582017-10-25 13:40:08 +000027 initializeCalledValuePropagationLegacyPassPass(Registry);
Davide Italiano164b9bc2016-05-05 00:51:09 +000028 initializeConstantMergeLegacyPassPass(Registry);
Evgeniy Stepanov67849d52015-12-15 23:00:08 +000029 initializeCrossDSOCFIPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000030 initializeDAEPass(Registry);
31 initializeDAHPass(Registry);
Chandler Carruthf49f1a872015-12-27 08:13:45 +000032 initializeForceFunctionAttrsLegacyPassPass(Registry);
Davide Italiano66228c42016-05-03 19:39:15 +000033 initializeGlobalDCELegacyPassPass(Registry);
Justin Bogner1a075012016-04-26 00:28:01 +000034 initializeGlobalOptLegacyPassPass(Registry);
Peter Collingbournef72a8d42016-11-16 23:40:26 +000035 initializeGlobalSplitPass(Registry);
Aditya Kumar801394a2018-09-07 15:03:49 +000036 initializeHotColdSplittingLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000037 initializeIPCPPass(Registry);
Chandler Carruth67fc52f2016-08-17 02:56:20 +000038 initializeAlwaysInlinerLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000039 initializeSimpleInlinerPass(Registry);
Chandler Carruth3a040e62015-12-27 08:41:34 +000040 initializeInferFunctionAttrsLegacyPassPass(Registry);
Justin Bogner4563a062016-04-26 20:15:52 +000041 initializeInternalizeLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000042 initializeLoopExtractorPass(Registry);
Volkan Kelesdc40be72018-01-23 21:51:34 +000043 initializeBlockExtractorPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000044 initializeSingleLoopExtractorPass(Registry);
Peter Collingbourne7efd7502016-06-24 21:21:32 +000045 initializeLowerTypeTestsPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000046 initializeMergeFunctionsPass(Registry);
Easwaran Raman1832bf62016-06-27 16:50:18 +000047 initializePartialInlinerLegacyPassPass(Registry);
Johannes Doerfertaade7822019-06-05 03:02:24 +000048 initializeAttributorLegacyPassPass(Registry);
Chandler Carruth9c4ed172016-02-18 11:03:11 +000049 initializePostOrderFunctionAttrsLegacyPassPass(Registry);
Sean Silvaf5080192016-06-12 07:48:51 +000050 initializeReversePostOrderFunctionAttrsLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000051 initializePruneEHPass(Registry);
David Blaikie376294c2018-03-22 22:07:53 +000052 initializeIPSCCPLegacyPassPass(Registry);
Justin Bogner21e15372015-10-30 23:28:12 +000053 initializeStripDeadPrototypesLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000054 initializeStripSymbolsPass(Registry);
55 initializeStripDebugDeclarePass(Registry);
56 initializeStripDeadDebugInfoPass(Registry);
57 initializeStripNonDebugSymbolsPass(Registry);
Hal Finkel26fc4c22013-12-12 20:45:08 +000058 initializeBarrierNoopPass(Registry);
Davide Italiano344e8382016-05-05 02:37:32 +000059 initializeEliminateAvailableExternallyLegacyPassPass(Registry);
Xinliang David Lie897edb2016-05-27 22:30:44 +000060 initializeSampleProfileLoaderLegacyPassPass(Registry);
Teresa Johnson21241572016-07-18 21:22:24 +000061 initializeFunctionImportLegacyPassPass(Registry);
Peter Collingbournedf49d1b2016-02-09 22:50:34 +000062 initializeWholeProgramDevirtPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000063}
64
65void LLVMInitializeIPO(LLVMPassRegistryRef R) {
66 initializeIPO(*unwrap(R));
67}
68
Chris Lattnere48f8972009-03-06 16:52:18 +000069void LLVMAddArgumentPromotionPass(LLVMPassManagerRef PM) {
70 unwrap(PM)->add(createArgumentPromotionPass());
71}
72
Matthew Simpsoncb585582017-10-25 13:40:08 +000073void LLVMAddCalledValuePropagationPass(LLVMPassManagerRef PM) {
74 unwrap(PM)->add(createCalledValuePropagationPass());
75}
76
Chris Lattnere48f8972009-03-06 16:52:18 +000077void LLVMAddConstantMergePass(LLVMPassManagerRef PM) {
78 unwrap(PM)->add(createConstantMergePass());
79}
80
81void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM) {
82 unwrap(PM)->add(createDeadArgEliminationPass());
83}
84
Chris Lattnere48f8972009-03-06 16:52:18 +000085void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM) {
Chandler Carruth9c4ed172016-02-18 11:03:11 +000086 unwrap(PM)->add(createPostOrderFunctionAttrsLegacyPass());
Chris Lattnere48f8972009-03-06 16:52:18 +000087}
88
89void LLVMAddFunctionInliningPass(LLVMPassManagerRef PM) {
90 unwrap(PM)->add(createFunctionInliningPass());
91}
92
Rafael Espindolab84dc6b2011-07-26 15:23:23 +000093void LLVMAddAlwaysInlinerPass(LLVMPassManagerRef PM) {
Chandler Carruth67fc52f2016-08-17 02:56:20 +000094 unwrap(PM)->add(llvm::createAlwaysInlinerLegacyPass());
Rafael Espindolab84dc6b2011-07-26 15:23:23 +000095}
96
Chris Lattnere48f8972009-03-06 16:52:18 +000097void LLVMAddGlobalDCEPass(LLVMPassManagerRef PM) {
98 unwrap(PM)->add(createGlobalDCEPass());
99}
100
101void LLVMAddGlobalOptimizerPass(LLVMPassManagerRef PM) {
102 unwrap(PM)->add(createGlobalOptimizerPass());
103}
104
105void LLVMAddIPConstantPropagationPass(LLVMPassManagerRef PM) {
106 unwrap(PM)->add(createIPConstantPropagationPass());
107}
108
Chris Lattnere48f8972009-03-06 16:52:18 +0000109void LLVMAddPruneEHPass(LLVMPassManagerRef PM) {
110 unwrap(PM)->add(createPruneEHPass());
111}
112
Wesley Pecka2ca3fa2010-04-09 20:43:20 +0000113void LLVMAddIPSCCPPass(LLVMPassManagerRef PM) {
114 unwrap(PM)->add(createIPSCCPPass());
115}
116
117void LLVMAddInternalizePass(LLVMPassManagerRef PM, unsigned AllButMain) {
Mehdi Amini40787092016-04-13 04:20:32 +0000118 auto PreserveMain = [=](const GlobalValue &GV) {
119 return AllButMain && GV.getName() == "main";
120 };
121 unwrap(PM)->add(createInternalizePass(PreserveMain));
Wesley Pecka2ca3fa2010-04-09 20:43:20 +0000122}
123
Chris Lattnere48f8972009-03-06 16:52:18 +0000124void LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM) {
125 unwrap(PM)->add(createStripDeadPrototypesPass());
126}
127
128void LLVMAddStripSymbolsPass(LLVMPassManagerRef PM) {
129 unwrap(PM)->add(createStripSymbolsPass());
130}