1193323Sed//===-- Scalar.cpp --------------------------------------------------------===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10239462Sdim// This file implements common infrastructure for libLLVMScalarOpts.a, which
11218893Sdim// implements several scalar transformations over the LLVM intermediate
12218893Sdim// representation, including the C bindings for that library.
13193323Sed//
14193323Sed//===----------------------------------------------------------------------===//
15193323Sed
16249423Sdim#include "llvm/Transforms/Scalar.h"
17249423Sdim#include "llvm-c/Initialization.h"
18193323Sed#include "llvm-c/Transforms/Scalar.h"
19249423Sdim#include "llvm/Analysis/Passes.h"
20249423Sdim#include "llvm/Analysis/Verifier.h"
21249423Sdim#include "llvm/IR/DataLayout.h"
22218893Sdim#include "llvm/InitializePasses.h"
23193323Sed#include "llvm/PassManager.h"
24193323Sed
25193323Sedusing namespace llvm;
26193323Sed
27239462Sdim/// initializeScalarOptsPasses - Initialize all passes linked into the
28218893Sdim/// ScalarOpts library.
29218893Sdimvoid llvm::initializeScalarOpts(PassRegistry &Registry) {
30218893Sdim  initializeADCEPass(Registry);
31263508Sdim  initializeSampleProfileLoaderPass(Registry);
32218893Sdim  initializeCodeGenPreparePass(Registry);
33218893Sdim  initializeConstantPropagationPass(Registry);
34218893Sdim  initializeCorrelatedValuePropagationPass(Registry);
35218893Sdim  initializeDCEPass(Registry);
36218893Sdim  initializeDeadInstEliminationPass(Registry);
37218893Sdim  initializeDSEPass(Registry);
38218893Sdim  initializeGVNPass(Registry);
39218893Sdim  initializeEarlyCSEPass(Registry);
40218893Sdim  initializeIndVarSimplifyPass(Registry);
41218893Sdim  initializeJumpThreadingPass(Registry);
42218893Sdim  initializeLICMPass(Registry);
43218893Sdim  initializeLoopDeletionPass(Registry);
44218893Sdim  initializeLoopInstSimplifyPass(Registry);
45218893Sdim  initializeLoopRotatePass(Registry);
46218893Sdim  initializeLoopStrengthReducePass(Registry);
47263508Sdim  initializeLoopRerollPass(Registry);
48218893Sdim  initializeLoopUnrollPass(Registry);
49218893Sdim  initializeLoopUnswitchPass(Registry);
50218893Sdim  initializeLoopIdiomRecognizePass(Registry);
51218893Sdim  initializeLowerAtomicPass(Registry);
52224145Sdim  initializeLowerExpectIntrinsicPass(Registry);
53218893Sdim  initializeMemCpyOptPass(Registry);
54263508Sdim  initializePartiallyInlineLibCallsPass(Registry);
55218893Sdim  initializeReassociatePass(Registry);
56218893Sdim  initializeRegToMemPass(Registry);
57218893Sdim  initializeSCCPPass(Registry);
58218893Sdim  initializeIPSCCPPass(Registry);
59243830Sdim  initializeSROAPass(Registry);
60218893Sdim  initializeSROA_DTPass(Registry);
61218893Sdim  initializeSROA_SSAUpPass(Registry);
62218893Sdim  initializeCFGSimplifyPassPass(Registry);
63263508Sdim  initializeStructurizeCFGPass(Registry);
64218893Sdim  initializeSinkingPass(Registry);
65218893Sdim  initializeTailCallElimPass(Registry);
66218893Sdim}
67218893Sdim
68218893Sdimvoid LLVMInitializeScalarOpts(LLVMPassRegistryRef R) {
69218893Sdim  initializeScalarOpts(*unwrap(R));
70218893Sdim}
71218893Sdim
72193323Sedvoid LLVMAddAggressiveDCEPass(LLVMPassManagerRef PM) {
73193323Sed  unwrap(PM)->add(createAggressiveDCEPass());
74193323Sed}
75193323Sed
76193323Sedvoid LLVMAddCFGSimplificationPass(LLVMPassManagerRef PM) {
77193323Sed  unwrap(PM)->add(createCFGSimplificationPass());
78193323Sed}
79193323Sed
80193323Sedvoid LLVMAddDeadStoreEliminationPass(LLVMPassManagerRef PM) {
81193323Sed  unwrap(PM)->add(createDeadStoreEliminationPass());
82193323Sed}
83193323Sed
84193323Sedvoid LLVMAddGVNPass(LLVMPassManagerRef PM) {
85193323Sed  unwrap(PM)->add(createGVNPass());
86193323Sed}
87193323Sed
88193323Sedvoid LLVMAddIndVarSimplifyPass(LLVMPassManagerRef PM) {
89193323Sed  unwrap(PM)->add(createIndVarSimplifyPass());
90193323Sed}
91193323Sed
92193323Sedvoid LLVMAddInstructionCombiningPass(LLVMPassManagerRef PM) {
93193323Sed  unwrap(PM)->add(createInstructionCombiningPass());
94193323Sed}
95193323Sed
96193323Sedvoid LLVMAddJumpThreadingPass(LLVMPassManagerRef PM) {
97193323Sed  unwrap(PM)->add(createJumpThreadingPass());
98193323Sed}
99193323Sed
100193323Sedvoid LLVMAddLICMPass(LLVMPassManagerRef PM) {
101193323Sed  unwrap(PM)->add(createLICMPass());
102193323Sed}
103193323Sed
104193323Sedvoid LLVMAddLoopDeletionPass(LLVMPassManagerRef PM) {
105193323Sed  unwrap(PM)->add(createLoopDeletionPass());
106193323Sed}
107193323Sed
108221345Sdimvoid LLVMAddLoopIdiomPass(LLVMPassManagerRef PM) {
109221345Sdim  unwrap(PM)->add(createLoopIdiomPass());
110221345Sdim}
111221345Sdim
112193323Sedvoid LLVMAddLoopRotatePass(LLVMPassManagerRef PM) {
113193323Sed  unwrap(PM)->add(createLoopRotatePass());
114193323Sed}
115193323Sed
116263508Sdimvoid LLVMAddLoopRerollPass(LLVMPassManagerRef PM) {
117263508Sdim  unwrap(PM)->add(createLoopRerollPass());
118263508Sdim}
119263508Sdim
120193323Sedvoid LLVMAddLoopUnrollPass(LLVMPassManagerRef PM) {
121193323Sed  unwrap(PM)->add(createLoopUnrollPass());
122193323Sed}
123193323Sed
124193323Sedvoid LLVMAddLoopUnswitchPass(LLVMPassManagerRef PM) {
125193323Sed  unwrap(PM)->add(createLoopUnswitchPass());
126193323Sed}
127193323Sed
128193323Sedvoid LLVMAddMemCpyOptPass(LLVMPassManagerRef PM) {
129193323Sed  unwrap(PM)->add(createMemCpyOptPass());
130193323Sed}
131193323Sed
132263508Sdimvoid LLVMAddPartiallyInlineLibCallsPass(LLVMPassManagerRef PM) {
133263508Sdim  unwrap(PM)->add(createPartiallyInlineLibCallsPass());
134263508Sdim}
135263508Sdim
136193323Sedvoid LLVMAddPromoteMemoryToRegisterPass(LLVMPassManagerRef PM) {
137193323Sed  unwrap(PM)->add(createPromoteMemoryToRegisterPass());
138193323Sed}
139193323Sed
140193323Sedvoid LLVMAddReassociatePass(LLVMPassManagerRef PM) {
141193323Sed  unwrap(PM)->add(createReassociatePass());
142193323Sed}
143193323Sed
144193323Sedvoid LLVMAddSCCPPass(LLVMPassManagerRef PM) {
145193323Sed  unwrap(PM)->add(createSCCPPass());
146193323Sed}
147193323Sed
148193323Sedvoid LLVMAddScalarReplAggregatesPass(LLVMPassManagerRef PM) {
149193323Sed  unwrap(PM)->add(createScalarReplAggregatesPass());
150193323Sed}
151193323Sed
152221345Sdimvoid LLVMAddScalarReplAggregatesPassSSA(LLVMPassManagerRef PM) {
153221345Sdim  unwrap(PM)->add(createScalarReplAggregatesPass(-1, false));
154221345Sdim}
155221345Sdim
156205218Srdivackyvoid LLVMAddScalarReplAggregatesPassWithThreshold(LLVMPassManagerRef PM,
157205218Srdivacky                                                  int Threshold) {
158205218Srdivacky  unwrap(PM)->add(createScalarReplAggregatesPass(Threshold));
159205218Srdivacky}
160205218Srdivacky
161193323Sedvoid LLVMAddSimplifyLibCallsPass(LLVMPassManagerRef PM) {
162263508Sdim  // NOTE: The simplify-libcalls pass has been removed.
163193323Sed}
164193323Sed
165193323Sedvoid LLVMAddTailCallEliminationPass(LLVMPassManagerRef PM) {
166193323Sed  unwrap(PM)->add(createTailCallEliminationPass());
167193323Sed}
168193323Sed
169193323Sedvoid LLVMAddConstantPropagationPass(LLVMPassManagerRef PM) {
170193323Sed  unwrap(PM)->add(createConstantPropagationPass());
171193323Sed}
172193323Sed
173193323Sedvoid LLVMAddDemoteMemoryToRegisterPass(LLVMPassManagerRef PM) {
174193323Sed  unwrap(PM)->add(createDemoteRegisterToMemoryPass());
175193323Sed}
176205218Srdivacky
177205218Srdivackyvoid LLVMAddVerifierPass(LLVMPassManagerRef PM) {
178205218Srdivacky  unwrap(PM)->add(createVerifierPass());
179205218Srdivacky}
180221345Sdim
181221345Sdimvoid LLVMAddCorrelatedValuePropagationPass(LLVMPassManagerRef PM) {
182221345Sdim  unwrap(PM)->add(createCorrelatedValuePropagationPass());
183221345Sdim}
184221345Sdim
185221345Sdimvoid LLVMAddEarlyCSEPass(LLVMPassManagerRef PM) {
186221345Sdim  unwrap(PM)->add(createEarlyCSEPass());
187221345Sdim}
188221345Sdim
189221345Sdimvoid LLVMAddTypeBasedAliasAnalysisPass(LLVMPassManagerRef PM) {
190221345Sdim  unwrap(PM)->add(createTypeBasedAliasAnalysisPass());
191221345Sdim}
192221345Sdim
193221345Sdimvoid LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM) {
194221345Sdim  unwrap(PM)->add(createBasicAliasAnalysisPass());
195221345Sdim}
196226633Sdim
197226633Sdimvoid LLVMAddLowerExpectIntrinsicPass(LLVMPassManagerRef PM) {
198226633Sdim  unwrap(PM)->add(createLowerExpectIntrinsicPass());
199226633Sdim}
200