Speedup int_bit_from_pos

Jan Hubicka hubicka@ucw.cz
Mon Sep 22 17:57:00 GMT 2014


> > On Sun, 21 Sep 2014, Jan Hubicka wrote:
> > 
> > > > 
> > > > Please omit static from inline functions.
> > > 
> > > Yep, I suppose we want to drop static in all inlines? I can make patch for that.
> > > > 
> > > > Also one notable difference with your patches is that the fits hwi is now not tested on the result but on the result input which, multiplied by 8, might not fit a hwi now.  So please use wide-ints here (the to_offset flavor).
> > > 
> > > The function must always suceed (so user promise it will fit in HWI) and for
> > > performance reasons I would rather not go into wide int by defualt, but I can
> > > do that with checking enabled.
> > 
> > wide-int should be fast enough, please use it.
> 
> Like this?
> 
> Index: tree.h
> ===================================================================
> --- tree.h	(revision 215421)
> +++ tree.h	(working copy)
> @@ -3877,10 +3877,20 @@ extern tree size_in_bytes (const_tree);
>  extern HOST_WIDE_INT int_size_in_bytes (const_tree);
>  extern HOST_WIDE_INT max_int_size_in_bytes (const_tree);
>  extern tree bit_position (const_tree);
> -extern HOST_WIDE_INT int_bit_position (const_tree);
>  extern tree byte_position (const_tree);
>  extern HOST_WIDE_INT int_byte_position (const_tree);
>  
> +/* Like bit_position, but return as an integer.  It must be representable in
> +   that way (since it could be a signed value, we don't have the
> +   option of returning -1 like int_size_in_byte can.  */
> +
> +static inline HOST_WIDE_INT int_bit_position (const_tree field)
> +{ 
> +  return ((wide_int)DECL_FIELD_OFFSET (field) * BITS_PER_UNIT
> +	  + (wide_int)DECL_FIELD_BIT_OFFSET (field)).to_shwi ();

Hmm, this gets me:
/aux/hubicka/trunk-6/gcc/testsuite/gcc.c-torture/compile/20000224-1.c:39:7: internal compiler error: in decompose, at wide-int.h:911
0x656ed6 wi::int_traits<generic_wide_int<wide_int_storage> >::decompose(long*, unsigned int, generic_wide_int<wide_int_storage> const&)
        ../../gcc/wide-int.h:911
0x6ec9f4 wide_int_ref_storage<true>::wide_int_ref_storage<generic_wide_int<wide_int_storage> >(generic_wide_int<wide_int_storage> const&, unsigned int)
        ../../gcc/wide-int.h:959
0x6ec75a generic_wide_int<wide_int_ref_storage<true> >::generic_wide_int<generic_wide_int<wide_int_storage> >(generic_wide_int<wide_int_storage> const&, unsigned int)
        ../../gcc/wide-int.h:735
0x7d52ec wi::binary_traits<generic_wide_int<wide_int_storage>, generic_wide_int<wide_int_storage>, wi::int_traits<generic_wide_int<wide_int_storage> >::precision_type, wi::int_traits<generic_wide_int<wide_int_storage> >::precision_type>::result_type wi::add<generic_wide_int<wide_int_storage>, generic_wide_int<wide_int_storage> >(generic_wide_int<wide_int_storage> const&, generic_wide_int<wide_int_storage> const&)
        ../../gcc/wide-int.h:2287
0x7d4fcc wi::binary_traits<generic_wide_int<wide_int_storage>, generic_wide_int<wide_int_storage>, (wi::precision_type)1, wi::int_traits<generic_wide_int<wide_int_storage> >::precision_type>::result_type generic_wide_int<wide_int_storage>::operator+<generic_wide_int<wide_int_storage> >(generic_wide_int<wide_int_storage> const&) const
        ../../gcc/wide-int.h:696
0xf282ab int_bit_position
        ../../gcc/tree.h:3890

on precision mismatch. What is correct way to compute this?
I tried offset_int but I do not seem smart enough to get past copmile errors with that one.
> +}
> +
> +
>  #define sizetype sizetype_tab[(int) stk_sizetype]
>  #define bitsizetype sizetype_tab[(int) stk_bitsizetype]
>  #define ssizetype sizetype_tab[(int) stk_ssizetype]



More information about the Gcc-patches mailing list