diff options
author | Cyril SIX <cyril.six@kalray.eu> | 2021-04-02 13:14:36 +0200 |
---|---|---|
committer | Cyril SIX <cyril.six@kalray.eu> | 2021-04-02 13:14:36 +0200 |
commit | 6d4dc7ae91e4452332e6f513733135fefd6f7f26 (patch) | |
tree | ea05c60654a29799758560de20cc93c1f9b5d10d | |
parent | a4720c58a97c08b1f8852376c39f15dd44cd0f34 (diff) | |
download | compcert-kvx-6d4dc7ae91e4452332e6f513733135fefd6f7f26.tar.gz compcert-kvx-6d4dc7ae91e4452332e6f513733135fefd6f7f26.zip |
Outermost loop detection works
-rw-r--r-- | backend/Duplicateaux.ml | 19 |
1 files changed, 10 insertions, 9 deletions
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 |