From f9220cdfa449a8bdd0d0e2447084197b1ec6253a Mon Sep 17 00:00:00 2001 From: Cyril SIX Date: Wed, 7 Oct 2020 17:13:26 +0200 Subject: Performing branch prediction before loop unrolling --- backend/Duplicateaux.ml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'backend/Duplicateaux.ml') 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 -- cgit