summary refs log tree commit diff
path: root/lo2.ml
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-03-31 15:53:31 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-03-31 16:00:25 -0400
commitb330009493aa0f7a3098e89581ddba0240a1f734 (patch)
tree41756f949a64497e59af18cb8bc0a334f02af9eb /lo2.ml
parent868667ea27271660eba1128886cfeea5ffbc4f5c (diff)
downloadroux-b330009493aa0f7a3098e89581ddba0240a1f734.tar.gz
avoid evicting arguments
Diffstat (limited to 'lo2.ml')
-rw-r--r--lo2.ml23
1 files changed, 17 insertions, 6 deletions
diff --git a/lo2.ml b/lo2.ml
index 7333ea1..509dffa 100644
--- a/lo2.ml
+++ b/lo2.ml
@@ -173,6 +173,11 @@ let regalloc (p: iprog): rprog =
         emiti (LReg r) (`Mov (LSpill s));
         r in
 
+  let getreg frz =
+    let r = getreg frz in
+    assert (not (List.mem r !free));
+    r in
+
   let regloc frz ir =
     match H.find act ir with
     | (LCon _ | LReg _) as loc -> loc
@@ -208,15 +213,21 @@ let regalloc (p: iprog): rprog =
         let r, frz =
           match lir with
           | LSpill s ->
-            let r = getreg [] in
-            emiti (LSpill s) (`Mov (LReg r));
-            if not (List.mem r !free) then
-              free := r :: !free; (* Add it straight back to free, but freeze it. *)
+            let frz =
+              let block ir l =
+                match H.find act ir with
+                | LReg r -> r :: l
+                | _ -> l in
+              match bi.(i) with
+              | `Uop (_, ir) -> [] |> block ir
+              | `Bop (ir1, _, ir2) -> [] |> block ir1 |> block ir2
+              | _ -> [] in
+            let r = getreg frz in
+            free := r :: !free; (* Add it straight back to free, but freeze it. *)
             (r, [r])
-          | LReg r -> (r, [])
+          | LReg r -> kill ir; (r, [])
           | _ -> assert false
           in
-        kill ir;
         let s = getspill ir in
         begin match bi.(i) with
         | `Con k -> ()