blob: 4910f7f591dab028cb96094bfc60ba8c0cd7aaf5 [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
Benjamin Kramer5a6568832011-08-19 01:36:54 +000016#include "llvm-c/Initialization.h"
Chris Lattnere48f8972009-03-06 16:52:18 +000017#include "llvm-c/Transforms/IPO.h"
Owen Andersonbf70a032010-10-07 18:09:59 +000018#include "llvm/InitializePasses.h"
Chandler Carruth30d69c22015-02-13 10:01:29 +000019#include "llvm/IR/LegacyPassManager.h"
Chris Lattnere48f8972009-03-06 16:52:18 +000020#include "llvm/Transforms/IPO.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);
27 initializeConstantMergePass(Registry);
Evgeniy Stepanov67849d52015-12-15 23:00:08 +000028 initializeCrossDSOCFIPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000029 initializeDAEPass(Registry);
30 initializeDAHPass(Registry);
Chandler Carruthf49f1a872015-12-27 08:13:45 +000031 initializeForceFunctionAttrsLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000032 initializeGlobalDCEPass(Registry);
Justin Bogner1a075012016-04-26 00:28:01 +000033 initializeGlobalOptLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000034 initializeIPCPPass(Registry);
35 initializeAlwaysInlinerPass(Registry);
36 initializeSimpleInlinerPass(Registry);
Chandler Carruth3a040e62015-12-27 08:41:34 +000037 initializeInferFunctionAttrsLegacyPassPass(Registry);
Justin Bogner4563a062016-04-26 20:15:52 +000038 initializeInternalizeLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000039 initializeLoopExtractorPass(Registry);
40 initializeBlockExtractorPassPass(Registry);
41 initializeSingleLoopExtractorPass(Registry);
Peter Collingbournee6909c82015-02-20 20:30:47 +000042 initializeLowerBitSetsPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000043 initializeMergeFunctionsPass(Registry);
44 initializePartialInlinerPass(Registry);
Chandler Carruth9c4ed172016-02-18 11:03:11 +000045 initializePostOrderFunctionAttrsLegacyPassPass(Registry);
Chandler Carruth1926b702016-01-08 10:55:52 +000046 initializeReversePostOrderFunctionAttrsPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000047 initializePruneEHPass(Registry);
Justin Bogner21e15372015-10-30 23:28:12 +000048 initializeStripDeadPrototypesLegacyPassPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000049 initializeStripSymbolsPass(Registry);
50 initializeStripDebugDeclarePass(Registry);
51 initializeStripDeadDebugInfoPass(Registry);
52 initializeStripNonDebugSymbolsPass(Registry);
Hal Finkel26fc4c22013-12-12 20:45:08 +000053 initializeBarrierNoopPass(Registry);
Rafael Espindola237c3a62015-07-13 14:18:22 +000054 initializeEliminateAvailableExternallyPass(Registry);
Diego Novillo4d711132015-08-25 15:25:11 +000055 initializeSampleProfileLoaderPass(Registry);
Mehdi Amini42418ab2015-11-24 06:07:49 +000056 initializeFunctionImportPassPass(Registry);
Peter Collingbournedf49d1b2016-02-09 22:50:34 +000057 initializeWholeProgramDevirtPass(Registry);
Owen Andersonbf70a032010-10-07 18:09:59 +000058}
59
60void LLVMInitializeIPO(LLVMPassRegistryRef R) {
61 initializeIPO(*unwrap(R));
62}
63
Chris Lattnere48f8972009-03-06 16:52:18 +000064void LLVMAddArgumentPromotionPass(LLVMPassManagerRef PM) {
65 unwrap(PM)->add(createArgumentPromotionPass());
66}
67
68void LLVMAddConstantMergePass(LLVMPassManagerRef PM) {
69 unwrap(PM)->add(createConstantMergePass());
70}
71
72void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM) {
73 unwrap(PM)->add(createDeadArgEliminationPass());
74}
75
Chris Lattnere48f8972009-03-06 16:52:18 +000076void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM) {
Chandler Carruth9c4ed172016-02-18 11:03:11 +000077 unwrap(PM)->add(createPostOrderFunctionAttrsLegacyPass());
Chris Lattnere48f8972009-03-06 16:52:18 +000078}
79
80void LLVMAddFunctionInliningPass(LLVMPassManagerRef PM) {
81 unwrap(PM)->add(createFunctionInliningPass());
82}
83
Rafael Espindolab84dc6b2011-07-26 15:23:23 +000084void LLVMAddAlwaysInlinerPass(LLVMPassManagerRef PM) {
85 unwrap(PM)->add(llvm::createAlwaysInlinerPass());
86}
87
Chris Lattnere48f8972009-03-06 16:52:18 +000088void LLVMAddGlobalDCEPass(LLVMPassManagerRef PM) {
89 unwrap(PM)->add(createGlobalDCEPass());
90}
91
92void LLVMAddGlobalOptimizerPass(LLVMPassManagerRef PM) {
93 unwrap(PM)->add(createGlobalOptimizerPass());
94}
95
96void LLVMAddIPConstantPropagationPass(LLVMPassManagerRef PM) {
97 unwrap(PM)->add(createIPConstantPropagationPass());
98}
99
Chris Lattnere48f8972009-03-06 16:52:18 +0000100void LLVMAddPruneEHPass(LLVMPassManagerRef PM) {
101 unwrap(PM)->add(createPruneEHPass());
102}
103
Wesley Pecka2ca3fa2010-04-09 20:43:20 +0000104void LLVMAddIPSCCPPass(LLVMPassManagerRef PM) {
105 unwrap(PM)->add(createIPSCCPPass());
106}
107
108void LLVMAddInternalizePass(LLVMPassManagerRef PM, unsigned AllButMain) {
Mehdi Amini40787092016-04-13 04:20:32 +0000109 auto PreserveMain = [=](const GlobalValue &GV) {
110 return AllButMain && GV.getName() == "main";
111 };
112 unwrap(PM)->add(createInternalizePass(PreserveMain));
Wesley Pecka2ca3fa2010-04-09 20:43:20 +0000113}
114
Chris Lattnere48f8972009-03-06 16:52:18 +0000115void LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM) {
116 unwrap(PM)->add(createStripDeadPrototypesPass());
117}
118
119void LLVMAddStripSymbolsPass(LLVMPassManagerRef PM) {
120 unwrap(PM)->add(createStripSymbolsPass());
121}