diff options
author | Richard Guenther <rguenther@suse.de> | 2011-06-30 13:27:43 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-06-30 13:27:43 +0000 |
commit | 42373e0b05c26d047925387d71fa833540dad8f0 (patch) | |
tree | ce6a6cf934c4c1c58eb2379172f89d804384e2fa /gcc | |
parent | 7aa62ea1f86d6126485a01b7e91efe85544cc877 (diff) | |
download | gcc-42373e0b05c26d047925387d71fa833540dad8f0.zip gcc-42373e0b05c26d047925387d71fa833540dad8f0.tar.gz gcc-42373e0b05c26d047925387d71fa833540dad8f0.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-121.c | 18 | ||||
-rw-r--r-- | gcc/tree-data-ref.c | 28 | ||||
-rw-r--r-- | gcc/tree-vect-data-refs.c | 4 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 29 |
6 files changed, 42 insertions, 52 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 17f1cd8..6189ef8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ead74b9..ce93141 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..9071836 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-121.c @@ -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" } } */ diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index ebabf61..d58542c 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -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); diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 9a2c5b6..1a49423 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -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)) { diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 1d334b0..0d7d3db 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -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 |