Commit 42373e0b by Richard Guenther Committed by Richard Biener

re PR tree-optimization/46787 (Does not vectorize loop with load from scalar variable)

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
parent 7aa62ea1
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> 2011-06-30 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/49094 PR tree-optimization/49094
......
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> 2011-06-30 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/49094 PR tree-optimization/49094
......
/* { 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" } } */
...@@ -919,21 +919,6 @@ dr_analyze_alias (struct data_reference *dr) ...@@ -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. */ /* Frees data reference DR. */
void void
...@@ -4228,19 +4213,6 @@ find_data_references_in_stmt (struct loop *nest, gimple stmt, ...@@ -4228,19 +4213,6 @@ find_data_references_in_stmt (struct loop *nest, gimple stmt,
dr = create_data_ref (nest, loop_containing_stmt (stmt), dr = create_data_ref (nest, loop_containing_stmt (stmt),
*ref->pos, stmt, ref->is_read); *ref->pos, stmt, ref->is_read);
gcc_assert (dr != NULL); 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_safe_push (data_reference_p, heap, *datarefs, dr);
} }
VEC_free (data_ref_loc, heap, references); VEC_free (data_ref_loc, heap, references);
......
...@@ -2302,9 +2302,9 @@ vect_analyze_data_ref_access (struct data_reference *dr) ...@@ -2302,9 +2302,9 @@ vect_analyze_data_ref_access (struct data_reference *dr)
return false; return false;
} }
/* Don't allow invariant accesses in loops. */ /* Allow invariant loads in loops. */
if (loop_vinfo && dr_step == 0) if (loop_vinfo && dr_step == 0)
return false; return DR_IS_READ (dr);
if (loop && nested_in_vect_loop_p (loop, stmt)) if (loop && nested_in_vect_loop_p (loop, stmt))
{ {
......
...@@ -4123,7 +4123,8 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, ...@@ -4123,7 +4123,8 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
&& code != COMPONENT_REF && code != COMPONENT_REF
&& code != IMAGPART_EXPR && code != IMAGPART_EXPR
&& code != REALPART_EXPR && code != REALPART_EXPR
&& code != MEM_REF) && code != MEM_REF
&& TREE_CODE_CLASS (code) != tcc_declaration)
return false; return false;
if (!STMT_VINFO_DATA_REF (stmt_info)) if (!STMT_VINFO_DATA_REF (stmt_info))
...@@ -4574,30 +4575,14 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, ...@@ -4574,30 +4575,14 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
if (inv_p && !bb_vinfo) if (inv_p && !bb_vinfo)
{ {
gcc_assert (!strided_load); gcc_assert (!strided_load);
gcc_assert (nested_in_vect_loop_p (loop, stmt));
if (j == 0) if (j == 0)
{ {
int k; tree vec_inv;
tree t = NULL_TREE; gimple_stmt_iterator gsi2 = *gsi;
tree vec_inv, bitpos, bitsize = TYPE_SIZE (scalar_type); gsi_next (&gsi2);
vec_inv = build_vector_from_val (vectype, scalar_dest);
/* 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);
new_temp = vect_init_vector (stmt, vec_inv, new_temp = vect_init_vector (stmt, vec_inv,
vectype, gsi); vectype, &gsi2);
new_stmt = SSA_NAME_DEF_STMT (new_temp); new_stmt = SSA_NAME_DEF_STMT (new_temp);
} }
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment