diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-03-24 10:52:34 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-03-24 10:52:34 +0000 |
commit | a199d5e74bf37ee4306c70a03c6c58f9935d54c3 (patch) | |
tree | 18226202d3160ebeb2ae161ed993f2ad1dc5e749 /gcc/tree-data-ref.h | |
parent | 19efbf0f53762e41be3b5fbdbc46e5b4e2c0c958 (diff) | |
download | gcc-a199d5e74bf37ee4306c70a03c6c58f9935d54c3.zip gcc-a199d5e74bf37ee4306c70a03c6c58f9935d54c3.tar.gz gcc-a199d5e74bf37ee4306c70a03c6c58f9935d54c3.tar.bz2 |
Use SCEV information when aligning for vectorisation (PR 84005)
This PR is another regression caused by the removal of the simple_iv
check in dr_analyze_innermost for BB analysis. Without splitting out
the step, we weren't able to find an underlying object whose alignment
could be increased.
As with PR81635, I think the simple_iv was only handling one special
case of something that ought to be more general. The more general
thing here is that if the address can be analysed as a scalar
evolution, and if all updates preserve alignment N, it's possible
to align the address to N by increasing the alignment of the base
object to N. That applies also to outer loops, and to both loop
and BB analysis.
I wasn't sure where the new functions ought to live, but tree-data-ref.c
seemed OK since (a) that already does scev analysis on addresses and
(b) you'd want to use dr_analyze_innermost first if you were analysing
a reference.
2018-03-24 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
PR tree-optimization/84005
* tree-data-ref.h (get_base_for_alignment): Declare.
* tree-data-ref.c (get_base_for_alignment_1): New function.
(get_base_for_alignment): Likewise.
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Use
get_base_for_alignment to find a suitable base object, instead
of always using drb->base_address.
gcc/testsuite/
PR tree-optimization/84005
* gcc.dg/vect/bb-slp-1.c: Make sure there is no message about
failing to force the alignment.
From-SVN: r258833
Diffstat (limited to 'gcc/tree-data-ref.h')
-rw-r--r-- | gcc/tree-data-ref.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/gcc/tree-data-ref.h b/gcc/tree-data-ref.h index 63094a7..8739853 100644 --- a/gcc/tree-data-ref.h +++ b/gcc/tree-data-ref.h @@ -463,6 +463,7 @@ extern bool compute_all_dependences (vec<data_reference_p> , extern tree find_data_references_in_bb (struct loop *, basic_block, vec<data_reference_p> *); extern unsigned int dr_alignment (innermost_loop_behavior *); +extern tree get_base_for_alignment (tree, unsigned int *); /* Return the alignment in bytes that DR is guaranteed to have at all times. */ |