summaryrefslogtreecommitdiff
path: root/compiler/nativeGen/RegAlloc/Linear/Main.hs
diff options
context:
space:
mode:
authorIan Lynagh <ian@well-typed.com>2012-08-28 20:52:44 +0100
committerIan Lynagh <ian@well-typed.com>2012-08-28 20:52:44 +0100
commitc0907ed27351e4160c0c8b2a5c9877899d87aae9 (patch)
treeae34750faa31e4c334ef9e3a5556093d30c11dea /compiler/nativeGen/RegAlloc/Linear/Main.hs
parent0e7d2906e706acdd716f121abb19c433986ae830 (diff)
downloadhaskell-c0907ed27351e4160c0c8b2a5c9877899d87aae9.tar.gz
Move more code into codeGen/CodeGen/Platform.hs
HaskellMachRegs.h is no longer included in anything under compiler/ Also, includes/CodeGen.Platform.hs now includes "stg/MachRegs.h" rather than <stg/MachRegs.h> which means that we always get the file from the tree, rather than from the bootstrapping compiler.
Diffstat (limited to 'compiler/nativeGen/RegAlloc/Linear/Main.hs')
-rw-r--r--compiler/nativeGen/RegAlloc/Linear/Main.hs33
1 files changed, 15 insertions, 18 deletions
diff --git a/compiler/nativeGen/RegAlloc/Linear/Main.hs b/compiler/nativeGen/RegAlloc/Linear/Main.hs
index 54c6990948..c2f89de641 100644
--- a/compiler/nativeGen/RegAlloc/Linear/Main.hs
+++ b/compiler/nativeGen/RegAlloc/Linear/Main.hs
@@ -130,9 +130,6 @@ import Data.Maybe
import Data.List
import Control.Monad
-#include "../includes/stg/HaskellMachRegs.h"
-
-
-- -----------------------------------------------------------------------------
-- Top level of the register allocator
@@ -328,7 +325,7 @@ initBlock platform id block_live
Nothing ->
setFreeRegsR (frInitFreeRegs platform)
Just live ->
- setFreeRegsR $ foldr frAllocateReg (frInitFreeRegs platform) [ r | RegReal r <- uniqSetToList live ]
+ setFreeRegsR $ foldr (frAllocateReg platform) (frInitFreeRegs platform) [ r | RegReal r <- uniqSetToList live ]
setAssigR emptyRegMap
-- load info about register assignments leading into this block.
@@ -488,10 +485,10 @@ genRaInsn platform block_live new_instrs block_id instr r_dying w_dying =
-- (e) Delete all register assignments for temps which are read
-- (only) and die here. Update the free register list.
- releaseRegs r_dying
+ releaseRegs platform r_dying
-- (f) Mark regs which are clobbered as unallocatable
- clobberRegs real_written
+ clobberRegs platform real_written
-- (g) Allocate registers for temporaries *written* (only)
(w_spills, w_allocd) <-
@@ -499,7 +496,7 @@ genRaInsn platform block_live new_instrs block_id instr r_dying w_dying =
-- (h) Release registers for temps which are written here and not
-- used again.
- releaseRegs w_dying
+ releaseRegs platform w_dying
let
-- (i) Patch the instruction
@@ -542,19 +539,19 @@ genRaInsn platform block_live new_instrs block_id instr r_dying w_dying =
-- -----------------------------------------------------------------------------
-- releaseRegs
-releaseRegs :: FR freeRegs => [Reg] -> RegM freeRegs ()
-releaseRegs regs = do
+releaseRegs :: FR freeRegs => Platform -> [Reg] -> RegM freeRegs ()
+releaseRegs platform regs = do
assig <- getAssigR
free <- getFreeRegsR
loop assig free regs
where
loop _ free _ | free `seq` False = undefined
loop assig free [] = do setAssigR assig; setFreeRegsR free; return ()
- loop assig free (RegReal rr : rs) = loop assig (frReleaseReg rr free) rs
+ loop assig free (RegReal rr : rs) = loop assig (frReleaseReg platform rr free) rs
loop assig free (r:rs) =
case lookupUFM assig r of
- Just (InBoth real _) -> loop (delFromUFM assig r) (frReleaseReg real free) rs
- Just (InReg real) -> loop (delFromUFM assig r) (frReleaseReg real free) rs
+ Just (InBoth real _) -> loop (delFromUFM assig r) (frReleaseReg platform real free) rs
+ Just (InReg real) -> loop (delFromUFM assig r) (frReleaseReg platform real free) rs
_other -> loop (delFromUFM assig r) free rs
@@ -612,7 +609,7 @@ saveClobberedTemps platform clobbered dying
-- clobbered by this instruction; use it to save the
-- clobbered value.
(my_reg : _) -> do
- setFreeRegsR (frAllocateReg my_reg freeRegs)
+ setFreeRegsR (frAllocateReg platform my_reg freeRegs)
let new_assign = addToUFM assig temp (InReg my_reg)
let instr = mkRegRegMoveInstr platform
@@ -636,14 +633,14 @@ saveClobberedTemps platform clobbered dying
-- | Mark all these real regs as allocated,
-- and kick out their vreg assignments.
--
-clobberRegs :: FR freeRegs => [RealReg] -> RegM freeRegs ()
-clobberRegs []
+clobberRegs :: FR freeRegs => Platform -> [RealReg] -> RegM freeRegs ()
+clobberRegs _ []
= return ()
-clobberRegs clobbered
+clobberRegs platform clobbered
= do
freeregs <- getFreeRegsR
- setFreeRegsR $! foldr frAllocateReg freeregs clobbered
+ setFreeRegsR $! foldr (frAllocateReg platform) freeregs clobbered
assig <- getAssigR
setAssigR $! clobber assig (ufmToList assig)
@@ -754,7 +751,7 @@ allocRegsAndSpill_spill platform reading keep spills alloc r rs assig spill_loc
do spills' <- loadTemp platform r spill_loc my_reg spills
setAssigR (addToUFM assig r $! newLocation spill_loc my_reg)
- setFreeRegsR $ frAllocateReg my_reg freeRegs
+ setFreeRegsR $ frAllocateReg platform my_reg freeRegs
allocateRegsAndSpill platform reading keep spills' (my_reg : alloc) rs