aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Duplicateaux.ml
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2020-10-07 17:13:26 +0200
committerCyril SIX <cyril.six@kalray.eu>2020-10-07 17:13:26 +0200
commitf9220cdfa449a8bdd0d0e2447084197b1ec6253a (patch)
tree18b888002d5eee9cfb11e149fa1c583121ea4330 /backend/Duplicateaux.ml
parentd788824fe0ff49095eb44af7aadd88aafeddc38c (diff)
downloadcompcert-kvx-f9220cdfa449a8bdd0d0e2447084197b1ec6253a.tar.gz
compcert-kvx-f9220cdfa449a8bdd0d0e2447084197b1ec6253a.zip
Performing branch prediction before loop unrolling
Diffstat (limited to 'backend/Duplicateaux.ml')
-rw-r--r--backend/Duplicateaux.ml18
1 files changed, 10 insertions, 8 deletions
diff --git a/backend/Duplicateaux.ml b/backend/Duplicateaux.ml
index 6b1fc43a..4eeb22cf 100644
--- a/backend/Duplicateaux.ml
+++ b/backend/Duplicateaux.ml
@@ -654,8 +654,10 @@ let print_ptree printer pt =
let print_pint oc i = if !debug_flag then Printf.fprintf oc "%d" (P.to_int i) else ()
-let get_inner_loops f is_loop_header =
- let (_, predmap, loopmap) = LICMaux.inner_loops f in
+let get_inner_loops f code is_loop_header =
+ let fake_f = { fn_sig = f.fn_sig; fn_params = f.fn_params;
+ fn_stacksize = f.fn_stacksize; fn_code = code; fn_entrypoint = f.fn_entrypoint } in
+ let (_, predmap, loopmap) = LICMaux.inner_loops fake_f in
begin
debug "PREDMAP: "; print_ptree print_intlist predmap;
debug "LOOPMAP: "; print_ptree print_pset loopmap;
@@ -774,10 +776,10 @@ let unroll_inner_loop_single code revmap iloop =
(!code', revmap2)
end
-let unroll_inner_loops_single f revmap =
- let is_loop_header = get_loop_headers (f.fn_code) (f.fn_entrypoint) in
- let inner_loops = get_inner_loops f is_loop_header in
- let code' = ref f.fn_code in
+let unroll_inner_loops_single f code revmap =
+ let is_loop_header = get_loop_headers code (f.fn_entrypoint) in
+ let inner_loops = get_inner_loops f code is_loop_header in
+ let code' = ref code in
let revmap' = ref revmap in
begin
print_inner_loops inner_loops;
@@ -793,8 +795,8 @@ let duplicate_aux f =
if !Clflags.option_fduplicate < 0 then
((f.fn_code, entrypoint), make_identity_ptree f.fn_code)
else
- let (code, revmap) = unroll_inner_loops_single f (make_identity_ptree (f.fn_code)) in
- let code' = update_directions code entrypoint in
+ let code = update_directions f.fn_code entrypoint in
+ let (code', revmap) = unroll_inner_loops_single f code (make_identity_ptree code) in
let traces = select_traces code' entrypoint in
let icond_code = invert_iconds code' traces in
let preds = get_predecessors_rtl icond_code in