On Sat, 14 Mar 2020, Jakub Jelinek wrote: > Hi! > > On the following testcase, if there is ASLR, the compiler generates > different code each time (out of 1000 invocations 994 unique assembler > contents). The problem is that undistribute_bitref_for_vector uses > a hash_map from a tree (SSA_NAME) to a vector and such a hash_map is > by default doing pointer hashing on the SSA_NAME rather than using > something stable (SSA_NAME_VERSION). > One possible way would be to use SSA_NAME_VERSION as hash function, > but given that we from the hash_map traversal just populate a vector > which is then sorted, I think it is easier to make the sort callback > use SSA_NAME_VERSION as secondary sorting key and thus ensure stable > sort (that is generally desirable anyway). > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Thanks, Richard. > 2020-03-14 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/94166 > * tree-ssa-reassoc.c (sort_by_mach_mode): Use SSA_NAME_VERSION > as secondary comparison key. > > * gcc.dg/pr94166.c: New test. > > --- gcc/tree-ssa-reassoc.c.jj 2020-01-12 11:54:38.510381771 +0100 > +++ gcc/tree-ssa-reassoc.c 2020-03-13 14:06:32.358085863 +0100 > @@ -1793,8 +1793,11 @@ sort_by_mach_mode (const void *p_i, cons > return 1; > else if (mode1 < mode2) > return -1; > - else > - return 0; > + if (SSA_NAME_VERSION (tr1) < SSA_NAME_VERSION (tr2)) > + return -1; > + else if (SSA_NAME_VERSION (tr1) > SSA_NAME_VERSION (tr2)) > + return 1; > + return 0; > } > > /* Cleanup hash map for VECTOR information. */ > --- gcc/testsuite/gcc.dg/pr94166.c.jj 2020-03-13 14:36:46.382260562 +0100 > +++ gcc/testsuite/gcc.dg/pr94166.c 2020-03-13 14:40:32.536916640 +0100 > @@ -0,0 +1,24 @@ > +/* PR tree-optimization/94166 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fcompare-debug" } */ > + > +typedef int __m128i __attribute__((__may_alias__, __vector_size__(4 * sizeof > (int)))); > +unsigned int b[512]; > + > +void > +foo (unsigned int *x, __m128i *y) > +{ > +#define A(n) __m128i v##n = y[n]; > +#define B(n) A(n##0) A(n##1) A(n##2) A(n##3) A(n##4) A(n##5) A(n##6) A(n##7) > \ > + A(n##8) A(n##9) A(n##a) A(n##b) A(n##c) A(n##d) A(n##e) A(n##f) > +#define C(n) B(n##0) B(n##1) B(n##2) B(n##3) B(n##4) B(n##5) B(n##6) B(n##7) > + C(0x) > +#undef A > +#define A(n) *(__m128i *) &b[4 * n] = v##n; > + C(0x) > +#undef A > +#define A(n) + b[4 * n] + b[4 * n + 1] + b[4 * n + 2] + b[4 * n + 3] > + *x = *x > + C(0x) > + ; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)