Home | History | Annotate | Download | only in Ocaml
      1 (* RUN: %ocamlopt -warn-error A llvm.cmxa llvm_scalar_opts.cmxa llvm_target.cmxa %s -o %t
      2  * RUN: %t %t.bc
      3  * XFAIL: vg_leak
      4  *)
      5 
      6 (* Note: It takes several seconds for ocamlopt to link an executable with
      7          libLLVMCore.a, so it's better to write a big test than a bunch of
      8          little ones. *)
      9 
     10 open Llvm
     11 open Llvm_scalar_opts
     12 open Llvm_target
     13 
     14 let context = global_context ()
     15 let void_type = Llvm.void_type context
     16 
     17 (* Tiny unit test framework - really just to help find which line is busted *)
     18 let print_checkpoints = false
     19 
     20 let suite name f =
     21   if print_checkpoints then
     22     prerr_endline (name ^ ":");
     23   f ()
     24 
     25 
     26 (*===-- Fixture -----------------------------------------------------------===*)
     27 
     28 let filename = Sys.argv.(1)
     29 let m = create_module context filename
     30 
     31 
     32 (*===-- Transforms --------------------------------------------------------===*)
     33 
     34 let test_transforms () =
     35   let (++) x f = ignore (f x); x in
     36 
     37   let fty = function_type void_type [| |] in
     38   let fn = define_function "fn" fty m in
     39   ignore (build_ret_void (builder_at_end context (entry_block fn)));
     40   
     41   let td = DataLayout.create (target_triple m) in
     42   
     43   ignore (PassManager.create_function m
     44            ++ DataLayout.add td
     45            ++ add_verifier
     46            ++ add_constant_propagation
     47            ++ add_sccp
     48            ++ add_dead_store_elimination
     49            ++ add_aggressive_dce
     50            ++ add_scalar_repl_aggregation
     51            ++ add_scalar_repl_aggregation_ssa
     52            ++ add_scalar_repl_aggregation_with_threshold 4
     53            ++ add_ind_var_simplification
     54            ++ add_instruction_combination
     55            ++ add_licm
     56            ++ add_loop_unswitch
     57            ++ add_loop_unroll
     58            ++ add_loop_rotation
     59            ++ add_memory_to_register_promotion
     60            ++ add_memory_to_register_demotion
     61            ++ add_reassociation
     62            ++ add_jump_threading
     63            ++ add_cfg_simplification
     64            ++ add_tail_call_elimination
     65            ++ add_gvn
     66            ++ add_memcpy_opt
     67            ++ add_loop_deletion
     68            ++ add_loop_idiom
     69            ++ add_lib_call_simplification
     70            ++ add_correlated_value_propagation
     71            ++ add_early_cse
     72            ++ add_lower_expect_intrinsic
     73            ++ add_type_based_alias_analysis
     74            ++ add_basic_alias_analysis
     75            ++ add_verifier
     76            ++ PassManager.initialize
     77            ++ PassManager.run_function fn
     78            ++ PassManager.finalize
     79            ++ PassManager.dispose);
     80   
     81   DataLayout.dispose td
     82 
     83 
     84 (*===-- Driver ------------------------------------------------------------===*)
     85 
     86 let _ =
     87   suite "transforms" test_transforms;
     88   dispose_module m
     89