aboutsummaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2021-04-02 13:14:36 +0200
committerCyril SIX <cyril.six@kalray.eu>2021-04-02 13:14:36 +0200
commit6d4dc7ae91e4452332e6f513733135fefd6f7f26 (patch)
treeea05c60654a29799758560de20cc93c1f9b5d10d /backend
parenta4720c58a97c08b1f8852376c39f15dd44cd0f34 (diff)
downloadcompcert-kvx-6d4dc7ae91e4452332e6f513733135fefd6f7f26.tar.gz
compcert-kvx-6d4dc7ae91e4452332e6f513733135fefd6f7f26.zip
Outermost loop detection works
Diffstat (limited to 'backend')
-rw-r--r--backend/Duplicateaux.ml19
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