diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-03-31 15:53:31 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-03-31 16:00:25 -0400 |
commit | b330009493aa0f7a3098e89581ddba0240a1f734 (patch) | |
tree | 41756f949a64497e59af18cb8bc0a334f02af9eb /lo2.ml | |
parent | 868667ea27271660eba1128886cfeea5ffbc4f5c (diff) | |
download | roux-b330009493aa0f7a3098e89581ddba0240a1f734.tar.gz |
avoid evicting arguments
Diffstat (limited to 'lo2.ml')
-rw-r--r-- | lo2.ml | 23 |
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 -> () |