diff options
Diffstat (limited to 'scheduling/InstructionScheduler.ml')
-rw-r--r-- | scheduling/InstructionScheduler.ml | 83 |
1 files changed, 73 insertions, 10 deletions
diff --git a/scheduling/InstructionScheduler.ml b/scheduling/InstructionScheduler.ml index 08349f60..19bfaeb0 100644 --- a/scheduling/InstructionScheduler.ml +++ b/scheduling/InstructionScheduler.ml @@ -36,7 +36,7 @@ type problem = { live_regs_entry : Registers.Regset.t; typing : RTLtyping.regenv; reference_counting : ((Registers.reg, int * int) Hashtbl.t - * (Registers.reg list array)) option; + * ((Registers.reg * bool) list array)) option; instruction_usages : int array array; latency_constraints : latency_constraint list; };; @@ -363,15 +363,37 @@ let reg_pres_scheduler (problem : problem) : solution option = let regs_thresholds = Array.init nr_types_regs (fun i -> 5) in (* placeholder value *) + + let class_r r = + Machregsaux.class_of_type (problem.typing r) in + + let live_regs = Hashtbl.create 42 in List.iter (fun r -> let classe = Machregsaux.class_of_type (problem.typing r) in available_regs.(classe) - <- available_regs.(classe) - 1) + <- available_regs.(classe) - 1; + Hashtbl.add live_regs r classe) (Registers.Regset.elements live_regs_entry); + + let counts, mentions = + match problem.reference_counting with + | Some (l, r) -> l, r + | None -> assert false + in - let pressures = [| [| |] |] in + let fold_delta i = (fun a (r, b) -> + a + + if class_r r <> i then 0 else + (if b then + if (Hashtbl.find counts r = (i, 1)) + then 1 else 0 + else + match Hashtbl.find_opt live_regs r with + | None -> -1 + | Some t -> 0 + )) in let priorities = critical_paths successors in @@ -396,7 +418,14 @@ let reg_pres_scheduler (problem : problem) : solution option = let iter = MSet.iter let compare_regs i x y = - match pressures.(y).(i) - pressures.(x).(i) with + let pyi = List.fold_left (fold_delta i) 0 mentions.(y) in + print_int y; + print_string " "; + print_int pyi; + print_newline (); + flush stdout; + let pxi = List.fold_left (fold_delta i) 0 mentions.(x) in + match pyi - pxi with | 0 -> (match priorities.(y) - priorities.(x) with | 0 -> x - y | z -> z) @@ -404,10 +433,13 @@ let reg_pres_scheduler (problem : problem) : solution option = (** t is the register class *) let sched_CSR t ready usages = + print_string "looking for max delta"; + print_newline (); + flush stdout; let result = ref (-1) in iter (fun i -> if vector_less_equal usages.(i) current_resources - then if !result = -1 || (compare_regs t !result i < 0) + then if !result = -1 || (compare_regs t !result i > 0) then result := i) ready; !result end @@ -451,13 +483,28 @@ let reg_pres_scheduler (problem : problem) : solution option = let result = ref (-1) in try Array.iteri (fun i avlregs -> + print_string "avlregs: "; + print_int i; + print_string " "; + print_int avlregs; + print_newline (); + flush stdout; if avlregs <= regs_thresholds.(i) then ( let maybe = InstrSet.sched_CSR i ready usages in - (* print_int maybe; - * print_newline (); - * flush stdout; *) - if maybe > 0 && pressures.(maybe).(i) < 0 then + print_string "maybe\n"; + print_int maybe; + print_newline (); + flush stdout; + if maybe > 0 && + let delta = + List.fold_left (fold_delta i) 0 mentions.(maybe) in + print_string "delta "; + print_int delta; + print_newline (); + flush stdout; + delta + >= 0 then (vector_subtract usages.(maybe) current_resources; result := maybe; raise Exit))) available_regs; @@ -470,7 +517,23 @@ let reg_pres_scheduler (problem : problem) : solution option = -1 with Exit -> if !result <> -1 then - vector_subtract pressures.(!result) available_regs; + (List.iter (fun (r,b) -> + if b then + match Hashtbl.find_opt counts r with + | None -> assert false + | Some (t, n) -> + Hashtbl.remove counts r; + (if n = 1 then + available_regs.(t) + <- available_regs.(t) + 1) + else + let t = class_r r in + match Hashtbl.find_opt live_regs r with + | None -> (Hashtbl.add live_regs r t; + available_regs.(t) + <- available_regs.(t) - 1) + | Some i -> () + ) mentions.(!result)); !result in while !current_time < max_time |