diff options
author | Justus Fasse <justus.fasse@etu.univ-grenoble-alpes.fr> | 2021-08-11 11:00:31 +0200 |
---|---|---|
committer | Justus Fasse <justus.fasse@etu.univ-grenoble-alpes.fr> | 2021-08-11 11:08:42 +0200 |
commit | 1a87d543372951ac483b7ff0df989ad54e16d4bd (patch) | |
tree | ee42b3b55055b3d98c7cc9761b5b14f022bfeee1 | |
parent | 72cf0748a8462db5152b6b75b6aafdd45406d4d9 (diff) | |
download | compcert-kvx-1a87d543372951ac483b7ff0df989ad54e16d4bd.tar.gz compcert-kvx-1a87d543372951ac483b7ff0df989ad54e16d4bd.zip |
Better variable name and an early exit in rename_regs
-rw-r--r-- | scheduling/MyRTLpathScheduleraux.ml | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/scheduling/MyRTLpathScheduleraux.ml b/scheduling/MyRTLpathScheduleraux.ml index b2892213..a1958941 100644 --- a/scheduling/MyRTLpathScheduleraux.ml +++ b/scheduling/MyRTLpathScheduleraux.ml @@ -296,11 +296,21 @@ let update_live_renames pc live_renames fwmap regs = regs live_renames +let my_merge_overwrite m1 m2 = + PTree.combine (fun x y -> match (x, y) with + | None, None -> None + | Some x, None + | None, Some x -> Some x + | Some _, Some y -> Some y + ) m1 m2 + let rename_regs ?only_rename sb code ~liveatentry ~next_free_reg = let old_debug_flag = !debug_flag in let length = Array.length sb.instructions in assert (length > 0); + (* Early exit *) + if length = 1 then (code, PTree.empty, next_free_reg) else (* The last instruction is treated in a special way because if it defines a register, * that register cannot possibly be used afterwards in the path AND often we cannot * insert restoration code later after it since it must remain at the end of the path. @@ -315,7 +325,7 @@ let rename_regs ?only_rename sb code ~liveatentry ~next_free_reg = let (code, fwmap, live_renames, next_free_reg) = ArrayLabels.fold_left upto_last ~init:(code, fwmap, PTree.empty, next_free_reg) - ~f:(fun (code, fwmap, to_restore, next_free_reg) pc -> + ~f:(fun (code, fwmap, live_renames, next_free_reg) pc -> (* Rewrite instruction to use potentially renamed registers *) let inst = get_some @@ PTree.get pc code in let inst = change_arg_regs inst fwmap in @@ -324,11 +334,11 @@ let rename_regs ?only_rename sb code ~liveatentry ~next_free_reg = in let code = PTree.set pc inst code in - let live_renames = + let live_renames= if is_icond inst then - update_live_renames pc to_restore fwmap (get_some @@ PTree.get pc sb.liveins) + update_live_renames pc live_renames fwmap (get_some @@ PTree.get pc sb.liveins) else - to_restore + live_renames in (code, fwmap, live_renames, next_free_reg) ) @@ -336,7 +346,9 @@ let rename_regs ?only_rename sb code ~liveatentry ~next_free_reg = let last_inst = get_some @@ PTree.get last_pc code in let last_inst = change_arg_regs last_inst fwmap in - (* do NOT rename register potentially written to as part of the last instruction *) + let (last_inst, fwmap, next_free_reg) = + maybe_change_dest_reg ?only_rename last_inst fwmap ~next_free_reg + in let code = PTree.set last_pc last_inst code in let live_renames = update_live_renames last_pc live_renames fwmap sb.s_output_regs in |