The following fixes SRA dropping address-space information when
reconstructing a reference from a model in a different address-space.

Bootstrapped / tested on x86_64-unknown-linux-gnu, applied.

Richard.


        PR tree-optimization/90856
        * tree-sra.c (build_ref_for_model): Only use
        build_reconstructed_reference when address-spaces are the same.

        * gcc.target/i386/pr90856.c: New testcase.

diff --git a/gcc/testsuite/gcc.target/i386/pr90856.c 
b/gcc/testsuite/gcc.target/i386/pr90856.c
new file mode 100644
index 00000000000..a9a909b9eda
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr90856.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+typedef struct { int v; } S1;
+typedef struct { S1 s1[32]; } S2;
+
+S1 clearS1() { S1 s; s.v = 1; return s; }
+
+void
+clearS2(__seg_gs S2 *p, int n)
+{
+  for (int i = 0; i < n; ++i)
+    p->s1[i] = clearS1();
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 074d4964379..03c1a2ae9e9 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1854,6 +1854,8 @@ build_ref_for_model (location_t loc, tree base, 
HOST_WIDE_INT offset,
       tree res;
       if (model->grp_same_access_path
          && !TREE_THIS_VOLATILE (base)
+         && (TYPE_ADDR_SPACE (TREE_TYPE (base))
+             == TYPE_ADDR_SPACE (TREE_TYPE (model->expr)))
          && offset <= model->offset
          /* build_reconstructed_reference can still fail if we have already
             massaged BASE because of another type incompatibility.  */

Reply via email to