diff options
author | Cyril SIX <cyril.six@kalray.eu> | 2020-10-09 15:58:21 +0200 |
---|---|---|
committer | Cyril SIX <cyril.six@kalray.eu> | 2020-10-09 15:58:21 +0200 |
commit | 7642f95b4a2c577316ae1b9696ab0d9ba4cf8b2d (patch) | |
tree | 28a08f40ddec53892a0f7a165945a0dfc5f432f8 /backend/Duplicateaux.ml | |
parent | b22f1165b23be33da6cb7f6ac681c14abec37c23 (diff) | |
download | compcert-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.ml | 28 |
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 |