From: Michael Matz Date: Fri, 17 Sep 2010 13:26:43 +0000 (+0000) Subject: re PR tree-optimization/43432 (Missed vectorization: "complicated access pattern... X-Git-Tag: releases/gcc-4.6.0~4283 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=18ba3ce7e3f3d220bca82a1edeadf4a1db019e7c;p=thirdparty%2Fgcc.git re PR tree-optimization/43432 (Missed vectorization: "complicated access pattern" for increasing and decreasing data indexing) PR tree-optimization/43432 * tree-vect-data-refs.c (vect_analyze_data_ref_access): Accept backwards consecutive accesses. (vect_create_data_ref_ptr): If step is negative generate decreasing IVs. * tree-vect-stmts.c (vectorizable_store): Reject negative steps. (perm_mask_for_reverse, reverse_vec_elements): New functions. (vectorizable_load): Handle loads with negative steps when easily possible. testsuite/ PR tree-optimization/43432 * lib/target-supports.exp (check_effective_target_vect_perm_byte, check_effective_target_vect_perm_short): New predicates. (check_effective_target_vect_perm): Include x86_64. * gcc.dg/vect/pr43432.c: New test. * gcc.dg/vect/vect-114.c: Adjust. * gcc.dg/vect/vect-15.c: Ditto. * gcc.dg/vect/slp-perm-8.c: Use new predicate. * gcc.dg/vect/slp-perm-9.c: Ditto. From-SVN: r164367 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 87577389a824..dd29405e0acf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2010-09-17 Michael Matz + + PR tree-optimization/43432 + * tree-vect-data-refs.c (vect_analyze_data_ref_access): + Accept backwards consecutive accesses. + (vect_create_data_ref_ptr): If step is negative generate + decreasing IVs. + * tree-vect-stmts.c (vectorizable_store): Reject negative steps. + (perm_mask_for_reverse, reverse_vec_elements): New functions. + (vectorizable_load): Handle loads with negative steps when easily + possible. + 2010-09-03 Jan Hubicka * lto-cgraph.c (compute_ltrans_boundary): Use const_value_known. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 43ea0539dd50..55f05f4c6f50 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2010-09-17 Michael Matz + + PR tree-optimization/43432 + * lib/target-supports.exp (check_effective_target_vect_perm_byte, + check_effective_target_vect_perm_short): New predicates. + (check_effective_target_vect_perm): Include x86_64. + * gcc.dg/vect/pr43432.c: New test. + * gcc.dg/vect/vect-114.c: Adjust. + * gcc.dg/vect/vect-15.c: Ditto. + * gcc.dg/vect/slp-perm-8.c: Use new predicate. + * gcc.dg/vect/slp-perm-9.c: Ditto. + 2010-09-17 Nicola Pero PR testsuite/45692 diff --git a/gcc/testsuite/gcc.dg/vect/pr43432.c b/gcc/testsuite/gcc.dg/vect/pr43432.c new file mode 100644 index 000000000000..3070318e1484 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr43432.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_float } */ +/* { dg-options "-O3 -ffast-math -fdump-tree-vect-details" } */ + + +void vector_fmul_reverse_c(float *dst, const float *src0, const float *src1, +int len){ + int i; + src1 += len-1; + for(i=0; i 1) + { + if (vect_print_dump_info (REPORT_DETAILS)) + fprintf (vect_dump, "multiple types with negative step."); + return false; + } + scalar_type = TREE_TYPE (DR_REF (dr)); mode = TYPE_MODE (vectype); @@ -3563,6 +3641,25 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, return false; } + if (negative) + { + gcc_assert (!strided_load); + alignment_support_scheme = vect_supportable_dr_alignment (dr, false); + if (alignment_support_scheme != dr_aligned + && alignment_support_scheme != dr_unaligned_supported) + { + if (vect_print_dump_info (REPORT_DETAILS)) + fprintf (vect_dump, "negative step but alignment required."); + return false; + } + if (!perm_mask_for_reverse (vectype, NULL)) + { + if (vect_print_dump_info (REPORT_DETAILS)) + fprintf (vect_dump, "negative step and reversing not supported."); + return false; + } + } + if (!vec_stmt) /* transformation not required. */ { STMT_VINFO_TYPE (stmt_info) = load_vec_info_type; @@ -3737,6 +3834,9 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, else at_loop = loop; + if (negative) + offset = size_int (-TYPE_VECTOR_SUBPARTS (vectype) + 1); + prev_stmt_info = NULL; for (j = 0; j < ncopies; j++) { @@ -3925,6 +4025,12 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, gcc_unreachable (); /* FORNOW. */ } + if (negative) + { + new_temp = reverse_vec_elements (new_temp, stmt, gsi); + new_stmt = SSA_NAME_DEF_STMT (new_temp); + } + /* Collect vector loads and later create their permutation in vect_transform_strided_load (). */ if (strided_load || slp_perm)