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?

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

Reply via email to