aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Linearizeaux.ml
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2020-03-06 15:59:44 +0100
committerCyril SIX <cyril.six@kalray.eu>2020-03-06 15:59:44 +0100
commit5eb64cdae7deeaef774fdead6f3ce6e4108a3256 (patch)
treeaee94c308a9dcb53f857354f103c16b816532e10 /backend/Linearizeaux.ml
parent690fa3a3969f3e1294f8b381f6b8d9c051b264d3 (diff)
downloadcompcert-kvx-5eb64cdae7deeaef774fdead6f3ce6e4108a3256.tar.gz
compcert-kvx-5eb64cdae7deeaef774fdead6f3ce6e4108a3256.zip
[UNTESTED] Sequence ordering
Diffstat (limited to 'backend/Linearizeaux.ml')
-rw-r--r--backend/Linearizeaux.ml30
1 files changed, 27 insertions, 3 deletions
diff --git a/backend/Linearizeaux.ml b/backend/Linearizeaux.ml
index 58d7558b..ce518dbb 100644
--- a/backend/Linearizeaux.ml
+++ b/backend/Linearizeaux.ml
@@ -370,9 +370,33 @@ let construct_depmap code entry fs =
let order_sequences code entry fs =
let fs_a = Array.of_list fs in
let depmap = construct_depmap code entry fs_a in
- Array.iter (fun _ -> ()) depmap;
- (* algo *)
- fs
+ let fs_evaluated = Array.map (fun e -> false) fs_a in
+ let ordered_fs = ref [] in
+ let evaluate s_id =
+ begin
+ assert (not fs_evaluated.(s_id));
+ ordered_fs := fs_a.(s_id) :: !ordered_fs;
+ fs_evaluated.(s_id) <- true;
+ Array.iteri (fun i deps ->
+ depmap.(i) <- ISet.remove s_id deps
+ ) depmap
+ end
+ in let select_next () =
+ let selected_id = ref (-1) in
+ begin
+ Array.iteri (fun i deps ->
+ if !selected_id == -1 && deps == ISet.empty && not fs_evaluated.(i)
+ then selected_id := i
+ ) depmap;
+ !selected_id
+ end
+ in begin
+ while List.length !ordered_fs != List.length fs do
+ let next_id = select_next () in
+ evaluate next_id
+ done;
+ !ordered_fs
+ end
let enumerate_aux_trace f reach =
let code = f.fn_code in