blob: dce9ee076bc58337e5d89d53f6c2d862251064eb [file] [log] [blame]
Craig Topperc74b6002012-10-16 02:21:30 +00001//===-- IPO.cpp -----------------------------------------------------------===//
Chris Lattnere48f8972009-03-06 16:52:18 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Justin Bogner48f1f882015-10-30 23:02:38 +000010// This file implements the common infrastructure (including C bindings) for
11// libLLVMIPO.a, which implements several transformations over the LLVM
Owen Andersonbf70a032010-10-07 18:09:59 +000012// intermediate representation.
Chris Lattnere48f8972009-03-06 16:52:18 +000013//
14//===----------------------------------------------------------------------===//
15
16#include "llvm-c/Transforms/IPO.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000017#include "llvm-c/Initialization.h"
Chandler Carruth30d69c22015-02-13 10:01:29 +000018#include "llvm/IR/LegacyPassManager.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000019#include "llvm/InitializePasses.h"
Chris Lattnere48f8972009-03-06 16:52:18 +000020#include "llvm/Transforms/IPO.h"
Chandler Carruth67fc52f2016-08-17 02:56:20 +000021#include "llvm/Transforms/IPO/AlwaysInliner.h"
Chandler Carruth9c4ed172016-02-18 11:03:11 +000022#include "llvm/Transforms/IPO/FunctionAttrs.h"
Chris Lattnere48f8972009-03-06 16:52:18 +000023
24using namespace llvm;
25
Owen Andersonbf70a032010-10-07 18:09:59 +000026void llvm::initializeIPO(PassRegistry &Registry) {
27 initializeArgPromotionPass(Registry);
Matthew Simpsoncb585582017-10-25 13:40:08 +000028 initializeCalledValuePropagationLegacyPassPass(Registry);
Davide Italiano164b9bc2016-05-05 00:51:09 +000029 initializeConstantMergeLegacyPassPass(Registry);
Evgeniy Stepanov67849d52015-12-15 23:00:08 +000030 initializeCrossDSOCFIPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000031 initializeDAEPass(Registry);
32 initializeDAHPass(Registry);
Chandler Carruthf49f1a872015-12-27 08:13:45 +000033 initializeForceFunctionAttrsLegacyPassPass(Registry);
Davide Italiano66228c42016-05-03 19:39:15 +000034 initializeGlobalDCELegacyPassPass(Registry);
Justin Bogner1a075012016-04-26 00:28:01 +000035 initializeGlobalOptLegacyPassPass(Registry);
Peter Collingbournef72a8d42016-11-16 23:40:26 +000036 initializeGlobalSplitPass(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);
Chandler Carruth9c4ed172016-02-18 11:03:11 +000048 initializePostOrderFunctionAttrsLegacyPassPass(Registry);
Sean Silvaf5080192016-06-12 07:48:51 +000049 initializeReversePostOrderFunctionAttrsLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000050 initializePruneEHPass(Registry);
David Blaikie376294c2018-03-22 22:07:53 +000051 initializeIPSCCPLegacyPassPass(Registry);
Justin Bogner21e15372015-10-30 23:28:12 +000052 initializeStripDeadPrototypesLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000053 initializeStripSymbolsPass(Registry);
54 initializeStripDebugDeclarePass(Registry);
55 initializeStripDeadDebugInfoPass(Registry);
56 initializeStripNonDebugSymbolsPass(Registry);
Hal Finkel26fc4c22013-12-12 20:45:08 +000057 initializeBarrierNoopPass(Registry);
Davide Italiano344e8382016-05-05 02:37:32 +000058 initializeEliminateAvailableExternallyLegacyPassPass(Registry);
Xinliang David Lie897edb2016-05-27 22:30:44 +000059 initializeSampleProfileLoaderLegacyPassPass(Registry);
Teresa Johnson21241572016-07-18 21:22:24 +000060 initializeFunctionImportLegacyPassPass(Registry);
Peter Collingbournedf49d1b2016-02-09 22:50:34 +000061 initializeWholeProgramDevirtPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000062}
63
64void LLVMInitializeIPO(LLVMPassRegistryRef R) {
65 initializeIPO(*unwrap(R));
66}
67
Chris Lattnere48f8972009-03-06 16:52:18 +000068void LLVMAddArgumentPromotionPass(LLVMPassManagerRef PM) {
69 unwrap(PM)->add(createArgumentPromotionPass());
70}
71
Matthew Simpsoncb585582017-10-25 13:40:08 +000072void LLVMAddCalledValuePropagationPass(LLVMPassManagerRef PM) {
73 unwrap(PM)->add(createCalledValuePropagationPass());
74}
75
Chris Lattnere48f8972009-03-06 16:52:18 +000076void LLVMAddConstantMergePass(LLVMPassManagerRef PM) {
77 unwrap(PM)->add(createConstantMergePass());
78}
79
80void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM) {
81 unwrap(PM)->add(createDeadArgEliminationPass());
82}
83
Chris Lattnere48f8972009-03-06 16:52:18 +000084void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM) {
Chandler Carruth9c4ed172016-02-18 11:03:11 +000085 unwrap(PM)->add(createPostOrderFunctionAttrsLegacyPass());
Chris Lattnere48f8972009-03-06 16:52:18 +000086}
87
88void LLVMAddFunctionInliningPass(LLVMPassManagerRef PM) {
89 unwrap(PM)->add(createFunctionInliningPass());
90}
91
Rafael Espindolab84dc6b2011-07-26 15:23:23 +000092void LLVMAddAlwaysInlinerPass(LLVMPassManagerRef PM) {
Chandler Carruth67fc52f2016-08-17 02:56:20 +000093 unwrap(PM)->add(llvm::createAlwaysInlinerLegacyPass());
Rafael Espindolab84dc6b2011-07-26 15:23:23 +000094}
95
Chris Lattnere48f8972009-03-06 16:52:18 +000096void LLVMAddGlobalDCEPass(LLVMPassManagerRef PM) {
97 unwrap(PM)->add(createGlobalDCEPass());
98}
99
100void LLVMAddGlobalOptimizerPass(LLVMPassManagerRef PM) {
101 unwrap(PM)->add(createGlobalOptimizerPass());
102}
103
104void LLVMAddIPConstantPropagationPass(LLVMPassManagerRef PM) {
105 unwrap(PM)->add(createIPConstantPropagationPass());
106}
107
Chris Lattnere48f8972009-03-06 16:52:18 +0000108void LLVMAddPruneEHPass(LLVMPassManagerRef PM) {
109 unwrap(PM)->add(createPruneEHPass());
110}
111
Wesley Pecka2ca3fa2010-04-09 20:43:20 +0000112void LLVMAddIPSCCPPass(LLVMPassManagerRef PM) {
113 unwrap(PM)->add(createIPSCCPPass());
114}
115
116void LLVMAddInternalizePass(LLVMPassManagerRef PM, unsigned AllButMain) {
Mehdi Amini40787092016-04-13 04:20:32 +0000117 auto PreserveMain = [=](const GlobalValue &GV) {
118 return AllButMain && GV.getName() == "main";
119 };
120 unwrap(PM)->add(createInternalizePass(PreserveMain));
Wesley Pecka2ca3fa2010-04-09 20:43:20 +0000121}
122
Chris Lattnere48f8972009-03-06 16:52:18 +0000123void LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM) {
124 unwrap(PM)->add(createStripDeadPrototypesPass());
125}
126
127void LLVMAddStripSymbolsPass(LLVMPassManagerRef PM) {
128 unwrap(PM)->add(createStripSymbolsPass());
129}