tree-vectorizer.h (vect_create_data_ref_ptr): Adjust prototype.
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 28 Mar 2011 08:40:49 +0000 (08:40 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 28 Mar 2011 08:40:49 +0000 (08:40 +0000)
* tree-vectorizer.h (vect_create_data_ref_ptr): Adjust prototype.
* tree-vect-data-refs.c (vect_create_data_ref_ptr): Add GSI parameter.
Insert new statements at it in lieu of STMT.
(vect_setup_realignment): Adjust call to vect_create_data_ref_ptr.
* tree-vect-stmts.c (vectorizable_store): Likewise.
(vectorizable_load): Likewise.

From-SVN: r171592

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/slp-1.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c
gcc/tree-vect-stmts.c
gcc/tree-vectorizer.h

index bfbbf717e9cc7975cd8913a32b54797c0113510a..0c2b9312a6381db919c2c955b5b62adf739ffd28 100644 (file)
@@ -1,3 +1,12 @@
+2011-03-28  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-vectorizer.h (vect_create_data_ref_ptr): Adjust prototype.
+       * tree-vect-data-refs.c (vect_create_data_ref_ptr): Add GSI parameter.
+       Insert new statements at it in lieu of STMT.
+       (vect_setup_realignment): Adjust call to vect_create_data_ref_ptr.
+       * tree-vect-stmts.c (vectorizable_store): Likewise.
+       (vectorizable_load): Likewise.
+
 2011-03-28  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/alpha/alpha.md (addtf3): Change mode of operands to TFmode.
index fdcc95f91b479a17faa8f945694bd083373fd560..a9f70d0795aea3794726fe5eec2f090e9e81da1c 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-28  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/slp-1.c: New test.
+
 2011-03-27  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/avx256-unaligned-load-1.c: New.
diff --git a/gcc/testsuite/gcc.dg/slp-1.c b/gcc/testsuite/gcc.dg/slp-1.c
new file mode 100644 (file)
index 0000000..bb35202
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -fno-vect-cost-model" } */
+
+struct R {
+  double d1;
+  double d2;
+};
+
+struct R foo (struct R arg)
+{
+  struct R ret;
+  ret.d1 = arg.d2 * (0.0 - arg.d1);
+  ret.d2 = ret.d1;
+  return ret;
+}
index d4ba704f45989b51cd25ee16f7f8cf3585784a56..8f411140880f83b00b085c77e6901f06349bf977 100644 (file)
@@ -2922,9 +2922,10 @@ vect_create_addr_base_for_vector_ref (gimple stmt,
    2. AT_LOOP: the loop where the vector memref is to be created.
    3. OFFSET (optional): an offset to be added to the initial address accessed
         by the data-ref in STMT.
-   4. ONLY_INIT: indicate if vp is to be updated in the loop, or remain
+   4. BSI: location where the new stmts are to be placed if there is no loop
+   5. ONLY_INIT: indicate if vp is to be updated in the loop, or remain
         pointing to the initial address.
-   5. TYPE: if not NULL indicates the required type of the data-ref.
+   6. TYPE: if not NULL indicates the required type of the data-ref.
 
    Output:
    1. Declare a new ptr to vector_type, and have it point to the base of the
@@ -2952,9 +2953,9 @@ vect_create_addr_base_for_vector_ref (gimple stmt,
    4. Return the pointer.  */
 
 tree
-vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
-                         tree offset, tree *initial_address, gimple *ptr_incr,
-                         bool only_init, bool *inv_p)
+vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop, tree offset,
+                         tree *initial_address, gimple_stmt_iterator *gsi,
+                         gimple *ptr_incr, bool only_init, bool *inv_p)
 {
   tree base_name;
   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
@@ -2980,7 +2981,6 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
   gimple incr;
   tree step;
   bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
-  gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
   tree base;
 
   if (loop_vinfo)
@@ -3125,7 +3125,7 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
           gcc_assert (!new_bb);
         }
       else
-        gsi_insert_seq_before (&gsi, new_stmt_list, GSI_SAME_STMT);
+        gsi_insert_seq_before (gsi, new_stmt_list, GSI_SAME_STMT);
     }
 
   *initial_address = new_temp;
@@ -3147,7 +3147,7 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
          gcc_assert (!new_bb);
        }
       else
-       gsi_insert_before (&gsi, vec_stmt, GSI_SAME_STMT);
+       gsi_insert_before (gsi, vec_stmt, GSI_SAME_STMT);
     }
   else
     vect_ptr_init = new_temp;
@@ -3672,7 +3672,7 @@ vect_setup_realignment (gimple stmt, gimple_stmt_iterator *gsi,
       gcc_assert (!compute_in_loop);
       vec_dest = vect_create_destination_var (scalar_dest, vectype);
       ptr = vect_create_data_ref_ptr (stmt, loop_for_initial_load, NULL_TREE,
-                                     &init_addr, &inc, true, &inv_p);
+                                     &init_addr, NULL, &inc, true, &inv_p);
       new_stmt = gimple_build_assign_with_ops
                   (BIT_AND_EXPR, NULL_TREE, ptr,
                    build_int_cst (TREE_TYPE (ptr),
index 069a8eeeabd43d97977893ad40725a4758fd4588..16020e5c0eece4ca9432cbaeab5d2931e1739629 100644 (file)
@@ -3582,7 +3582,7 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
          gcc_assert (useless_type_conversion_p (vectype,
                                                 TREE_TYPE (vec_oprnd)));
          dataref_ptr = vect_create_data_ref_ptr (first_stmt, NULL, NULL_TREE,
-                                                 &dummy, &ptr_incr, false,
+                                                 &dummy, gsi, &ptr_incr, false,
                                                  &inv_p);
          gcc_assert (bb_vinfo || !inv_p);
        }
@@ -4109,9 +4109,8 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
     {
       /* 1. Create the vector pointer update chain.  */
       if (j == 0)
-        dataref_ptr = vect_create_data_ref_ptr (first_stmt,
-                                               at_loop, offset,
-                                               &dummy, &ptr_incr, false,
+        dataref_ptr = vect_create_data_ref_ptr (first_stmt, at_loop, offset,
+                                               &dummy, gsi, &ptr_incr, false,
                                                &inv_p);
       else
         dataref_ptr =
index ee8410c18110b98cf3df3206f52a259eae3ca637..4efa5be20d828d02d0d9fea4b46f49e6b2c6d5db 100644 (file)
@@ -824,7 +824,8 @@ extern bool vect_analyze_data_ref_accesses (loop_vec_info, bb_vec_info);
 extern bool vect_prune_runtime_alias_test_list (loop_vec_info);
 extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *);
 extern tree vect_create_data_ref_ptr (gimple, struct loop *, tree, tree *,
-                                      gimple *, bool, bool *);
+                                      gimple_stmt_iterator *, gimple *,
+                                      bool, bool *);
 extern tree bump_vector_ptr (tree, gimple, gimple_stmt_iterator *, gimple, tree);
 extern tree vect_create_destination_var (tree, tree);
 extern bool vect_strided_store_supported (tree);