diff options
author | Richard Biener <rguenther@suse.de> | 2017-04-06 12:31:05 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-04-06 12:31:05 +0000 |
commit | 0f78434635f6e78cae50408a8bb76c35658551d4 (patch) | |
tree | 71e473dcdaf525f910f75285eed39cb0ba9aa850 /gcc | |
parent | 23a429c2b285953c026bfd01ded764e3b16eb1a8 (diff) | |
download | gcc-0f78434635f6e78cae50408a8bb76c35658551d4.zip gcc-0f78434635f6e78cae50408a8bb76c35658551d4.tar.gz gcc-0f78434635f6e78cae50408a8bb76c35658551d4.tar.bz2 |
re PR middle-end/80262 (address space gets lost in memory access)
2017-04-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/80262
* tree-sra.c (build_ref_for_offset): Preserve address-space
information.
* tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address):
Drop useless address-space information on MEM_REF offsets.
* gcc.target/i386/pr80262.c: New testcase.
From-SVN: r246728
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr80262.c | 26 | ||||
-rw-r--r-- | gcc/tree-sra.c | 7 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 4 |
5 files changed, 48 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3d13b55..020d9f87 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-04-06 Richard Biener <rguenther@suse.de> + + PR tree-optimization/80262 + * tree-sra.c (build_ref_for_offset): Preserve address-space + information. + * tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address): + Drop useless address-space information on MEM_REF offsets. + 2017-04-05 Andreas Schwab <schwab@linux-m68k.org> * builtins.def (BUILT_IN_UPDATE_SETJMP_BUF): Fix type. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0517d3f..db72e9a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2017-04-06 Richard Biener <rguenther@suse.de> + PR tree-optimization/80262 + * gcc.target/i386/pr80262.c: New testcase. + +2017-04-06 Richard Biener <rguenther@suse.de> + PR middle-end/80281 * gcc.dg/tree-ssa/pr40921.c: Add -fp-contract=off. diff --git a/gcc/testsuite/gcc.target/i386/pr80262.c b/gcc/testsuite/gcc.target/i386/pr80262.c new file mode 100644 index 0000000..f34d06e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr80262.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef struct {
+ int v;
+} S1;
+S1 clearS1 () { S1 s1 = { 0 }; return s1; }
+
+typedef struct {
+ S1 s1[4];
+} S2;
+void clearS2 (__seg_gs S2* p, int n) {
+ for (int i = 0; i < n; ++i)
+ p->s1[i] = clearS1 ();
+}
+
+typedef struct {
+ int pad;
+ S2 s2;
+} S3;
+
+long int BASE;
+
+void fn1(int n) {
+ clearS2 (&(((__seg_gs S3*)(BASE))->s2), n);
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 02453d3..31834ed 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1638,6 +1638,13 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset, unsigned HOST_WIDE_INT misalign; unsigned int align; + /* Preserve address-space information. */ + addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (base)); + if (as != TYPE_ADDR_SPACE (exp_type)) + exp_type = build_qualified_type (exp_type, + TYPE_QUALS (exp_type) + | ENCODE_QUAL_ADDR_SPACE (as)); + gcc_checking_assert (offset % BITS_PER_UNIT == 0); get_object_alignment_1 (base, &align, &misalign); base = get_addr_base_and_unit_offset (base, &base_offset); diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index e7502de..bce247a 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1233,8 +1233,8 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops, && tem[tem.length () - 2].opcode == MEM_REF) { vn_reference_op_t new_mem_op = &tem[tem.length () - 2]; - new_mem_op->op0 = fold_convert (TREE_TYPE (mem_op->op0), - new_mem_op->op0); + new_mem_op->op0 = wide_int_to_tree (TREE_TYPE (mem_op->op0), + new_mem_op->op0); } else gcc_assert (tem.last ().opcode == STRING_CST); |