[C++ patch] Reduce vtable alignment

Richard Biener richard.guenther@gmail.com
Mon May 19 08:52:00 GMT 2014


On Fri, May 16, 2014 at 9:12 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> this patch makes also the rtti type info for A in the testcase:
>
> struct A
> {
>   virtual void foo(void) {};
>   virtual void foo2(void) {};
>   virtual void foo3(void) {};
>   virtual void foo4(void) {};
>   virtual void foo5(void) {};
> } a;
>
> aligned only to the ABI requirement (8) instead of being bumped up to 16 bytes
> by the following code in i386.c:
>   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
>      to 16byte boundary.  */
>   if (TARGET_64BIT)
>     {
>       if ((opt ? AGGREGATE_TYPE_P (type) : TREE_CODE (type) == ARRAY_TYPE)
>           && TYPE_SIZE (type)
>           && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
>           && wi::geu_p (TYPE_SIZE (type), 128)
>           && align < 128)
>         return 128;
>     }
>
> Here the variable is first run through align_variable and that decides to add
> optional alignment. We really want only ABI required alignment here.
> Does the following patch look resonable?

Hmm, but if the optimizers or the target can rely on DATA_ABI_ALIGNMENT
then we can't really lower it.  Because we can make the vtable escape
to another unit that sees it as just an array of pointers?

So this looks unsafe to me.  (same may apply to the idea of
having TARGET_VTABLE_ENTRY_ALIGN at all, if that possibly
conflicts with ABI alignment requirements present otherwise).

Richard.

>         * rtti.c: Include tm_p.h
>         (emit_tinfo_decl): Align type infos only as required by the target ABI.
>
> Index: rtti.c
> ===================================================================
> --- rtti.c      (revision 210521)
> +++ rtti.c      (working copy)
> @@ -24,6 +24,7 @@ along with GCC; see the file COPYING3.
>  #include "coretypes.h"
>  #include "tm.h"
>  #include "tree.h"
> +#include "tm_p.h"
>  #include "stringpool.h"
>  #include "stor-layout.h"
>  #include "cp-tree.h"
> @@ -1596,6 +1597,12 @@ emit_tinfo_decl (tree decl)
>        DECL_INITIAL (decl) = init;
>        mark_used (decl);
>        cp_finish_decl (decl, init, false, NULL_TREE, 0);
> +      /* Avoid targets optionally bumping up the alignment to improve
> +        vector instruction accesses, tinfo are never accessed this way.  */
> +#ifdef DATA_ABI_ALIGNMENT
> +      DECL_ALIGN (decl) = DATA_ABI_ALIGNMENT (decl, TYPE_ALIGN (TREE_TYPE (decl)));
> +      DECL_USER_ALIGN (decl) = true;
> +#endif
>        return true;
>      }
>    else



More information about the Gcc-patches mailing list