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.