On Mon, Nov 7, 2011 at 10:25 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> Hi!
>
> This patch attempts to optimize VEC_BASE if we know
> that offsetof of base is 0 (unless the compiler is doing something
> strange, it is true).
> It doesn't have a clear code size effect, some .text sections
> grew, supposedly because of more inlining, some .text sections shrunk.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux.

I wonder why the compiler doesn't optimize this ... certainly it looks
backward to, in

<bb 2>:
  if (c_2(D) != 0B)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 3>:
  D.2948_3 = &c_2(D)->fld;
  goto <bb 5>;

<bb 4>:
  D.2948_4 = 0B;

<bb 5>:
  # D.2948_1 = PHI <D.2948_3(3), 0B(4)>
  return D.2948_1;

see that D.2948_4 is equal to D.2948_3 for c_2 == 0, so I'm not
sure which pass would be able to detect this (but the optimziation
opportunity would be on the PHI node, so maybe it should be
done in phiopt).

Would you open a bugreport for this please?

Ok.
Thanks,
Richard.

> 2011-11-07  Jakub Jelinek  <ja...@redhat.com>
>
>        * vec.h (VEC_BASE): If base is at offset 0 in the structure,
>        use &(P)->base even if P is NULL.
>
> --- gcc/vec.h.jj        2011-09-08 11:21:10.000000000 +0200
> +++ gcc/vec.h   2011-11-07 18:45:33.000000000 +0100
> @@ -549,7 +549,12 @@ typedef struct VEC(T,A)                                  
>                     \
>  } VEC(T,A)
>
>  /* Convert to base type.  */
> +#if GCC_VERSION >= 4000
> +#define VEC_BASE(P) \
> +  ((offsetof (__typeof (*P), base) == 0 || (P)) ? &(P)->base : 0)
> +#else
>  #define VEC_BASE(P)  ((P) ? &(P)->base : 0)
> +#endif
>
>  /* Vector of integer-like object.  */
>  #define DEF_VEC_I(T)                                                     \
>
>        Jakub
>

Reply via email to