re PR tree-optimization/46787 (Does not vectorize loop with load from scalar variable)
authorRichard Guenther <rguenther@suse.de>
Thu, 30 Jun 2011 13:27:43 +0000 (13:27 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 30 Jun 2011 13:27:43 +0000 (13:27 +0000)
2011-06-30  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/46787
* tree-data-ref.c (dr_address_invariant_p): Remove.
(find_data_references_in_stmt): Invariant accesses are ok now.
* tree-vect-stmts.c (vectorizable_load): Handle invariant
loads.
* tree-vect-data-refs.c (vect_analyze_data_ref_access): Allow
invariant loads.

* gcc.dg/vect/vect-121.c: New testcase.

From-SVN: r175704

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-121.c [new file with mode: 0644]
gcc/tree-data-ref.c
gcc/tree-vect-data-refs.c
gcc/tree-vect-stmts.c

index 17f1cd8681a6f137fe534d3603afead90ac6b371..6189ef81ca251ff686dfbb5f32e2c3530cc15e4c 100644 (file)
@@ -1,3 +1,13 @@
+2011-06-30  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/46787
+       * tree-data-ref.c (dr_address_invariant_p): Remove.
+       (find_data_references_in_stmt): Invariant accesses are ok now.
+       * tree-vect-stmts.c (vectorizable_load): Handle invariant
+       loads.
+       * tree-vect-data-refs.c (vect_analyze_data_ref_access): Allow
+       invariant loads.
+
 2011-06-30  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/49094
index ead74b9055a14be1d79d37fdd0cdb6bf7fab748c..ce9314187ddd719f663288aed5e79cded59aa52c 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-30  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/46787
+       * gcc.dg/vect/vect-121.c: New testcase.
+
 2011-06-30  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/49094
diff --git a/gcc/testsuite/gcc.dg/vect/vect-121.c b/gcc/testsuite/gcc.dg/vect/vect-121.c
new file mode 100644 (file)
index 0000000..9071836
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_float } */
+
+float *x;
+float parm;
+float
+test (int start, int end)
+{
+  int i;
+  for (i = start; i < end; ++i)
+    {
+      float tem = x[i];
+      x[i] = parm * tem;
+    }
+}
+
+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
index ebabf61c4dba4f57290ef8b3e3ec070117b72e75..d58542c91cae622dada11eccd4130c948c51d8ff 100644 (file)
@@ -919,21 +919,6 @@ dr_analyze_alias (struct data_reference *dr)
     }
 }
 
-/* Returns true if the address of DR is invariant.  */
-
-static bool
-dr_address_invariant_p (struct data_reference *dr)
-{
-  unsigned i;
-  tree idx;
-
-  FOR_EACH_VEC_ELT (tree, DR_ACCESS_FNS (dr), i, idx)
-    if (tree_contains_chrecs (idx, NULL))
-      return false;
-
-  return true;
-}
-
 /* Frees data reference DR.  */
 
 void
@@ -4228,19 +4213,6 @@ find_data_references_in_stmt (struct loop *nest, gimple stmt,
       dr = create_data_ref (nest, loop_containing_stmt (stmt),
                            *ref->pos, stmt, ref->is_read);
       gcc_assert (dr != NULL);
-
-      /* FIXME -- data dependence analysis does not work correctly for objects
-         with invariant addresses in loop nests.  Let us fail here until the
-        problem is fixed.  */
-      if (dr_address_invariant_p (dr) && nest)
-       {
-         free_data_ref (dr);
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, "\tFAILED as dr address is invariant\n");
-         ret = false;
-         break;
-       }
-
       VEC_safe_push (data_reference_p, heap, *datarefs, dr);
     }
   VEC_free (data_ref_loc, heap, references);
index 9a2c5b627e5923e22277c81fcf918bd2cae0cf25..1a494233088286bcce7020d397e33113a2cd0223 100644 (file)
@@ -2302,9 +2302,9 @@ vect_analyze_data_ref_access (struct data_reference *dr)
       return false;
     }
 
-  /* Don't allow invariant accesses in loops.  */
+  /* Allow invariant loads in loops.  */
   if (loop_vinfo && dr_step == 0)
-    return false;
+    return DR_IS_READ (dr);
 
   if (loop && nested_in_vect_loop_p (loop, stmt))
     {
index 1d334b01b904098de4c138a920a043b8079d607c..0d7d3dbe41dc83be4cbb3aa7a41eef45b3cbfbcb 100644 (file)
@@ -4123,7 +4123,8 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
       && code != COMPONENT_REF
       && code != IMAGPART_EXPR
       && code != REALPART_EXPR
-      && code != MEM_REF)
+      && code != MEM_REF
+      && TREE_CODE_CLASS (code) != tcc_declaration)
     return false;
 
   if (!STMT_VINFO_DATA_REF (stmt_info))
@@ -4574,30 +4575,14 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
              if (inv_p && !bb_vinfo)
                {
                  gcc_assert (!strided_load);
-                 gcc_assert (nested_in_vect_loop_p (loop, stmt));
                  if (j == 0)
                    {
-                     int k;
-                     tree t = NULL_TREE;
-                     tree vec_inv, bitpos, bitsize = TYPE_SIZE (scalar_type);
-
-                     /* CHECKME: bitpos depends on endianess?  */
-                     bitpos = bitsize_zero_node;
-                     vec_inv = build3 (BIT_FIELD_REF, scalar_type, new_temp,
-                                       bitsize, bitpos);
-                     vec_dest = vect_create_destination_var (scalar_dest,
-                                                             NULL_TREE);
-                     new_stmt = gimple_build_assign (vec_dest, vec_inv);
-                     new_temp = make_ssa_name (vec_dest, new_stmt);
-                     gimple_assign_set_lhs (new_stmt, new_temp);
-                     vect_finish_stmt_generation (stmt, new_stmt, gsi);
-
-                     for (k = nunits - 1; k >= 0; --k)
-                       t = tree_cons (NULL_TREE, new_temp, t);
-                     /* FIXME: use build_constructor directly.  */
-                     vec_inv = build_constructor_from_list (vectype, t);
+                     tree vec_inv;
+                     gimple_stmt_iterator gsi2 = *gsi;
+                     gsi_next (&gsi2);
+                     vec_inv = build_vector_from_val (vectype, scalar_dest);
                      new_temp = vect_init_vector (stmt, vec_inv,
-                                                  vectype, gsi);
+                                                  vectype, &gsi2);
                      new_stmt = SSA_NAME_DEF_STMT (new_temp);
                    }
                  else