aboutsummaryrefslogtreecommitdiffstats
path: root/scheduling/BTLScheduleraux.ml
diff options
context:
space:
mode:
authorLéo Gourdin <leo.gourdin@univ-grenoble-alpes.fr>2021-07-20 15:21:29 +0200
committerLéo Gourdin <leo.gourdin@univ-grenoble-alpes.fr>2021-07-20 15:21:29 +0200
commita3319eb05543930844dedd9ac31ed1beaac3047e (patch)
treea9745571f4ed7841f4c231505df9102f3e84ee65 /scheduling/BTLScheduleraux.ml
parentc3ce32da7d431069ef355296bef66b112a302b78 (diff)
downloadcompcert-kvx-a3319eb05543930844dedd9ac31ed1beaac3047e.tar.gz
compcert-kvx-a3319eb05543930844dedd9ac31ed1beaac3047e.zip
Fix compile on ARM/x86 backends
Diffstat (limited to 'scheduling/BTLScheduleraux.ml')
-rw-r--r--scheduling/BTLScheduleraux.ml195
1 files changed, 4 insertions, 191 deletions
diff --git a/scheduling/BTLScheduleraux.ml b/scheduling/BTLScheduleraux.ml
index b87636e1..98bc4590 100644
--- a/scheduling/BTLScheduleraux.ml
+++ b/scheduling/BTLScheduleraux.ml
@@ -1,199 +1,11 @@
-open AST
open Maps
-open Registers
open BTL
open BTLtypes
open DebugPrint
open PrintBTL
open RTLcommonaux
-open InstructionScheduler
-open PrepassSchedulingOracleDeps
-
-let use_alias_analysis () = false
-
-let build_constraints_and_resources (opweights : opweights) insts btl =
- let last_reg_reads : int list PTree.t ref = ref PTree.empty
- and last_reg_write : (int * int) PTree.t ref = ref PTree.empty
- and last_mem_reads : int list ref = ref []
- and last_mem_write : int option ref = ref None
- and last_branch : int option ref = ref None
- and last_non_pipelined_op : int array =
- Array.make opweights.nr_non_pipelined_units (-1)
- and latency_constraints : latency_constraint list ref = ref []
- and resources = ref [] in
- let add_constraint instr_from instr_to latency =
- assert (instr_from <= instr_to);
- assert (latency >= 0);
- if instr_from = instr_to then
- if latency = 0 then ()
- else
- failwith "PrepassSchedulingOracle.get_dependencies: negative self-loop"
- else
- latency_constraints :=
- { instr_from; instr_to; latency } :: !latency_constraints
- and get_last_reads reg =
- match PTree.get reg !last_reg_reads with Some l -> l | None -> []
- in
- let add_input_mem i =
- if not (use_alias_analysis ()) then (
- (* Read after write *)
- (match !last_mem_write with None -> () | Some j -> add_constraint j i 1);
- last_mem_reads := i :: !last_mem_reads)
- and add_output_mem i =
- if not (use_alias_analysis ()) then (
- (* Write after write *)
- (match !last_mem_write with None -> () | Some j -> add_constraint j i 1);
- (* Write after read *)
- List.iter (fun j -> add_constraint j i 0) !last_mem_reads;
- last_mem_write := Some i;
- last_mem_reads := [])
- and add_input_reg i reg =
- (* Read after write *)
- (match PTree.get reg !last_reg_write with
- | None -> ()
- | Some (j, latency) -> add_constraint j i latency);
- last_reg_reads := PTree.set reg (i :: get_last_reads reg) !last_reg_reads
- and add_output_reg i latency reg =
- (* Write after write *)
- (match PTree.get reg !last_reg_write with
- | None -> ()
- | Some (j, _) -> add_constraint j i 1);
- (* Write after read *)
- List.iter (fun j -> add_constraint j i 0) (get_last_reads reg);
- last_reg_write := PTree.set reg (i, latency) !last_reg_write;
- last_reg_reads := PTree.remove reg !last_reg_reads
- in
- let add_input_regs i regs = List.iter (add_input_reg i) regs
- and irreversible_action i =
- match !last_branch with None -> () | Some j -> add_constraint j i 1
- in
- let set_branch i =
- irreversible_action i;
- last_branch := Some i
- and add_non_pipelined_resources i resources =
- Array.iter2
- (fun latency last ->
- if latency >= 0 && last >= 0 then add_constraint last i latency)
- resources last_non_pipelined_op;
- Array.iteri
- (fun rsc latency -> if latency >= 0 then last_non_pipelined_op.(rsc) <- i)
- resources
- in
- Array.iteri
- (fun i inst ->
- match inst with
- | Bnop _ ->
- let rs = Array.map (fun _ -> 0) opweights.pipelined_resource_bounds in
- resources := rs :: !resources
- | Bop (op, lr, rd, _) ->
- add_non_pipelined_resources i
- (opweights.non_pipelined_resources_of_op op (List.length lr));
- if Op.is_trapping_op op then irreversible_action i;
- add_input_regs i lr;
- add_output_reg i (opweights.latency_of_op op (List.length lr)) rd;
- let rs = opweights.resources_of_op op (List.length lr) in
- resources := rs :: !resources
- | Bload (trap, chk, addr, lr, rd, _) ->
- if trap = TRAP then irreversible_action i;
- add_input_mem i;
- add_input_regs i lr;
- add_output_reg i
- (opweights.latency_of_load trap chk addr (List.length lr))
- rd;
- let rs = opweights.resources_of_load trap chk addr (List.length lr) in
- resources := rs :: !resources
- | Bstore (chk, addr, lr, src, _) ->
- irreversible_action i;
- add_input_regs i lr;
- add_input_reg i src;
- add_output_mem i;
- let rs = opweights.resources_of_store chk addr (List.length lr) in
- resources := rs :: !resources
- | Bcond (cond, lr, BF (Bgoto s, _), ibnot, _) ->
- (* TODO gourdinl test with/out this line *)
- let live = (get_some @@ PTree.get s btl).input_regs in
- add_input_regs i (Regset.elements live);
- set_branch i;
- add_input_mem i;
- add_input_regs i lr;
- let rs = opweights.resources_of_cond cond (List.length lr) in
- resources := rs :: !resources
- | Bcond (_, _, _, _, _) ->
- failwith "get_simple_dependencies: invalid Bcond"
- | BF (_, _) -> failwith "get_simple_dependencies: BF"
- | Bseq (_, _) -> failwith "get_simple_dependencies: Bseq")
- insts;
- (!latency_constraints, Array.of_list (List.rev !resources))
-
-let define_problem (opweights : opweights) ibf btl =
- let simple_deps, resources =
- build_constraints_and_resources opweights ibf btl
- in
- {
- max_latency = -1;
- resource_bounds = opweights.pipelined_resource_bounds;
- instruction_usages = resources;
- latency_constraints = simple_deps;
- }
-
-let zigzag_scheduler problem early_ones =
- let nr_instructions = get_nr_instructions problem in
- assert (nr_instructions = Array.length early_ones);
- match list_scheduler problem with
- | Some fwd_schedule ->
- let fwd_makespan = fwd_schedule.(Array.length fwd_schedule - 1) in
- let constraints' = ref problem.latency_constraints in
- Array.iteri
- (fun i is_early ->
- if is_early then
- constraints' :=
- {
- instr_from = i;
- instr_to = nr_instructions;
- latency = fwd_makespan - fwd_schedule.(i);
- }
- :: !constraints')
- early_ones;
- validated_scheduler reverse_list_scheduler
- { problem with latency_constraints = !constraints' }
- | None -> None
-
-let prepass_scheduler_by_name name problem insts =
- match name with
- | "zigzag" ->
- let early_ones =
- Array.map
- (fun inst ->
- match inst with Bcond (_, _, _, _, _) -> true | _ -> false)
- insts
- in
- zigzag_scheduler problem early_ones
- | _ -> scheduler_by_name name problem
-
-let schedule_sequence insts btl =
- let opweights = OpWeights.get_opweights () in
- try
- if Array.length insts <= 1 then None
- else
- let nr_instructions = Array.length insts in
- let problem = define_problem opweights insts btl in
- match
- prepass_scheduler_by_name !Clflags.option_fprepass_sched problem insts
- with
- | None ->
- Printf.printf "no solution in prepass scheduling\n";
- None
- | Some solution ->
- let positions = Array.init nr_instructions (fun i -> i) in
- Array.sort
- (fun i j ->
- let si = solution.(i) and sj = solution.(j) in
- if si < sj then -1 else if si > sj then 1 else i - j)
- positions;
- Some positions
- with Failure s ->
- Printf.printf "failure in prepass scheduling: %s\n" s;
- None
+open ExpansionOracle
+open PrepassSchedulingOracle
let flatten_blk_basics ibf =
let ib = ibf.entry in
@@ -241,7 +53,8 @@ let schedule_blk n ibf btl =
let rec do_schedule btl = function
| [] -> btl
| (n, ibf) :: blks ->
- let btl' = schedule_blk n ibf btl in
+ let code_exp = expanse n ibf btl in
+ let btl' = schedule_blk n ibf code_exp in
do_schedule btl' blks
let btl_scheduler f =