[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