re PR tree-optimization/84737 (20% degradation in CPU2000 172.mgrid starting with...
authorRichard Biener <rguenther@suse.de>
Thu, 19 Apr 2018 12:41:42 +0000 (12:41 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 19 Apr 2018 12:41:42 +0000 (12:41 +0000)
2018-04-19  Richard Biener  <rguenther@suse.de>

PR tree-optimization/84737
* tree-vect-data-refs.c (vect_copy_ref_info): New function
copying restrict info.
(vect_setup_realignment): Use it.
* tree-vectorizer.h (vect_copy_ref_info): Declare.
* tree-vect-stmts.c (vectorizable_store): Copy ref info from
the first DR to all generated stores.
(vectorizable_load): Likewise for loads.

From-SVN: r259493

gcc/ChangeLog
gcc/tree-vect-data-refs.c
gcc/tree-vect-stmts.c
gcc/tree-vectorizer.h

index 0fa244a..12c2ec1 100644 (file)
@@ -1,3 +1,14 @@
+2018-04-19  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84737
+       * tree-vect-data-refs.c (vect_copy_ref_info): New function
+       copying restrict info.
+       (vect_setup_realignment): Use it.
+       * tree-vectorizer.h (vect_copy_ref_info): Declare.
+       * tree-vect-stmts.c (vectorizable_store): Copy ref info from
+       the first DR to all generated stores.
+       (vectorizable_load): Likewise for loads.
+
 2018-04-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/85446
index 161a886..9aabcc1 100644 (file)
@@ -5010,6 +5010,27 @@ bump_vector_ptr (tree dataref_ptr, gimple *ptr_incr, gimple_stmt_iterator *gsi,
 }
 
 
+/* Copy memory reference info such as base/clique from the SRC reference
+   to the DEST MEM_REF.  */
+
+void
+vect_copy_ref_info (tree dest, tree src)
+{
+  if (TREE_CODE (dest) != MEM_REF)
+    return;
+
+  tree src_base = src;
+  while (handled_component_p (src_base))
+    src_base = TREE_OPERAND (src_base, 0);
+  if (TREE_CODE (src_base) != MEM_REF
+      && TREE_CODE (src_base) != TARGET_MEM_REF)
+    return;
+
+  MR_DEPENDENCE_CLIQUE (dest) = MR_DEPENDENCE_CLIQUE (src_base);
+  MR_DEPENDENCE_BASE (dest) = MR_DEPENDENCE_BASE (src_base);
+}
+
+
 /* Function vect_create_destination_var.
 
    Create a new temporary of type VECTYPE.  */
@@ -5561,6 +5582,7 @@ vect_setup_realignment (gimple *stmt, gimple_stmt_iterator *gsi,
       data_ref
        = build2 (MEM_REF, TREE_TYPE (vec_dest), new_temp,
                  build_int_cst (reference_alias_ptr_type (DR_REF (dr)), 0));
+      vect_copy_ref_info (data_ref, DR_REF (dr));
       new_stmt = gimple_build_assign (vec_dest, data_ref);
       new_temp = make_ssa_name (vec_dest, new_stmt);
       gimple_assign_set_lhs (new_stmt, new_temp);
index 7cdabe1..3e73118 100644 (file)
@@ -6660,6 +6660,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
                                                 group_el * elsz);
                  newref = build2 (MEM_REF, ltype,
                                   running_off, this_off);
+                 vect_copy_ref_info (newref, DR_REF (first_dr));
 
                  /* And store it to *running_off.  */
                  assign = gimple_build_assign (newref, elem);
@@ -7052,6 +7053,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
                    TREE_TYPE (data_ref)
                      = build_aligned_type (TREE_TYPE (data_ref),
                                            TYPE_ALIGN (elem_type));
+                 vect_copy_ref_info (data_ref, DR_REF (first_dr));
                  new_stmt = gimple_build_assign (data_ref, vec_oprnd);
                }
              vect_finish_stmt_generation (stmt, new_stmt, gsi);
@@ -7659,9 +7661,9 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
            {
              tree this_off = build_int_cst (TREE_TYPE (alias_off),
                                             group_el * elsz + cst_offset);
-             new_stmt = gimple_build_assign (make_ssa_name (ltype),
-                                             build2 (MEM_REF, ltype,
-                                                     running_off, this_off));
+             tree data_ref = build2 (MEM_REF, ltype, running_off, this_off);
+             vect_copy_ref_info (data_ref, DR_REF (first_dr));
+             new_stmt = gimple_build_assign (make_ssa_name (ltype), data_ref);
              vect_finish_stmt_generation (stmt, new_stmt, gsi);
              if (nloads > 1)
                CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
@@ -8205,6 +8207,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
                    data_ref
                      = build2 (MEM_REF, vectype, ptr,
                                build_int_cst (ref_type, 0));
+                   vect_copy_ref_info (data_ref, DR_REF (first_dr));
                    vec_dest = vect_create_destination_var (scalar_dest,
                                                            vectype);
                    new_stmt = gimple_build_assign (vec_dest, data_ref);
@@ -8254,7 +8257,10 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
              vec_dest = vect_create_destination_var (scalar_dest, vectype);
              /* DATA_REF is null if we've already built the statement.  */
              if (data_ref)
-               new_stmt = gimple_build_assign (vec_dest, data_ref);
+               {
+                 vect_copy_ref_info (data_ref, DR_REF (first_dr));
+                 new_stmt = gimple_build_assign (vec_dest, data_ref);
+               }
              new_temp = make_ssa_name (vec_dest, new_stmt);
              gimple_set_lhs (new_stmt, new_temp);
              vect_finish_stmt_generation (stmt, new_stmt, gsi);
index 33e6a91..7e2b00f 100644 (file)
@@ -1494,6 +1494,7 @@ extern tree vect_create_data_ref_ptr (gimple *, tree, struct loop *, tree,
                                      tree = NULL_TREE, tree = NULL_TREE);
 extern tree bump_vector_ptr (tree, gimple *, gimple_stmt_iterator *, gimple *,
                             tree);
+extern void vect_copy_ref_info (tree, tree);
 extern tree vect_create_destination_var (tree, tree);
 extern bool vect_grouped_store_supported (tree, unsigned HOST_WIDE_INT);
 extern bool vect_store_lanes_supported (tree, unsigned HOST_WIDE_INT, bool);