diff options
author | Edward Z. Yang <ezyang@mit.edu> | 2011-05-14 15:04:36 +0100 |
---|---|---|
committer | Edward Z. Yang <ezyang@mit.edu> | 2011-05-15 14:01:04 +0100 |
commit | 7365e8ee385b5036367686e43bdbcd2f876a7443 (patch) | |
tree | 65919d89ad22d6c70dbb69c97d84876419a27dc9 /compiler/cmm/CmmSpillReload.hs | |
parent | 643397208b83f1654bceeef40c793f11592ef816 (diff) | |
download | haskell-7365e8ee385b5036367686e43bdbcd2f876a7443.tar.gz |
More aggressive clobber detection with Hp and RegSlot.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
Diffstat (limited to 'compiler/cmm/CmmSpillReload.hs')
-rw-r--r-- | compiler/cmm/CmmSpillReload.hs | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/compiler/cmm/CmmSpillReload.hs b/compiler/cmm/CmmSpillReload.hs index 4679ecf356..7f2c0949d9 100644 --- a/compiler/cmm/CmmSpillReload.hs +++ b/compiler/cmm/CmmSpillReload.hs @@ -502,13 +502,26 @@ middleAssignment (Plain (CmmComment {})) assign = assign -- Assumptions: +-- * Writes using Hp do not overlap with any other memory locations +-- (An important invariant being relied on here is that we only ever +-- use Hp to allocate values on the heap, which appears to be the +-- case given hpReg usage, and that our heap writing code doesn't +-- do anything stupid like overlapping writes.) -- * Stack slots do not overlap with any other memory locations --- * Non stack-slot stores always conflict with each other. (This is --- not always the case; we could probably do something special for Hp) -- * Stack slots for different areas do not overlap -- * Stack slots within the same area and different offsets may -- overlap; we need to do a size check (see 'overlaps'). -clobbers :: (CmmExpr, CmmExpr) -> (Unique, CmmExpr) -> Bool +-- * Register slots only overlap with themselves. (But this shouldn't +-- happen in practice, because we'll fail to inline a reload across +-- the next spill.) +-- * Non stack-slot stores always conflict with each other. (This is +-- not always the case; we could probably do something special for Hp) +clobbers :: (CmmExpr, CmmExpr) -- (lhs, rhs) of clobbering CmmStore + -> (Unique, CmmExpr) -- (register, expression) that may be clobbered + -> Bool +clobbers (CmmRegOff (CmmGlobal Hp) _, _) (_, _) = False +clobbers (CmmReg (CmmGlobal Hp), _) (_, _) = False +-- ToDo: Also catch MachOp case clobbers (ss@CmmStackSlot{}, CmmReg (CmmLocal r)) (u, CmmLoad (ss'@CmmStackSlot{}) _) | getUnique r == u, ss == ss' = False -- No-op on the stack slot (XXX: Do we need this special case?) clobbers (CmmStackSlot (CallArea a) o, rhs) (_, expr) = f expr @@ -523,6 +536,9 @@ clobbers (CmmStackSlot (CallArea a) o, rhs) (_, expr) = f expr containsStackSlot (CmmMachOp _ es) = or (map containsStackSlot es) containsStackSlot (CmmStackSlot{}) = True containsStackSlot _ = False +clobbers (CmmStackSlot (RegSlot l) _, _) (_, expr) = f expr + where f (CmmLoad (CmmStackSlot (RegSlot l') _) _) = l == l' + f _ = False clobbers _ (_, e) = f e where f (CmmLoad (CmmStackSlot _ _) _) = False f (CmmLoad{}) = True -- conservative |