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. */