diff options
author | Cyril SIX <cyril.six@kalray.eu> | 2020-01-31 16:55:32 +0100 |
---|---|---|
committer | Cyril SIX <cyril.six@kalray.eu> | 2020-01-31 16:55:32 +0100 |
commit | 326bdc281c60ac826129b0a0fda33dc17d8498fa (patch) | |
tree | 85938a841698012338b8aa98b614a8679f261ca0 | |
parent | d9d9c8dcc832a201812af358fba2d257b6ee8d2c (diff) | |
download | compcert-kvx-326bdc281c60ac826129b0a0fda33dc17d8498fa.tar.gz compcert-kvx-326bdc281c60ac826129b0a0fda33dc17d8498fa.zip |
Adding threshold to duplicate instructions
-rw-r--r-- | backend/Duplicateaux.ml | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/backend/Duplicateaux.ml b/backend/Duplicateaux.ml index a553a370..2dd07b76 100644 --- a/backend/Duplicateaux.ml +++ b/backend/Duplicateaux.ml @@ -498,6 +498,7 @@ let tail_duplicate code preds ptree trace = (* last_node and last_duplicate store resp. the last processed node of the trace, and its duplication *) in let last_node = ref None in let last_duplicate = ref None + in let nb_duplicated = ref 0 (* recursive function on a trace *) in let rec f code ptree is_first = function | [] -> (code, ptree) @@ -515,6 +516,7 @@ let tail_duplicate code preds ptree trace = in let (newc, newp) = duplicate code ptree !last_node n final_node_preds (P.of_int n') in begin next_int := !next_int + 1; + nb_duplicated := !nb_duplicated + 1; last_duplicate := Some (P.of_int n'); (newc, newp) end @@ -523,16 +525,20 @@ let tail_duplicate code preds ptree trace = last_node := Some n; f new_code new_ptree false t end - in f code ptree true trace + in let new_code, new_ptree = f code ptree true trace + in (new_code, new_ptree, !nb_duplicated) let superblockify_traces code preds traces = - let ptree = make_identity_ptree code + let max_nb_duplicated = 2 (* FIXME - should be architecture dependent *) + in let ptree = make_identity_ptree code in let rec f code ptree = function - | [] -> (code, ptree) + | [] -> (code, ptree, 0) | trace :: traces -> - let new_code, new_ptree = tail_duplicate code preds ptree trace - in f new_code new_ptree traces - in f code ptree traces + let new_code, new_ptree, nb_duplicated = tail_duplicate code preds ptree trace + in if (nb_duplicated < max_nb_duplicated) then f new_code new_ptree traces + else (Printf.printf "Too many duplicated nodes, aborting tail duplication\n"; (code, ptree, 0)) + in let new_code, new_ptree, _ = f code ptree traces + in (new_code, new_ptree) let rec invert_iconds_trace code = function | [] -> code |