diff options
-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 |