1/*===-- scalar_opts_ocaml.c - LLVM OCaml Glue -------------------*- C++ -*-===*\ 2|* *| 3|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| 4|* Exceptions. *| 5|* See https://llvm.org/LICENSE.txt for license information. *| 6|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| 7|* *| 8|*===----------------------------------------------------------------------===*| 9|* *| 10|* This file glues LLVM's OCaml interface to its C interface. These functions *| 11|* are by and large transparent wrappers to the corresponding C functions. *| 12|* *| 13|* Note that these functions intentionally take liberties with the CAMLparamX *| 14|* macros, since most of the parameters are not GC heap objects. *| 15|* *| 16\*===----------------------------------------------------------------------===*/ 17 18#include "llvm-c/Transforms/Scalar.h" 19#include "llvm-c/Transforms/Utils.h" 20#include "caml/mlvalues.h" 21#include "caml/misc.h" 22 23/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 24value llvm_add_aggressive_dce(LLVMPassManagerRef PM) { 25 LLVMAddAggressiveDCEPass(PM); 26 return Val_unit; 27} 28 29value llvm_add_dce(LLVMPassManagerRef PM) { 30 LLVMAddDCEPass(PM); 31 return Val_unit; 32} 33 34/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 35value llvm_add_alignment_from_assumptions(LLVMPassManagerRef PM) { 36 LLVMAddAlignmentFromAssumptionsPass(PM); 37 return Val_unit; 38} 39 40/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 41value llvm_add_cfg_simplification(LLVMPassManagerRef PM) { 42 LLVMAddCFGSimplificationPass(PM); 43 return Val_unit; 44} 45 46/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 47value llvm_add_dead_store_elimination(LLVMPassManagerRef PM) { 48 LLVMAddDeadStoreEliminationPass(PM); 49 return Val_unit; 50} 51 52/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 53value llvm_add_scalarizer(LLVMPassManagerRef PM) { 54 LLVMAddScalarizerPass(PM); 55 return Val_unit; 56} 57 58/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 59value llvm_add_merged_load_store_motion(LLVMPassManagerRef PM) { 60 LLVMAddMergedLoadStoreMotionPass(PM); 61 return Val_unit; 62} 63 64/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 65value llvm_add_gvn(LLVMPassManagerRef PM) { 66 LLVMAddGVNPass(PM); 67 return Val_unit; 68} 69 70/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 71value llvm_add_ind_var_simplify(LLVMPassManagerRef PM) { 72 LLVMAddIndVarSimplifyPass(PM); 73 return Val_unit; 74} 75 76/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 77value llvm_add_instruction_combining(LLVMPassManagerRef PM) { 78 LLVMAddInstructionCombiningPass(PM); 79 return Val_unit; 80} 81 82/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 83value llvm_add_jump_threading(LLVMPassManagerRef PM) { 84 LLVMAddJumpThreadingPass(PM); 85 return Val_unit; 86} 87 88/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 89value llvm_add_licm(LLVMPassManagerRef PM) { 90 LLVMAddLICMPass(PM); 91 return Val_unit; 92} 93 94/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 95value llvm_add_loop_deletion(LLVMPassManagerRef PM) { 96 LLVMAddLoopDeletionPass(PM); 97 return Val_unit; 98} 99 100/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 101value llvm_add_loop_idiom(LLVMPassManagerRef PM) { 102 LLVMAddLoopIdiomPass(PM); 103 return Val_unit; 104} 105 106/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 107value llvm_add_loop_rotate(LLVMPassManagerRef PM) { 108 LLVMAddLoopRotatePass(PM); 109 return Val_unit; 110} 111 112/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 113value llvm_add_loop_reroll(LLVMPassManagerRef PM) { 114 LLVMAddLoopRerollPass(PM); 115 return Val_unit; 116} 117 118/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 119value llvm_add_loop_unroll(LLVMPassManagerRef PM) { 120 LLVMAddLoopUnrollPass(PM); 121 return Val_unit; 122} 123 124/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 125value llvm_add_memcpy_opt(LLVMPassManagerRef PM) { 126 LLVMAddMemCpyOptPass(PM); 127 return Val_unit; 128} 129 130/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 131value llvm_add_partially_inline_lib_calls(LLVMPassManagerRef PM) { 132 LLVMAddPartiallyInlineLibCallsPass(PM); 133 return Val_unit; 134} 135 136/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 137value llvm_add_lower_atomic(LLVMPassManagerRef PM) { 138 LLVMAddLowerAtomicPass(PM); 139 return Val_unit; 140} 141 142/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 143value llvm_add_lower_switch(LLVMPassManagerRef PM) { 144 LLVMAddLowerSwitchPass(PM); 145 return Val_unit; 146} 147 148/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 149value llvm_add_promote_memory_to_register(LLVMPassManagerRef PM) { 150 LLVMAddPromoteMemoryToRegisterPass(PM); 151 return Val_unit; 152} 153 154/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 155value llvm_add_reassociation(LLVMPassManagerRef PM) { 156 LLVMAddReassociatePass(PM); 157 return Val_unit; 158} 159 160/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 161value llvm_add_sccp(LLVMPassManagerRef PM) { 162 LLVMAddSCCPPass(PM); 163 return Val_unit; 164} 165 166/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 167value llvm_add_scalar_repl_aggregates(LLVMPassManagerRef PM) { 168 LLVMAddScalarReplAggregatesPass(PM); 169 return Val_unit; 170} 171 172/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 173value llvm_add_scalar_repl_aggregates_ssa(LLVMPassManagerRef PM) { 174 LLVMAddScalarReplAggregatesPassSSA(PM); 175 return Val_unit; 176} 177 178/* int -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 179value llvm_add_scalar_repl_aggregates_with_threshold(value threshold, 180 LLVMPassManagerRef PM) { 181 LLVMAddScalarReplAggregatesPassWithThreshold(PM, Int_val(threshold)); 182 return Val_unit; 183} 184 185/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 186value llvm_add_simplify_lib_calls(LLVMPassManagerRef PM) { 187 LLVMAddSimplifyLibCallsPass(PM); 188 return Val_unit; 189} 190 191/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 192value llvm_add_tail_call_elimination(LLVMPassManagerRef PM) { 193 LLVMAddTailCallEliminationPass(PM); 194 return Val_unit; 195} 196 197/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 198value llvm_add_demote_memory_to_register(LLVMPassManagerRef PM) { 199 LLVMAddDemoteMemoryToRegisterPass(PM); 200 return Val_unit; 201} 202 203/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 204value llvm_add_verifier(LLVMPassManagerRef PM) { 205 LLVMAddVerifierPass(PM); 206 return Val_unit; 207} 208 209/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 210value llvm_add_correlated_value_propagation(LLVMPassManagerRef PM) { 211 LLVMAddCorrelatedValuePropagationPass(PM); 212 return Val_unit; 213} 214 215/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 216value llvm_add_early_cse(LLVMPassManagerRef PM) { 217 LLVMAddEarlyCSEPass(PM); 218 return Val_unit; 219} 220 221/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 222value llvm_add_lower_expect_intrinsic(LLVMPassManagerRef PM) { 223 LLVMAddLowerExpectIntrinsicPass(PM); 224 return Val_unit; 225} 226 227/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 228value llvm_add_lower_constant_intrinsics(LLVMPassManagerRef PM) { 229 LLVMAddLowerConstantIntrinsicsPass(PM); 230 return Val_unit; 231} 232 233/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 234value llvm_add_type_based_alias_analysis(LLVMPassManagerRef PM) { 235 LLVMAddTypeBasedAliasAnalysisPass(PM); 236 return Val_unit; 237} 238 239/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 240value llvm_add_scoped_no_alias_aa(LLVMPassManagerRef PM) { 241 LLVMAddScopedNoAliasAAPass(PM); 242 return Val_unit; 243} 244 245/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 246value llvm_add_basic_alias_analysis(LLVMPassManagerRef PM) { 247 LLVMAddBasicAliasAnalysisPass(PM); 248 return Val_unit; 249} 250 251/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 252value llvm_add_unify_function_exit_nodes(LLVMPassManagerRef PM) { 253 LLVMAddUnifyFunctionExitNodesPass(PM); 254 return Val_unit; 255} 256