diff options
author | Richard Guenther <rguenther@suse.de> | 2011-05-13 08:31:18 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-05-13 08:31:18 +0000 |
commit | 208cb8cbad1bc9069fdf6fca6cabf506e3c2f740 (patch) | |
tree | 90437a9e073118fd500978b7e76c8d689646a8d6 | |
parent | b88ecf553e0fa2ddebfb8975dccd6fca0143ec58 (diff) | |
download | gcc-208cb8cbad1bc9069fdf6fca6cabf506e3c2f740.zip gcc-208cb8cbad1bc9069fdf6fca6cabf506e3c2f740.tar.gz gcc-208cb8cbad1bc9069fdf6fca6cabf506e3c2f740.tar.bz2 |
re PR tree-optimization/48172 (incorrect vectorization of loop in GCC 4.5.* with -O3)
2011-05-13 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48172
* tree-vect-loop-manip.c (vect_vfa_segment_size): Avoid
multiplying by number of iterations for equal step.
(vect_create_cond_for_alias_checks): Likewise.
From-SVN: r173725
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 23 |
2 files changed, 17 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c145c8..bd8db53 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-05-13 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/48172 + * tree-vect-loop-manip.c (vect_vfa_segment_size): Avoid + multiplying by number of iterations for equal step. + (vect_create_cond_for_alias_checks): Likewise. + 2011-05-13 Andreas Schwab <schwab@redhat.com> * configure.ac: Use AS_HELP_STRING throughout. diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index d990e7f..b691cd2 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -2353,23 +2353,18 @@ vect_create_cond_for_align_checks (loop_vec_info loop_vinfo, Input: DR: The data reference. - VECT_FACTOR: vectorization factor. - SCALAR_LOOP_NITERS: number of iterations. + LENGTH_FACTOR: segment length to consider. Return an expression whose value is the size of segment which will be accessed by DR. */ static tree -vect_vfa_segment_size (struct data_reference *dr, int vect_factor, - tree scalar_loop_niters) +vect_vfa_segment_size (struct data_reference *dr, tree length_factor) { tree segment_length; segment_length = size_binop (MULT_EXPR, fold_convert (sizetype, DR_STEP (dr)), - size_int (vect_factor)); - segment_length = size_binop (MULT_EXPR, - segment_length, - fold_convert (sizetype, scalar_loop_niters)); + fold_convert (sizetype, length_factor)); if (vect_supportable_dr_alignment (dr, false) == dr_explicit_realign_optimized) { @@ -2417,7 +2412,7 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, ddr_p ddr; unsigned int i; - tree part_cond_expr; + tree part_cond_expr, length_factor; /* Create expression ((store_ptr_0 + store_segment_length_0) < load_ptr_0) @@ -2465,10 +2460,12 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, vect_create_addr_base_for_vector_ref (stmt_b, cond_expr_stmt_list, NULL_TREE, loop); - segment_length_a = vect_vfa_segment_size (dr_a, vect_factor, - scalar_loop_iters); - segment_length_b = vect_vfa_segment_size (dr_b, vect_factor, - scalar_loop_iters); + if (!operand_equal_p (DR_STEP (dr_a), DR_STEP (dr_b), 0)) + length_factor = scalar_loop_iters; + else + length_factor = size_int (vect_factor); + segment_length_a = vect_vfa_segment_size (dr_a, length_factor); + segment_length_b = vect_vfa_segment_size (dr_b, length_factor); if (vect_print_dump_info (REPORT_DR_DETAILS)) { |