137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines(* RUN: cp %s %T/scalar_opts.ml
237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines * RUN: %ocamlc -g -warn-error A -package llvm.scalar_opts -linkpkg %T/scalar_opts.ml -o %t
337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines * RUN: %t %t.bc
437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines * RUN: %ocamlopt -g -warn-error A -package llvm.scalar_opts -linkpkg %T/scalar_opts.ml -o %t
58a78ff63c017796d699d297d5ab67064e8914542Erick Tryzelaar * RUN: %t %t.bc
6874f021bc16aaf4619fd818da150f1b63e408c80Daniel Dunbar * XFAIL: vg_leak
741ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen *)
841ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
9b405bbe6648d24b0cb5b03dc43c3997ac4f50a9bErick Tryzelaar(* Note: It takes several seconds for ocamlopt to link an executable with
1041ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen         libLLVMCore.a, so it's better to write a big test than a bunch of
1141ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen         little ones. *)
1241ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
1341ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksenopen Llvm
1441ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksenopen Llvm_scalar_opts
153e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenopen Llvm_target
1641ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
17b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet context = global_context ()
18b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet void_type = Llvm.void_type context
1941ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
2041ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen(* Tiny unit test framework - really just to help find which line is busted *)
218a78ff63c017796d699d297d5ab67064e8914542Erick Tryzelaarlet print_checkpoints = false
228a78ff63c017796d699d297d5ab67064e8914542Erick Tryzelaar
2341ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksenlet suite name f =
248a78ff63c017796d699d297d5ab67064e8914542Erick Tryzelaar  if print_checkpoints then
258a78ff63c017796d699d297d5ab67064e8914542Erick Tryzelaar    prerr_endline (name ^ ":");
2641ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen  f ()
2741ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
2841ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
2941ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen(*===-- Fixture -----------------------------------------------------------===*)
3041ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
3141ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksenlet filename = Sys.argv.(1)
32b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet m = create_module context filename
3341ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
3441ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
3541ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen(*===-- Transforms --------------------------------------------------------===*)
3641ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
3741ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksenlet test_transforms () =
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  let (++) x f = f x; x in
3941ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
4041ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen  let fty = function_type void_type [| |] in
4141ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen  let fn = define_function "fn" fty m in
42b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  ignore (build_ret_void (builder_at_end context (entry_block fn)));
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4416609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  ignore (PassManager.create_function m
457eb4beb4cd545c78e911add2c4497c0d1b4cf1eeErick Tryzelaar           ++ add_aggressive_dce
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_alignment_from_assumptions
4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_cfg_simplification
4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_dead_store_elimination
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_scalarizer
5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_merged_load_store_motion
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_gvn
527eb4beb4cd545c78e911add2c4497c0d1b4cf1eeErick Tryzelaar           ++ add_ind_var_simplification
537eb4beb4cd545c78e911add2c4497c0d1b4cf1eeErick Tryzelaar           ++ add_instruction_combination
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_jump_threading
557eb4beb4cd545c78e911add2c4497c0d1b4cf1eeErick Tryzelaar           ++ add_licm
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_loop_deletion
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_loop_idiom
587eb4beb4cd545c78e911add2c4497c0d1b4cf1eeErick Tryzelaar           ++ add_loop_rotation
5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_loop_reroll
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_loop_unroll
6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_loop_unswitch
6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_memcpy_opt
6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_partially_inline_lib_calls
6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_lower_switch
657eb4beb4cd545c78e911add2c4497c0d1b4cf1eeErick Tryzelaar           ++ add_memory_to_register_promotion
6641ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen           ++ add_reassociation
6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_sccp
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_scalar_repl_aggregation
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_scalar_repl_aggregation_ssa
7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_scalar_repl_aggregation_with_threshold 4
717eb4beb4cd545c78e911add2c4497c0d1b4cf1eeErick Tryzelaar           ++ add_lib_call_simplification
7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_tail_call_elimination
7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_constant_propagation
7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_memory_to_register_demotion
7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_verifier
76ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin           ++ add_correlated_value_propagation
77ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin           ++ add_early_cse
78ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin           ++ add_lower_expect_intrinsic
79ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin           ++ add_type_based_alias_analysis
8037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines           ++ add_scoped_no_alias_alias_analysis
81ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin           ++ add_basic_alias_analysis
8241ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen           ++ PassManager.initialize
8341ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen           ++ PassManager.run_function fn
8441ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen           ++ PassManager.finalize
8526f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov           ++ PassManager.dispose)
8641ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
8741ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
8841ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen(*===-- Driver ------------------------------------------------------------===*)
8941ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen
9041ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksenlet _ =
9141ba1546eb46030e9994ee14f8052a1981ae2c54Gordon Henriksen  suite "transforms" test_transforms;
9216609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  dispose_module m
93