From 49ab46214e9288ee1268f87ddcd64dacfd21c31d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 3 May 2017 11:01:06 +0000 Subject: [PATCH] tree-vect-data-refs.c (vect_enhance_data_refs_alignment): When all DRs have unknown misaligned do not always peel when... 2017-05-03 Richard Biener * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): When all DRs have unknown misaligned do not always peel when there is a store but apply the same costing model as if there were only loads. * gcc.dg/vect/costmodel/x86_64/costmodel-alignpeel.c: New testcase. From-SVN: r247544 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 4 ++++ .../vect/costmodel/x86_64/costmodel-alignpeel.c | 9 +++++++++ gcc/tree-vect-data-refs.c | 14 +++++++------- 4 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-alignpeel.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8dee382d10a..0c54109a5f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-05-03 Richard Biener + + * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): + When all DRs have unknown misaligned do not always peel + when there is a store but apply the same costing model as if + there were only loads. + 2017-05-03 Richard Biener Revert diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f6190bd074..2d4d8e0de58 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-05-03 Richard Biener + + * gcc.dg/vect/costmodel/x86_64/costmodel-alignpeel.c: New testcase. + 2017-05-03 Jakub Jelinek PR tree-optimization/79472 diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-alignpeel.c b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-alignpeel.c new file mode 100644 index 00000000000..9e20b4a72c9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-alignpeel.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ + +void func(double * __restrict__ v1, double * v2, unsigned n) +{ + for (unsigned i = 0; i < n; ++i) + v1[i] = v2[i]; +} + +/* { dg-final { scan-tree-dump-not "Alignment of access forced using peeling" "vect" } } */ diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index aa504b6a1c6..c97426882e8 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -1715,18 +1715,18 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) dr0 = first_store; } - /* In case there are only loads with different unknown misalignments, use - peeling only if it may help to align other accesses in the loop or + /* Use peeling only if it may help to align other accesses in the loop or if it may help improving load bandwith when we'd end up using unaligned loads. */ tree dr0_vt = STMT_VINFO_VECTYPE (vinfo_for_stmt (DR_STMT (dr0))); - if (!first_store - && !STMT_VINFO_SAME_ALIGN_REFS ( - vinfo_for_stmt (DR_STMT (dr0))).length () + if (STMT_VINFO_SAME_ALIGN_REFS + (vinfo_for_stmt (DR_STMT (dr0))).length () == 0 && (vect_supportable_dr_alignment (dr0, false) != dr_unaligned_supported - || (builtin_vectorization_cost (vector_load, dr0_vt, 0) - == builtin_vectorization_cost (unaligned_load, dr0_vt, -1)))) + || (DR_IS_READ (dr0) + && (builtin_vectorization_cost (vector_load, dr0_vt, 0) + == builtin_vectorization_cost (unaligned_load, + dr0_vt, -1))))) do_peeling = false; } -- 2.30.2