Module StoreMotionOracle

module StoreMotionOracle: sig .. end

Store motion oracle that tries to delay store instructions


val max_simult_cand : int
val print_stats_opt : bool
val write_stats_opt : bool
type address = {
   a_chunk : AST.memory_chunk;
   a_addr : Op.addressing;
   a_args : Registers.reg list;
   a_aval : ValueDomain.aval option;
}
val mk_address : AST.memory_chunk ->
Op.addressing ->
Registers.reg list -> ValueDomain.aval option -> address
val address_disjoint : address -> address -> bool
val print_address : Stdlib.out_channel -> address -> unit
type cand = {
   c_addr : address;
   c_aux : Registers.reg;
   c_src : BTL_Invariants.store_num_t;
}
val cand_eq : cand -> cand -> bool
val cand_dep_reg : Registers.reg -> cand -> bool
val store_cand : cand -> BTL.iblock
type stores = cand list 
val store_list_before : stores -> BTL.iblock -> BTL.iblock
type ('a, 'b) join_res = 
| Jdiff of 'a
| Jmerge of 'b
val split_at : int -> 'a list -> 'a list * 'a list
val slice : int -> int -> 'a list -> 'a list
module type St_type = sig .. end
module StTotal: sig .. end
module StPartial: sig .. end
val final_succ : BTL.final -> BTL.exit list
val final_smash : BTL.final -> bool
val traverse_iblock : (BTL.iblock -> BTL.iblock) -> BTL.iblock -> BTL.iblock
type analyze_stats = {
   mutable nb_stores : int;
   mutable nb_override : int;
   mutable nb_moved : int;
   mutable nb_nodes : int;
   mutable nb_iter_Delayable : int;
   mutable nb_iter_Used : int;
   mutable nb_limit : int;
}
val init_stats : int -> analyze_stats
val print_stats : Stdlib.out_channel -> analyze_stats -> unit
val write_stats : Stdlib.out_channel -> analyze_stats -> unit
type ('a, 'b) bblock_exit = 
| BBcont of 'a
| BBfin of 'b
module Make: 
functor (St : St_type) -> sig .. end