re PR middle-end/80262 (address space gets lost in memory access)
authorRichard Biener <rguenther@suse.de>
Thu, 6 Apr 2017 12:31:05 +0000 (12:31 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 6 Apr 2017 12:31:05 +0000 (12:31 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr80262.c [new file with mode: 0644]
gcc/tree-sra.c
gcc/tree-ssa-sccvn.c

index 3d13b55..020d9f8 100644 (file)
@@ -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.
index 0517d3f..db72e9a 100644 (file)
@@ -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 (file)
index 0000000..f34d06e
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile } */\r
+/* { dg-options "-O2" } */\r
+\r
+typedef struct {\r
+  int v;\r
+} S1;\r
+S1 clearS1 () { S1 s1 = { 0 }; return s1; }\r
\r
+typedef struct {\r
+  S1 s1[4];\r
+} S2;\r
+void clearS2 (__seg_gs S2* p, int n) {\r
+  for (int i = 0; i < n; ++i)\r
+    p->s1[i] = clearS1 ();\r
+}\r
\r
+typedef struct {\r
+  int pad;\r
+  S2 s2;\r
+} S3;\r
\r
+long int BASE;\r
\r
+void fn1(int n) {\r
+  clearS2 (&(((__seg_gs S3*)(BASE))->s2), n);\r
+}\r
index 02453d3..31834ed 100644 (file)
@@ -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);
index e7502de..bce247a 100644 (file)
@@ -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);