This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: increase alignment of global structs in increase_alignment pass
- From: Richard Biener <rguenther at suse dot de>
- To: Prathamesh Kulkarni <prathamesh dot kulkarni at linaro dot org>
- Cc: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Tue, 23 Feb 2016 13:01:56 +0100 (CET)
- Subject: Re: increase alignment of global structs in increase_alignment pass
- Authentication-results: sourceware.org; auth=none
- References: <CAAgBjMnzo0xM_+JAiRS7J3P9sDF-Uoe-k6Q_7fL1dZD+W+x3qA at mail dot gmail dot com> <alpine dot LSU dot 2 dot 11 dot 1602221304130 dot 31547 at t29 dot fhfr dot qr> <CAAgBjM=Oa6Ex9D7qjDq71DsaPvSqNgzM5xpxbsai0Eyuy+PfGg at mail dot gmail dot com>
On Tue, 23 Feb 2016, Prathamesh Kulkarni wrote:
> On 22 February 2016 at 17:36, Richard Biener <rguenther@suse.de> wrote:
> > On Mon, 22 Feb 2016, Prathamesh Kulkarni wrote:
> >
> >> Hi Richard,
> >> As discussed in private mail, this version of patch attempts to
> >> increase alignment
> >> of global struct decl if it contains an an array field(s) and array's
> >> offset is a multiple of the alignment of vector type corresponding to
> >> it's scalar type and recursively checks for nested structs.
> >> eg:
> >> static struct
> >> {
> >> int a, b, c, d;
> >> int k[4];
> >> float f[10];
> >> };
> >> k is a candidate array since it's offset is 16 and alignment of
> >> "vector (4) int" is 8.
> >> Similarly for f.
> >>
> >> I haven't been able to create a test-case where there are
> >> multiple candidate arrays and vector alignment of arrays are different.
> >> I suppose in this case we will have to increase alignment
> >> of the struct by the max alignment ?
> >> eg:
> >> static struct
> >> {
> >> <fields>
> >> T1 k[S1]
> >> <fields>
> >> T2 f[S2]
> >> <fields>
> >> };
> >>
> >> if V1 is vector type corresponding to T1, and V2 corresponding vector
> >> type to T2,
> >> offset (k) % align(V1) == 0 and offset (f) % align(V2) == 0
> >> and align (V1) > align(V2) then we will increase alignment of struct
> >> by align(V1).
> >>
> >> Testing showed FAIL for g++.dg/torture/pr31863.C due to program timeout.
> >> Initially it appeared to me, it went in infinite loop. However
> >> on second thoughts I think it's probably not an infinite loop, rather
> >> taking (extraordinarily) large amount of time
> >> to compile the test-case with the patch.
> >> The test-case builds quickly for only 2 instantiations of ClassSpec
> >> (ClassSpec<Key, A001, 1>,
> >> ClassSpec<Key, A002, 2>)
> >> Building with 22 instantiations (upto ClassSpec<Key, A0023, 22>) takes up
> >> to ~1m to compile.
> >> with:
> >> 23 instantiations: ~2m
> >> 24 instantiations: ~5m
> >> For 30 instantiations I terminated cc1plus after 13m (by SIGKILL).
> >>
> >> I guess it shouldn't go in an infinite loop because:
> >> a) structs cannot have circular references.
> >> b) works for lower number of instantiations
> >> However I have no sound evidence that it cannot be in infinite loop.
> >> I don't understand why a decl node is getting visited more than once
> >> for that test-case.
> >>
> >> Using a hash_map to store alignments of decl's so that decl node gets visited
> >> only once prevents the issue.
> >
> > Maybe aliases. Try not walking vnode->alias == true vars.
> Hi,
> I have a hypothesis why decl node gets visited multiple times.
>
> Consider the test-case:
> template <typename T, unsigned N>
> struct X
> {
> T a;
> virtual int foo() { return N; }
> };
>
> typedef struct X<int, 1> x_1;
> typedef struct X<int ,2> x_2;
>
> static x_1 obj1 __attribute__((used));
> static x_2 obj2 __attribute__((used));
>
> Two additional structs are created by C++FE, c++filt shows:
> _ZTI1XIiLj1EE -> typeinfo for X<int, 1u>
> _ZTI1XIiLj2EE -> typeinfo for X<int, 2u>
>
> Both of these structs have only one field D.2991 and it appears it's
> *shared* between them:
> struct D.2991;
> const void * D.2980;
> const char * D.2981;
>
> Hence the decl node D.2991 and it's fields (D.2890, D.2981) get visited twice:
> once when walking _ZTI1XIiLj1EE and 2nd time when walking _ZTI1XIiLj2EE
>
> Dump of walking over the global structs for above test-case:
> http://pastebin.com/R5SABW0c
>
> So it appears to me to me a DAG (interior node == struct decl, leaf ==
> non-struct field,
> edge from node1 -> node2 if node2 is field of node1) is getting
> created when struct decl
> is a type-info object.
>
> I am not really clear on how we should proceed:
> a) Keep using hash_map to store alignments so that every decl gets
> visited only once.
> b) Skip walking artificial record decls.
> I am not sure if skipping all artificial struct decls would be a good
> idea, but I don't
> think it's possible to identify if a struct-decl is typeinfo struct at
> middle-end ?
You shouldn't end up walking those when walking the type of
global decls. That is, don't walk typeinfo decls - yes, practically
that means just not walking DECL_ARTIFICIAL things.
Richard.