aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicolas.nardino <nicolas.nardino@ens-lyon.fr>2021-06-05 19:52:59 +0200
committernicolas.nardino <nicolas.nardino@ens-lyon.fr>2021-06-05 19:52:59 +0200
commit599823a6410f1629f2b8704291839e0974bce83b (patch)
tree05376659253fb47092d96cb5bcf9c2f5433d1c9f
parent98a7a04258f2cf6caf9f18925cbeeae2f5b17be4 (diff)
downloadcompcert-kvx-599823a6410f1629f2b8704291839e0974bce83b.tar.gz
compcert-kvx-599823a6410f1629f2b8704291839e0974bce83b.zip
function written, now needs testing
-rw-r--r--scheduling/RTLpathScheduleraux.ml50
1 files changed, 40 insertions, 10 deletions
diff --git a/scheduling/RTLpathScheduleraux.ml b/scheduling/RTLpathScheduleraux.ml
index 30da5d5d..5a427e6c 100644
--- a/scheduling/RTLpathScheduleraux.ml
+++ b/scheduling/RTLpathScheduleraux.ml
@@ -72,7 +72,7 @@ let get_superblocks code entry pm typing =
lsb
end
-(* PLACEHOLDER *)
+
let get_live_regs_entry (sb : superblock) code =
let seqa = Array.map (fun i ->
(match PTree.get i code with
@@ -85,16 +85,46 @@ let get_live_regs_entry (sb : superblock) code =
sb.instructions in
Array.fold_right (fun (ins, liveins) regset ->
match ins with
- | Inop l -> regset
- | Iop (op, args, dest, succ) ->
- Registers.Regset.add dest
- (List.fold_left (fun set reg ->
- Registers.Regset.remove reg set)
- regset args)
- | _ -> regset (* PLACEHOLDER *)
- ) seqa Registers.Regset.empty
-
+ | Inop _ -> regset
+ | Iop (_, args, dest, _)
+ | Iload (_, _, _, args, dest, _) ->
+ List.fold_left (fun set reg -> Registers.Regset.add reg set)
+ (Registers.Regset.remove dest regset) args
+ | Istore (_, _, args, src, _) ->
+ List.fold_left (fun set reg -> Registers.Regset.add reg set)
+ (Registers.Regset.add src regset) args
+ | Icall (_, fn, args, dest, _) ->
+ List.fold_left (fun set reg -> Registers.Regset.add reg set)
+ ((match fn with
+ | Coq_inl reg -> (Registers.Regset.add reg)
+ | Coq_inr _ -> (fun x -> x))
+ (Registers.Regset.remove dest regset))
+ args
+ | Itailcall (_, fn, args) ->
+ List.fold_left (fun set reg -> Registers.Regset.add reg set)
+ (match fn with
+ | Coq_inl reg -> (Registers.Regset.add reg regset)
+ | Coq_inr _ -> regset)
+ args
+ | Ibuiltin (_, args, dest, _) ->
+ List.fold_left (fun set reg ->
+ match reg with
+ | AST.BA r -> Registers.Regset.add r set
+ | _ -> set)
+ (match dest with
+ | AST.BR r -> Registers.Regset.remove r regset)
+ args
+ | Icond (_, args, _, _, _) ->
+ List.fold_left (fun set reg ->
+ Registers.Regset.add reg set)
+ regset args
+ | Ijumptable (reg, _)
+ | Ireturn (Some reg) ->
+ Registers.Regset.add reg regset
+ | _ -> regset
+ ) seqa sb.s_output_regs
+
(* TODO David *)
let schedule_superblock sb code =
if not !Clflags.option_fprepass