10a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar(* RUN: rm -rf %t.builddir 20a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: mkdir -p %t.builddir 30a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: cp %s %t.builddir 40a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: %ocamlopt -warn-error A llvm.cmxa llvm_ipo.cmxa llvm_target.cmxa %t.builddir/ipo_opts.ml -o %t 5624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin * RUN: %t %t.bc 6624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin * XFAIL: vg_leak 7624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin *) 8624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 9624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin(* Note: It takes several seconds for ocamlopt to link an executable with 10624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin libLLVMCore.a, so it's better to write a big test than a bunch of 11624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin little ones. *) 12624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 13624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinopen Llvm 14624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinopen Llvm_ipo 15624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinopen Llvm_target 16624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 17624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet context = global_context () 18624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet void_type = Llvm.void_type context 19624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet i8_type = Llvm.i8_type context 20624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 21624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin(* Tiny unit test framework - really just to help find which line is busted *) 22624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet print_checkpoints = false 23624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 24624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet suite name f = 25624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin if print_checkpoints then 26624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin prerr_endline (name ^ ":"); 27624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin f () 28624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 29624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 30624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin(*===-- Fixture -----------------------------------------------------------===*) 31624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 32624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet filename = Sys.argv.(1) 33624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet m = create_module context filename 34624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 35624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 36624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin(*===-- Transforms --------------------------------------------------------===*) 37624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 38624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet test_transforms () = 39624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin let (++) x f = ignore (f x); x in 40624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 41624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin let fty = function_type i8_type [| |] in 42624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin let fn = define_function "fn" fty m in 43624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin let fn2 = define_function "fn2" fty m in begin 44624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ignore (build_ret (const_int i8_type 4) (builder_at_end context (entry_block fn))); 45624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin let b = builder_at_end context (entry_block fn2) in 46624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ignore (build_ret (build_call fn [| |] "" b) b); 47624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin end; 48624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 49624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ignore (PassManager.create () 50624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_argument_promotion 51624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_constant_merge 52624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_dead_arg_elimination 53624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_function_attrs 54624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_function_inlining 55630109d30c5808121957afce029c27952a90a72cPeter Zotov ++ add_always_inliner 56624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_global_dce 57624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_global_optimizer 58624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_ipc_propagation 59624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_prune_eh 60624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_ipsccp 61624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_internalize 62624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_strip_dead_prototypes 63624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ add_strip_symbols 64624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin ++ PassManager.run_module m 6526f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov ++ PassManager.dispose) 66624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 67624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 68624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin(*===-- Driver ------------------------------------------------------------===*) 69624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin 70624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwinlet _ = 71624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin suite "transforms" test_transforms; 72624c5edcd485a210faa61113f38938bdb6a0cc58Torok Edwin dispose_module m 73