From 6d4dc7ae91e4452332e6f513733135fefd6f7f26 Mon Sep 17 00:00:00 2001 From: Cyril SIX Date: Fri, 2 Apr 2021 13:14:36 +0200 Subject: Outermost loop detection works --- backend/Duplicateaux.ml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'backend/Duplicateaux.ml') diff --git a/backend/Duplicateaux.ml b/backend/Duplicateaux.ml index 17beb4d0..e864a370 100644 --- a/backend/Duplicateaux.ml +++ b/backend/Duplicateaux.ml @@ -306,21 +306,25 @@ let get_loop_bodies code entrypoint = (* Returns a PTree of either None or Some b where b determines the node in the loop body, for a cb instruction *) let get_loop_info f is_loop_header bfs_order code = let loop_info = ref (PTree.map (fun n i -> None) code) in - let mark_iloop iloop = + let mark_body body = List.iter (fun n -> match get_some @@ PTree.get n code with | Icond (_, _, ifso, ifnot, _) -> - let b1 = List.mem ifso iloop.body in - let b2 = List.mem ifnot iloop.body in + let b1 = List.mem ifso body in + let b2 = List.mem ifnot body in if (b1 && b2) then () else if (b1 || b2) then begin if b1 then loop_info := PTree.set n (Some true) !loop_info else if b2 then loop_info := PTree.set n (Some false) !loop_info end | _ -> () - ) iloop.body - in let iloops = get_inner_loops f code is_loop_header in - List.iter mark_iloop iloops; + ) body + in let bodymap = get_loop_bodies code f.fn_entrypoint in + List.iter (fun (_,obody) -> + match obody with + | None -> () + | Some body -> mark_body body + ) (PTree.elements bodymap); !loop_info (* Remark - compared to the original Branch Prediction for Free paper, we don't use the store heuristic *) @@ -962,9 +966,6 @@ let loop_rotate f = ((code, entrypoint), revmap) let static_predict f = - debug_flag := true; - Printf.printf "Loop bodies: %a" print_ptree_oplist (get_loop_bodies f.fn_code f.fn_entrypoint); - debug_flag := false; let entrypoint = f.fn_entrypoint in let code = f.fn_code in let revmap = make_identity_ptree code in -- cgit