From 7642f95b4a2c577316ae1b9696ab0d9ba4cf8b2d Mon Sep 17 00:00:00 2001 From: Cyril SIX Date: Fri, 9 Oct 2020 15:58:21 +0200 Subject: Only unrolling on a given instruction limit --- backend/Duplicateaux.ml | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'backend/Duplicateaux.ml') 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 -- cgit