aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr90856.c14
-rw-r--r--gcc/tree-sra.c2
4 files changed, 27 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b8eba5e..685c06d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-06-13 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/90856
+ * tree-sra.c (build_ref_for_model): Only use
+ build_reconstructed_reference when address-spaces are the same.
+
2019-06-13 Jakub Jelinek <jakub@redhat.com>
* config/nvptx/nvptx.c (nvptx_sese_number, nvptx_sese_pseudo): Don't
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5dbfc35..b1d8ecc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-13 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/90856
+ * gcc.target/i386/pr90856.c: New testcase.
+
2019-06-13 Jakub Jelinek <jakub@redhat.com>
* g++.dg/tree-ssa/ssa-dse-1.C: Don't match exact number of chars of
diff --git a/gcc/testsuite/gcc.target/i386/pr90856.c b/gcc/testsuite/gcc.target/i386/pr90856.c
new file mode 100644
index 0000000..a9a909b
--- /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 074d496..03c1a2a 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. */