aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Duplicateaux.ml
diff options
context:
space:
mode:
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