open Maps open BTL open Registers open BTLtypes open RTLcommonaux let undef_node = -1 let mk_iinfo _inumb _opt_info = { inumb = _inumb; opt_info = _opt_info; visited = false; liveins = Regset.empty } let def_iinfo () = { inumb = undef_node; opt_info = None; visited = false; liveins = Regset.empty } let mk_binfo _bnumb _s_output_regs _typing = { bnumb = _bnumb; visited = false; s_output_regs = _s_output_regs; typing = _typing; } let reset_visited_ibf btl = PTree.map (fun n ibf -> ibf.binfo.visited <- false; ibf) btl let reset_visited_ib btl = List.iter (fun (n, ibf) -> let ib = ibf.entry in let rec reset_visited_ib_rec ib = match ib with | Bseq (ib1, ib2) -> reset_visited_ib_rec ib1; reset_visited_ib_rec ib2 | Bcond (_, _, ib1, ib2, iinfo) -> reset_visited_ib_rec ib1; reset_visited_ib_rec ib2; iinfo.visited <- false | Bnop (Some iinfo) | Bop (_, _, _, iinfo) | Bload (_, _, _, _, _, iinfo) | Bstore (_, _, _, _, iinfo) | BF (_, iinfo) -> iinfo.visited <- false | _ -> () in reset_visited_ib_rec ib) (PTree.elements btl); btl let jump_visit = function | Bcond (_, _, _, _, iinfo) | Bnop (Some iinfo) | Bop (_, _, _, iinfo) | Bload (_, _, _, _, _, iinfo) | Bstore (_, _, _, _, iinfo) | BF (_, iinfo) -> if iinfo.visited then true else ( iinfo.visited <- true; false) | Bseq (_, _) -> false | Bnop None -> true let rec get_inumb_or_next = function | BF (Bgoto s, _) -> p2i s | BF (_, iinfo) | Bnop (Some iinfo) | Bop (_, _, _, iinfo) | Bload (_, _, _, _, _, iinfo) | Bstore (_, _, _, _, iinfo) | Bcond (_, _, _, _, iinfo) -> iinfo.inumb | Bseq (ib1, _) -> get_inumb_or_next ib1 | _ -> failwith "get_inumb_or_next: Bnop None" let get_liveins = function | BF (_, iinfo) | Bnop (Some iinfo) | Bop (_, _, _, iinfo) | Bload (_, _, _, _, _, iinfo) | Bstore (_, _, _, _, iinfo) | Bcond (_, _, _, _, iinfo) -> iinfo.liveins | _ -> failwith "get_liveins: invalid iblock"