Scalar.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. //===-- Scalar.cpp --------------------------------------------------------===//
  2. //
  3. // 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
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file implements common infrastructure for libLLVMScalarOpts.a, which
  10. // implements several scalar transformations over the LLVM intermediate
  11. // representation, including the C bindings for that library.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "llvm/Transforms/Scalar.h"
  15. #include "llvm-c/Initialization.h"
  16. #include "llvm-c/Transforms/Scalar.h"
  17. #include "llvm/Analysis/BasicAliasAnalysis.h"
  18. #include "llvm/Analysis/ScopedNoAliasAA.h"
  19. #include "llvm/Analysis/TypeBasedAliasAnalysis.h"
  20. #include "llvm/IR/LegacyPassManager.h"
  21. #include "llvm/IR/Verifier.h"
  22. #include "llvm/InitializePasses.h"
  23. #include "llvm/Transforms/Scalar/GVN.h"
  24. #include "llvm/Transforms/Scalar/Scalarizer.h"
  25. #include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
  26. using namespace llvm;
  27. /// initializeScalarOptsPasses - Initialize all passes linked into the
  28. /// ScalarOpts library.
  29. void llvm::initializeScalarOpts(PassRegistry &Registry) {
  30. initializeADCELegacyPassPass(Registry);
  31. initializeBDCELegacyPassPass(Registry);
  32. initializeAlignmentFromAssumptionsPass(Registry);
  33. initializeCallSiteSplittingLegacyPassPass(Registry);
  34. initializeConstantHoistingLegacyPassPass(Registry);
  35. initializeCorrelatedValuePropagationPass(Registry);
  36. initializeDCELegacyPassPass(Registry);
  37. initializeDivRemPairsLegacyPassPass(Registry);
  38. initializeScalarizerLegacyPassPass(Registry);
  39. initializeDSELegacyPassPass(Registry);
  40. initializeGuardWideningLegacyPassPass(Registry);
  41. initializeLoopGuardWideningLegacyPassPass(Registry);
  42. initializeGVNLegacyPassPass(Registry);
  43. initializeNewGVNLegacyPassPass(Registry);
  44. initializeEarlyCSELegacyPassPass(Registry);
  45. initializeEarlyCSEMemSSALegacyPassPass(Registry);
  46. initializeMakeGuardsExplicitLegacyPassPass(Registry);
  47. initializeGVNHoistLegacyPassPass(Registry);
  48. initializeGVNSinkLegacyPassPass(Registry);
  49. initializeFlattenCFGLegacyPassPass(Registry);
  50. initializeIRCELegacyPassPass(Registry);
  51. initializeIndVarSimplifyLegacyPassPass(Registry);
  52. initializeInferAddressSpacesPass(Registry);
  53. initializeInstSimplifyLegacyPassPass(Registry);
  54. initializeJumpThreadingPass(Registry);
  55. initializeDFAJumpThreadingLegacyPassPass(Registry);
  56. initializeLegacyLICMPassPass(Registry);
  57. initializeLegacyLoopSinkPassPass(Registry);
  58. initializeLoopFuseLegacyPass(Registry);
  59. initializeLoopDataPrefetchLegacyPassPass(Registry);
  60. initializeLoopDeletionLegacyPassPass(Registry);
  61. initializeLoopAccessLegacyAnalysisPass(Registry);
  62. initializeLoopInstSimplifyLegacyPassPass(Registry);
  63. initializeLoopInterchangeLegacyPassPass(Registry);
  64. initializeLoopFlattenLegacyPassPass(Registry);
  65. initializeLoopPredicationLegacyPassPass(Registry);
  66. initializeLoopRotateLegacyPassPass(Registry);
  67. initializeLoopStrengthReducePass(Registry);
  68. initializeLoopRerollLegacyPassPass(Registry);
  69. initializeLoopUnrollPass(Registry);
  70. initializeLoopUnrollAndJamPass(Registry);
  71. initializeWarnMissedTransformationsLegacyPass(Registry);
  72. initializeLoopVersioningLICMLegacyPassPass(Registry);
  73. initializeLoopIdiomRecognizeLegacyPassPass(Registry);
  74. initializeLowerAtomicLegacyPassPass(Registry);
  75. initializeLowerConstantIntrinsicsPass(Registry);
  76. initializeLowerExpectIntrinsicPass(Registry);
  77. initializeLowerGuardIntrinsicLegacyPassPass(Registry);
  78. initializeLowerMatrixIntrinsicsLegacyPassPass(Registry);
  79. initializeLowerMatrixIntrinsicsMinimalLegacyPassPass(Registry);
  80. initializeLowerWidenableConditionLegacyPassPass(Registry);
  81. initializeMemCpyOptLegacyPassPass(Registry);
  82. initializeMergeICmpsLegacyPassPass(Registry);
  83. initializeMergedLoadStoreMotionLegacyPassPass(Registry);
  84. initializeNaryReassociateLegacyPassPass(Registry);
  85. initializePartiallyInlineLibCallsLegacyPassPass(Registry);
  86. initializeReassociateLegacyPassPass(Registry);
  87. initializeRedundantDbgInstEliminationPass(Registry);
  88. initializeRegToMemLegacyPass(Registry);
  89. initializeRewriteStatepointsForGCLegacyPassPass(Registry);
  90. initializeScalarizeMaskedMemIntrinLegacyPassPass(Registry);
  91. initializeSCCPLegacyPassPass(Registry);
  92. initializeSROALegacyPassPass(Registry);
  93. initializeCFGSimplifyPassPass(Registry);
  94. initializeStructurizeCFGLegacyPassPass(Registry);
  95. initializeSimpleLoopUnswitchLegacyPassPass(Registry);
  96. initializeSinkingLegacyPassPass(Registry);
  97. initializeTailCallElimPass(Registry);
  98. initializeTLSVariableHoistLegacyPassPass(Registry);
  99. initializeSeparateConstOffsetFromGEPLegacyPassPass(Registry);
  100. initializeSpeculativeExecutionLegacyPassPass(Registry);
  101. initializeStraightLineStrengthReduceLegacyPassPass(Registry);
  102. initializePlaceBackedgeSafepointsImplPass(Registry);
  103. initializePlaceSafepointsPass(Registry);
  104. initializeFloat2IntLegacyPassPass(Registry);
  105. initializeLoopDistributeLegacyPass(Registry);
  106. initializeLoopLoadEliminationPass(Registry);
  107. initializeLoopSimplifyCFGLegacyPassPass(Registry);
  108. initializeLoopVersioningLegacyPassPass(Registry);
  109. }
  110. void LLVMAddLoopSimplifyCFGPass(LLVMPassManagerRef PM) {
  111. unwrap(PM)->add(createLoopSimplifyCFGPass());
  112. }
  113. void LLVMInitializeScalarOpts(LLVMPassRegistryRef R) {
  114. initializeScalarOpts(*unwrap(R));
  115. }
  116. void LLVMAddAggressiveDCEPass(LLVMPassManagerRef PM) {
  117. unwrap(PM)->add(createAggressiveDCEPass());
  118. }
  119. void LLVMAddDCEPass(LLVMPassManagerRef PM) {
  120. unwrap(PM)->add(createDeadCodeEliminationPass());
  121. }
  122. void LLVMAddBitTrackingDCEPass(LLVMPassManagerRef PM) {
  123. unwrap(PM)->add(createBitTrackingDCEPass());
  124. }
  125. void LLVMAddAlignmentFromAssumptionsPass(LLVMPassManagerRef PM) {
  126. unwrap(PM)->add(createAlignmentFromAssumptionsPass());
  127. }
  128. void LLVMAddCFGSimplificationPass(LLVMPassManagerRef PM) {
  129. unwrap(PM)->add(createCFGSimplificationPass());
  130. }
  131. void LLVMAddDeadStoreEliminationPass(LLVMPassManagerRef PM) {
  132. unwrap(PM)->add(createDeadStoreEliminationPass());
  133. }
  134. void LLVMAddScalarizerPass(LLVMPassManagerRef PM) {
  135. unwrap(PM)->add(createScalarizerPass());
  136. }
  137. void LLVMAddGVNPass(LLVMPassManagerRef PM) {
  138. unwrap(PM)->add(createGVNPass());
  139. }
  140. void LLVMAddNewGVNPass(LLVMPassManagerRef PM) {
  141. unwrap(PM)->add(createNewGVNPass());
  142. }
  143. void LLVMAddMergedLoadStoreMotionPass(LLVMPassManagerRef PM) {
  144. unwrap(PM)->add(createMergedLoadStoreMotionPass());
  145. }
  146. void LLVMAddIndVarSimplifyPass(LLVMPassManagerRef PM) {
  147. unwrap(PM)->add(createIndVarSimplifyPass());
  148. }
  149. void LLVMAddInstructionSimplifyPass(LLVMPassManagerRef PM) {
  150. unwrap(PM)->add(createInstSimplifyLegacyPass());
  151. }
  152. void LLVMAddJumpThreadingPass(LLVMPassManagerRef PM) {
  153. unwrap(PM)->add(createJumpThreadingPass());
  154. }
  155. void LLVMAddLoopSinkPass(LLVMPassManagerRef PM) {
  156. unwrap(PM)->add(createLoopSinkPass());
  157. }
  158. void LLVMAddLICMPass(LLVMPassManagerRef PM) {
  159. unwrap(PM)->add(createLICMPass());
  160. }
  161. void LLVMAddLoopDeletionPass(LLVMPassManagerRef PM) {
  162. unwrap(PM)->add(createLoopDeletionPass());
  163. }
  164. void LLVMAddLoopFlattenPass(LLVMPassManagerRef PM) {
  165. unwrap(PM)->add(createLoopFlattenPass());
  166. }
  167. void LLVMAddLoopIdiomPass(LLVMPassManagerRef PM) {
  168. unwrap(PM)->add(createLoopIdiomPass());
  169. }
  170. void LLVMAddLoopRotatePass(LLVMPassManagerRef PM) {
  171. unwrap(PM)->add(createLoopRotatePass());
  172. }
  173. void LLVMAddLoopRerollPass(LLVMPassManagerRef PM) {
  174. unwrap(PM)->add(createLoopRerollPass());
  175. }
  176. void LLVMAddLoopUnrollPass(LLVMPassManagerRef PM) {
  177. unwrap(PM)->add(createLoopUnrollPass());
  178. }
  179. void LLVMAddLoopUnrollAndJamPass(LLVMPassManagerRef PM) {
  180. unwrap(PM)->add(createLoopUnrollAndJamPass());
  181. }
  182. void LLVMAddLowerAtomicPass(LLVMPassManagerRef PM) {
  183. unwrap(PM)->add(createLowerAtomicPass());
  184. }
  185. void LLVMAddMemCpyOptPass(LLVMPassManagerRef PM) {
  186. unwrap(PM)->add(createMemCpyOptPass());
  187. }
  188. void LLVMAddPartiallyInlineLibCallsPass(LLVMPassManagerRef PM) {
  189. unwrap(PM)->add(createPartiallyInlineLibCallsPass());
  190. }
  191. void LLVMAddReassociatePass(LLVMPassManagerRef PM) {
  192. unwrap(PM)->add(createReassociatePass());
  193. }
  194. void LLVMAddSCCPPass(LLVMPassManagerRef PM) {
  195. unwrap(PM)->add(createSCCPPass());
  196. }
  197. void LLVMAddScalarReplAggregatesPass(LLVMPassManagerRef PM) {
  198. unwrap(PM)->add(createSROAPass());
  199. }
  200. void LLVMAddScalarReplAggregatesPassSSA(LLVMPassManagerRef PM) {
  201. unwrap(PM)->add(createSROAPass());
  202. }
  203. void LLVMAddScalarReplAggregatesPassWithThreshold(LLVMPassManagerRef PM,
  204. int Threshold) {
  205. unwrap(PM)->add(createSROAPass());
  206. }
  207. void LLVMAddSimplifyLibCallsPass(LLVMPassManagerRef PM) {
  208. // NOTE: The simplify-libcalls pass has been removed.
  209. }
  210. void LLVMAddTailCallEliminationPass(LLVMPassManagerRef PM) {
  211. unwrap(PM)->add(createTailCallEliminationPass());
  212. }
  213. void LLVMAddDemoteMemoryToRegisterPass(LLVMPassManagerRef PM) {
  214. unwrap(PM)->add(createDemoteRegisterToMemoryPass());
  215. }
  216. void LLVMAddVerifierPass(LLVMPassManagerRef PM) {
  217. unwrap(PM)->add(createVerifierPass());
  218. }
  219. void LLVMAddCorrelatedValuePropagationPass(LLVMPassManagerRef PM) {
  220. unwrap(PM)->add(createCorrelatedValuePropagationPass());
  221. }
  222. void LLVMAddEarlyCSEPass(LLVMPassManagerRef PM) {
  223. unwrap(PM)->add(createEarlyCSEPass(false/*=UseMemorySSA*/));
  224. }
  225. void LLVMAddEarlyCSEMemSSAPass(LLVMPassManagerRef PM) {
  226. unwrap(PM)->add(createEarlyCSEPass(true/*=UseMemorySSA*/));
  227. }
  228. void LLVMAddGVNHoistLegacyPass(LLVMPassManagerRef PM) {
  229. unwrap(PM)->add(createGVNHoistPass());
  230. }
  231. void LLVMAddTypeBasedAliasAnalysisPass(LLVMPassManagerRef PM) {
  232. unwrap(PM)->add(createTypeBasedAAWrapperPass());
  233. }
  234. void LLVMAddScopedNoAliasAAPass(LLVMPassManagerRef PM) {
  235. unwrap(PM)->add(createScopedNoAliasAAWrapperPass());
  236. }
  237. void LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM) {
  238. unwrap(PM)->add(createBasicAAWrapperPass());
  239. }
  240. void LLVMAddLowerConstantIntrinsicsPass(LLVMPassManagerRef PM) {
  241. unwrap(PM)->add(createLowerConstantIntrinsicsPass());
  242. }
  243. void LLVMAddLowerExpectIntrinsicPass(LLVMPassManagerRef PM) {
  244. unwrap(PM)->add(createLowerExpectIntrinsicPass());
  245. }
  246. void LLVMAddUnifyFunctionExitNodesPass(LLVMPassManagerRef PM) {
  247. unwrap(PM)->add(createUnifyFunctionExitNodesPass());
  248. }