[commit: ghc] master: More CPP macros -> inline functions (0ab537c)

Simon Marlow marlowsd at gmail.com
Tue Aug 28 17:31:06 CEST 2012


On 25/08/2012 16:46, Ian Lynagh wrote:
> Repository : ssh://darcs.haskell.org//srv/darcs/ghc
>
> On branch  : master
>
> http://hackage.haskell.org/trac/ghc/changeset/0ab537c563d0b937aaef29e2bb962793d308b174
>
>> ---------------------------------------------------------------
>
> commit 0ab537c563d0b937aaef29e2bb962793d308b174
> Author: Ian Lynagh <ian at well-typed.com>
> Date:   Sat Aug 25 15:42:20 2012 +0100
>
>      More CPP macros -> inline functions
>
>      All the wibble seem to have cancelled out, and (non-debug) object sizes
>      are back to where they started.

Thanks for checking the object file sizes!  It's easy for performance 
regressions to sneak in with inoccuous-looking changes like this.  I 
agree that using inline functions is better here - some type information 
is better than none.

Cheers,
	Simon




>      I'm not 100% sure that the types are optimal, but at least now the
>      functions have types and we can fix them if necessary.
>
>> ---------------------------------------------------------------
>
>   includes/rts/storage/ClosureMacros.h |   26 +++++++++++++++-----------
>   rts/Interpreter.c                    |    2 +-
>   rts/sm/Compact.c                     |    6 +++---
>   rts/sm/Evac.c                        |    6 +++---
>   4 files changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/includes/rts/storage/ClosureMacros.h b/includes/rts/storage/ClosureMacros.h
> index fd8151e..4eefb6b 100644
> --- a/includes/rts/storage/ClosureMacros.h
> +++ b/includes/rts/storage/ClosureMacros.h
> @@ -53,21 +53,25 @@
>   #define GET_TAG(con) (get_itbl(con)->srt_bitmap)
>
>   #ifdef TABLES_NEXT_TO_CODE
> -#define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)(info) - 1)
> -#define RET_INFO_PTR_TO_STRUCT(info) ((StgRetInfoTable *)(info) - 1)
> -#define FUN_INFO_PTR_TO_STRUCT(info) ((StgFunInfoTable *)(info) - 1)
> -#define THUNK_INFO_PTR_TO_STRUCT(info) ((StgThunkInfoTable *)(info) - 1)
> -#define CON_INFO_PTR_TO_STRUCT(info) ((StgConInfoTable *)(info) - 1)
> +EXTERN_INLINE StgInfoTable *INFO_PTR_TO_STRUCT(const StgInfoTable *info);
> +EXTERN_INLINE StgInfoTable *INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgInfoTable *)info - 1;}
> +EXTERN_INLINE StgRetInfoTable *RET_INFO_PTR_TO_STRUCT(const StgInfoTable *info);
> +EXTERN_INLINE StgRetInfoTable *RET_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgRetInfoTable *)info - 1;}
> +INLINE_HEADER StgFunInfoTable *FUN_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgFunInfoTable *)info - 1;}
> +INLINE_HEADER StgThunkInfoTable *THUNK_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgThunkInfoTable *)info - 1;}
> +INLINE_HEADER StgConInfoTable *CON_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgConInfoTable *)info - 1;}
>   INLINE_HEADER StgFunInfoTable *itbl_to_fun_itbl(const StgInfoTable *i) {return (StgFunInfoTable *)(i + 1) - 1;}
>   INLINE_HEADER StgRetInfoTable *itbl_to_ret_itbl(const StgInfoTable *i) {return (StgRetInfoTable *)(i + 1) - 1;}
>   INLINE_HEADER StgThunkInfoTable *itbl_to_thunk_itbl(const StgInfoTable *i) {return (StgThunkInfoTable *)(i + 1) - 1;}
>   INLINE_HEADER StgConInfoTable *itbl_to_con_itbl(const StgInfoTable *i) {return (StgConInfoTable *)(i + 1) - 1;}
>   #else
> -#define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)info)
> -#define RET_INFO_PTR_TO_STRUCT(info) ((StgRetInfoTable *)info)
> -#define FUN_INFO_PTR_TO_STRUCT(info) ((StgFunInfoTable *)info)
> -#define THUNK_INFO_PTR_TO_STRUCT(info) ((StgThunkInfoTable *)info)
> -#define CON_INFO_PTR_TO_STRUCT(info) ((StgConInfoTable *)info)
> +EXTERN_INLINE StgInfoTable *INFO_PTR_TO_STRUCT(const StgInfoTable *info);
> +EXTERN_INLINE StgInfoTable *INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgInfoTable *)info;}
> +EXTERN_INLINE StgRetInfoTable *RET_INFO_PTR_TO_STRUCT(const StgInfoTable *info);
> +EXTERN_INLINE StgRetInfoTable *RET_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgRetInfoTable *)info;}
> +INLINE_HEADER StgThunkInfoTable *FUN_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgFunInfoTable *)info;}
> +INLINE_HEADER StgThunkInfoTable *THUNK_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgThunkInfoTable *)info;}
> +INLINE_HEADER StgConInfoTable *CON_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgConInfoTable *)info;}
>   INLINE_HEADER StgFunInfoTable *itbl_to_fun_itbl(const StgInfoTable *i) {return (StgFunInfoTable *)i;}
>   INLINE_HEADER StgRetInfoTable *itbl_to_ret_itbl(const StgInfoTable *i) {return (StgRetInfoTable *)i;}
>   INLINE_HEADER StgThunkInfoTable *itbl_to_thunk_itbl(const StgInfoTable *i) {return (StgThunkInfoTable *)i;}
> @@ -227,7 +231,7 @@ TAG_CLOSURE(StgWord tag,StgClosure * p)
>
>   INLINE_HEADER rtsBool LOOKS_LIKE_INFO_PTR_NOT_NULL (StgWord p)
>   {
> -    StgInfoTable *info = INFO_PTR_TO_STRUCT(p);
> +    StgInfoTable *info = INFO_PTR_TO_STRUCT((StgInfoTable *)p);
>       return info->type != INVALID_OBJECT && info->type < N_CLOSURE_TYPES;
>   }
>
> diff --git a/rts/Interpreter.c b/rts/Interpreter.c
> index d879fd3..f3e0700 100644
> --- a/rts/Interpreter.c
> +++ b/rts/Interpreter.c
> @@ -1183,7 +1183,7 @@ run_BCO:
>   	    int i;
>   	    int o_itbl         = BCO_GET_LARGE_ARG;
>   	    int n_words        = BCO_NEXT;
> -	    StgInfoTable* itbl = INFO_PTR_TO_STRUCT(BCO_LIT(o_itbl));
> +	    StgInfoTable* itbl = INFO_PTR_TO_STRUCT((StgInfoTable *)BCO_LIT(o_itbl));
>   	    int request        = CONSTR_sizeW( itbl->layout.payload.ptrs,
>   					       itbl->layout.payload.nptrs );
>   	    StgClosure* con = (StgClosure*)allocate_NONUPD(cap,request);
> diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c
> index 987f78b..6a50f43 100644
> --- a/rts/sm/Compact.c
> +++ b/rts/sm/Compact.c
> @@ -382,7 +382,7 @@ thread_stack(StgPtr p, StgPtr stack_end)
>   	    StgRetFun *ret_fun = (StgRetFun *)p;
>   	    StgFunInfoTable *fun_info;
>   	
> -	    fun_info = FUN_INFO_PTR_TO_STRUCT(UNTAG_CLOSURE((StgClosure *)
> +	    fun_info = FUN_INFO_PTR_TO_STRUCT((StgInfoTable *)UNTAG_CLOSURE((StgClosure *)
>                              get_threaded_info((StgPtr)ret_fun->fun)));
>   	         // *before* threading it!
>   	    thread(&ret_fun->fun);
> @@ -404,7 +404,7 @@ thread_PAP_payload (StgClosure *fun, StgClosure **payload, StgWord size)
>       StgWord bitmap;
>       StgFunInfoTable *fun_info;
>
> -    fun_info = FUN_INFO_PTR_TO_STRUCT(UNTAG_CLOSURE((StgClosure *)
> +    fun_info = FUN_INFO_PTR_TO_STRUCT((StgInfoTable *)UNTAG_CLOSURE((StgClosure *)
>                           get_threaded_info((StgPtr)fun)));
>       ASSERT(fun_info->i.type != PAP);
>
> @@ -818,7 +818,7 @@ update_fwd_compact( bdescr *blocks )
>               // that if (p&BLOCK_MASK) >= (free&BLOCK_MASK), then we
>               // definitely have enough room.  Also see bug #1147.
>               iptr = get_threaded_info(p);
> -	    info = INFO_PTR_TO_STRUCT(UNTAG_CLOSURE((StgClosure *)iptr));
> +	    info = INFO_PTR_TO_STRUCT((StgInfoTable *)UNTAG_CLOSURE((StgClosure *)iptr));
>
>   	    q = p;
>
> diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c
> index 20a5b09..867cef8 100644
> --- a/rts/sm/Evac.c
> +++ b/rts/sm/Evac.c
> @@ -875,7 +875,7 @@ selector_chain:
>
>           // make sure someone else didn't get here first...
>           if (IS_FORWARDING_PTR(info_ptr) ||
> -            INFO_PTR_TO_STRUCT(info_ptr)->type != THUNK_SELECTOR) {
> +            INFO_PTR_TO_STRUCT((StgInfoTable *)info_ptr)->type != THUNK_SELECTOR) {
>               // v. tricky now.  The THUNK_SELECTOR has been evacuated
>               // by another thread, and is now either a forwarding ptr or IND.
>               // We need to extract ourselves from the current situation
> @@ -898,7 +898,7 @@ selector_chain:
>       SET_INFO(p,&stg_WHITEHOLE_info);
>   #endif
>
> -    field = INFO_PTR_TO_STRUCT(info_ptr)->layout.selector_offset;
> +    field = INFO_PTR_TO_STRUCT((StgInfoTable *)info_ptr)->layout.selector_offset;
>
>       // The selectee might be a constructor closure,
>       // so we untag the pointer.
> @@ -959,7 +959,7 @@ selector_loop:
>                 info_ptr = (StgWord)UNTAG_CLOSURE(val)->header.info;
>                 if (!IS_FORWARDING_PTR(info_ptr))
>                 {
> -                  info = INFO_PTR_TO_STRUCT(info_ptr);
> +                  info = INFO_PTR_TO_STRUCT((StgInfoTable *)info_ptr);
>                     switch (info->type) {
>                     case IND:
>                     case IND_PERM:
>
>
>
> _______________________________________________
> Cvs-ghc mailing list
> Cvs-ghc at haskell.org
> http://www.haskell.org/mailman/listinfo/cvs-ghc
>




More information about the Cvs-ghc mailing list