aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Duplicateaux.ml
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2020-10-09 15:58:21 +0200
committerCyril SIX <cyril.six@kalray.eu>2020-10-09 15:58:21 +0200
commit7642f95b4a2c577316ae1b9696ab0d9ba4cf8b2d (patch)
tree28a08f40ddec53892a0f7a165945a0dfc5f432f8 /backend/Duplicateaux.ml
parentb22f1165b23be33da6cb7f6ac681c14abec37c23 (diff)
downloadcompcert-kvx-7642f95b4a2c577316ae1b9696ab0d9ba4cf8b2d.tar.gz
compcert-kvx-7642f95b4a2c577316ae1b9696ab0d9ba4cf8b2d.zip
Only unrolling on a given instruction limit
Diffstat (limited to 'backend/Duplicateaux.ml')
-rw-r--r--backend/Duplicateaux.ml28
1 files changed, 16 insertions, 12 deletions
diff --git a/backend/Duplicateaux.ml b/backend/Duplicateaux.ml
index 833bc803..4355ab5c 100644
--- a/backend/Duplicateaux.ml
+++ b/backend/Duplicateaux.ml
@@ -754,18 +754,22 @@ end
*)
let unroll_inner_loop_single code revmap iloop =
let body = HashedSet.PSet.elements (iloop.body) in
- let (code2, revmap2, dupbody, fwmap) = clone code revmap body in
- let code' = ref code2 in
- let head' = apply_map fwmap (iloop.head) in
- let final' = apply_map fwmap (iloop.final) in
- begin
- debug "PREDS: %a\n" print_intlist iloop.preds;
- debug "IHEAD: %d\n" (P.to_int iloop.head);
- code' := change_pointers !code' (iloop.head) head' (iloop.preds);
- code' := change_pointers !code' head' (iloop.head) [final'];
- (* code' := PTree.set last_n' (change_single_next first_n @@ ptree_get_some last_n' !code') !code' *)
- (!code', revmap2)
- end
+ if List.length body > !Clflags.option_funrollsingle then begin
+ debug "Too many nodes in the loop body (%d > %d)" (List.length body) !Clflags.option_funrollsingle;
+ (code, revmap)
+ end else
+ let (code2, revmap2, dupbody, fwmap) = clone code revmap body in
+ let code' = ref code2 in
+ let head' = apply_map fwmap (iloop.head) in
+ let final' = apply_map fwmap (iloop.final) in
+ begin
+ debug "PREDS: %a\n" print_intlist iloop.preds;
+ debug "IHEAD: %d\n" (P.to_int iloop.head);
+ code' := change_pointers !code' (iloop.head) head' (iloop.preds);
+ code' := change_pointers !code' head' (iloop.head) [final'];
+ (* code' := PTree.set last_n' (change_single_next first_n @@ ptree_get_some last_n' !code') !code' *)
+ (!code', revmap2)
+ end
let unroll_inner_loops_single f code revmap =
let is_loop_header = get_loop_headers code (f.fn_entrypoint) in