The following fixes BB vectorization to not forget addr-space 
qualifications of loads.

Bootstrap / regtest running on x86_64-unknown-linux-gnu.

Richard.

2017-02-23  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/79683
        * tree-vect-stmts.c (vect_analyze_stmt): Do not overwrite
        vector types for data-refs.

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

Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c       (revision 245676)
+++ gcc/tree-vect-stmts.c       (working copy)
@@ -8486,37 +8486,42 @@ vect_analyze_stmt (gimple *stmt, bool *n
     {
       gcc_assert (PURE_SLP_STMT (stmt_info));
 
-      scalar_type = TREE_TYPE (gimple_get_lhs (stmt));
-      if (dump_enabled_p ())
-        {
-          dump_printf_loc (MSG_NOTE, vect_location,
-                           "get vectype for scalar type:  ");
-          dump_generic_expr (MSG_NOTE, TDF_SLIM, scalar_type);
-          dump_printf (MSG_NOTE, "\n");
-        }
+      /* Memory accesses already got their vector type assigned
+         in vect_analyze_data_refs.  */
+      if (! STMT_VINFO_DATA_REF (stmt_info))
+       {
+         scalar_type = TREE_TYPE (gimple_get_lhs (stmt));
+         if (dump_enabled_p ())
+           {
+             dump_printf_loc (MSG_NOTE, vect_location,
+                              "get vectype for scalar type:  ");
+             dump_generic_expr (MSG_NOTE, TDF_SLIM, scalar_type);
+             dump_printf (MSG_NOTE, "\n");
+           }
 
-      vectype = get_vectype_for_scalar_type (scalar_type);
-      if (!vectype)
-        {
-          if (dump_enabled_p ())
-            {
-               dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-                                "not SLPed: unsupported data-type ");
-               dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
-                                  scalar_type);
-              dump_printf (MSG_MISSED_OPTIMIZATION, "\n");
-            }
-          return false;
-        }
+         vectype = get_vectype_for_scalar_type (scalar_type);
+         if (!vectype)
+           {
+             if (dump_enabled_p ())
+               {
+                 dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                                  "not SLPed: unsupported data-type ");
+                 dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+                                    scalar_type);
+                 dump_printf (MSG_MISSED_OPTIMIZATION, "\n");
+               }
+             return false;
+           }
 
-      if (dump_enabled_p ())
-        {
-          dump_printf_loc (MSG_NOTE, vect_location, "vectype:  ");
-          dump_generic_expr (MSG_NOTE, TDF_SLIM, vectype);
-          dump_printf (MSG_NOTE, "\n");
-        }
+         if (dump_enabled_p ())
+           {
+             dump_printf_loc (MSG_NOTE, vect_location, "vectype:  ");
+             dump_generic_expr (MSG_NOTE, TDF_SLIM, vectype);
+             dump_printf (MSG_NOTE, "\n");
+           }
 
-      STMT_VINFO_VECTYPE (stmt_info) = vectype;
+         STMT_VINFO_VECTYPE (stmt_info) = vectype;
+       }
    }
 
   if (STMT_VINFO_RELEVANT_P (stmt_info))
Index: gcc/testsuite/gcc.target/i386/pr79683.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr79683.c     (nonexistent)
+++ gcc/testsuite/gcc.target/i386/pr79683.c     (working copy)
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -msse2" } */
+
+struct s {
+    __INT64_TYPE__ a;
+    __INT64_TYPE__ b;
+};
+void test(struct s __seg_gs *x) {
+    x->a += 1;
+    x->b -= 1;
+}
+
+/* We get the function vectorized, verify the load and store are
+   address-space qualified.  */
+/* { dg-final { scan-assembler-times "padd" 1 } } */
+/* { dg-final { scan-assembler-times "%gs" 2 } } */

Reply via email to