[PATCH] Eliminate GC check when no extra stack is used.
Edward Z. Yang
ezyang at MIT.EDU
Tue Apr 19 23:58:31 CEST 2011
A sanity check on this patch would be nice. Note that I need to
update the lint check with this change.
Edward
Excerpts from Edward Z. Yang's message of Tue Apr 19 17:53:38 -0400 2011:
> Signed-off-by: Edward Z. Yang <ezyang at mit.edu>
> ---
> compiler/cmm/CmmLint.hs | 1 +
> compiler/cmm/CmmStackLayout.hs | 13 +++++++++++++
> 2 files changed, 14 insertions(+), 0 deletions(-)
>
> diff --git a/compiler/cmm/CmmLint.hs b/compiler/cmm/CmmLint.hs
> index c14ad65..32fead3 100644
> --- a/compiler/cmm/CmmLint.hs
> +++ b/compiler/cmm/CmmLint.hs
> @@ -153,6 +153,7 @@ lintTarget (CmmPrim {}) = return ()
>
> checkCond :: CmmExpr -> CmmLint ()
> checkCond (CmmMachOp mop _) | isComparisonMachOp mop = return ()
> +checkCond (CmmLit (CmmInt x t)) | x == 0 || x == 1, t == wordWidth = return () -- constant values
> checkCond expr = cmmLintErr (hang (text "expression is not a conditional:") 2
> (ppr expr))
>
> diff --git a/compiler/cmm/CmmStackLayout.hs b/compiler/cmm/CmmStackLayout.hs
> index 64be51b..4be377e 100644
> --- a/compiler/cmm/CmmStackLayout.hs
> +++ b/compiler/cmm/CmmStackLayout.hs
> @@ -518,6 +518,19 @@ manifestSP spEntryMap areaMap entry_off g@(CmmGraph {g_entry=entry}) =
> replSlot spOff (CmmStackSlot a i) = CmmRegOff (CmmGlobal Sp) (spOff - (slot a + i))
> replSlot _ (CmmLit CmmHighStackMark) = -- replacing the high water mark
> CmmLit (CmmInt (toInteger (max 0 (sp_high - proc_entry_sp))) (typeWidth bWord))
> + -- Invariant: Sp is always less than SpLim. Thus, if
> + -- the high water mark is zero, we can optimize away the
> + -- conditional branch. Relies on dead code elimination
> + -- to get rid of the dead GC blocks.
> + -- EZY: Maybe turn this into a guard that checks if a
> + -- statement is stack-check ish? Maybe we should make
> + -- an actual mach-op for it, so there's no chance of
> + -- mixing this up with something else...
> + replSlot _ (CmmMachOp (MO_U_Lt _)
> + [CmmMachOp (MO_Sub _)
> + [ CmmReg (CmmGlobal Sp)
> + , CmmLit (CmmInt 0 _)],
> + CmmReg (CmmGlobal SpLim)]) = CmmLit (CmmInt 0 wordWidth)
> replSlot _ e = e
>
> replLast :: MaybeC C (CmmNode C O) -> [CmmNode O O] -> CmmNode O C -> FuelUniqSM [CmmBlock]
More information about the Cvs-ghc
mailing list