diff options
author | nicolas.nardino <nicolas.nardino@ens-lyon.fr> | 2021-06-05 19:52:59 +0200 |
---|---|---|
committer | nicolas.nardino <nicolas.nardino@ens-lyon.fr> | 2021-06-05 19:52:59 +0200 |
commit | 599823a6410f1629f2b8704291839e0974bce83b (patch) | |
tree | 05376659253fb47092d96cb5bcf9c2f5433d1c9f /scheduling/RTLpathScheduleraux.ml | |
parent | 98a7a04258f2cf6caf9f18925cbeeae2f5b17be4 (diff) | |
download | compcert-kvx-599823a6410f1629f2b8704291839e0974bce83b.tar.gz compcert-kvx-599823a6410f1629f2b8704291839e0974bce83b.zip |
function written, now needs testing
Diffstat (limited to 'scheduling/RTLpathScheduleraux.ml')
-rw-r--r-- | scheduling/RTLpathScheduleraux.ml | 50 |
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 |