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.

Richard.

Reply via email to