aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Fasse <justus.fasse@etu.univ-grenoble-alpes.fr>2021-08-11 11:00:31 +0200
committerJustus Fasse <justus.fasse@etu.univ-grenoble-alpes.fr>2021-08-11 11:08:42 +0200
commit1a87d543372951ac483b7ff0df989ad54e16d4bd (patch)
treeee42b3b55055b3d98c7cc9761b5b14f022bfeee1
parent72cf0748a8462db5152b6b75b6aafdd45406d4d9 (diff)
downloadcompcert-kvx-1a87d543372951ac483b7ff0df989ad54e16d4bd.tar.gz
compcert-kvx-1a87d543372951ac483b7ff0df989ad54e16d4bd.zip
Better variable name and an early exit in rename_regs
-rw-r--r--scheduling/MyRTLpathScheduleraux.ml22
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