aboutsummaryrefslogtreecommitdiffstats
path: root/scheduling/InstructionScheduler.ml
diff options
context:
space:
mode:
Diffstat (limited to 'scheduling/InstructionScheduler.ml')
-rw-r--r--scheduling/InstructionScheduler.ml83
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