From 599823a6410f1629f2b8704291839e0974bce83b Mon Sep 17 00:00:00 2001 From: "nicolas.nardino" Date: Sat, 5 Jun 2021 19:52:59 +0200 Subject: function written, now needs testing --- scheduling/RTLpathScheduleraux.ml | 50 +++++++++++++++++++++++++++++++-------- 1 file 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 -- cgit