diff options
author | Richard Biener <rguenther@suse.de> | 2021-08-31 10:28:40 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-09-01 12:54:14 +0200 |
commit | 153766ec8351d55cfe8bd6d69bdfc0c2cef71e56 (patch) | |
tree | ebb2c8b87ddc274e6732f491c48f03658a4c3780 /gcc/testsuite/gcc.dg | |
parent | ea1a16420cd2cd23917a1fd8be08ea929e55a55b (diff) | |
download | gcc-153766ec8351d55cfe8bd6d69bdfc0c2cef71e56.zip gcc-153766ec8351d55cfe8bd6d69bdfc0c2cef71e56.tar.gz gcc-153766ec8351d55cfe8bd6d69bdfc0c2cef71e56.tar.bz2 |
tree-optimization/102139 - fix SLP DR base alignment
When doing whole-function SLP we have to make sure the recorded
base alignments we compute as the maximum alignment seen for a
base anywhere in the function is actually valid at the point
we want to make use of it.
To make this work we now record the stmt the alignment was derived
from in addition to the DRs innermost behavior and we use a
dominance check to verify the recorded info is valid when doing
BB vectorization. For this to work for groups inside a BB that are
separate by a call that might not return we now store the DR
analysis group-id permanently and use that for an additional check
when the DRs are in the same BB.
2021-08-31 Richard Biener <rguenther@suse.de>
PR tree-optimization/102139
* tree-vectorizer.h (vec_base_alignments): Adjust hash-map
type to record a std::pair of the stmt-info and the innermost
loop behavior.
(dr_vec_info::group): New member.
* tree-vect-data-refs.c (vect_record_base_alignment): Adjust.
(vect_compute_data_ref_alignment): Verify the recorded
base alignment can be used.
(data_ref_pair): Remove.
(dr_group_sort_cmp): Adjust.
(vect_analyze_data_ref_accesses): Store the group-ID in the
dr_vec_info and operate on a vector of dr_vec_infos.
* gcc.dg/torture/pr102139.c: New testcase.
Diffstat (limited to 'gcc/testsuite/gcc.dg')
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr102139.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr102139.c b/gcc/testsuite/gcc.dg/torture/pr102139.c new file mode 100644 index 0000000..06c1357 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr102139.c @@ -0,0 +1,43 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-slp-vectorize" } */ + +typedef double aligned_double __attribute__((aligned(2*sizeof(double)))); + +void __attribute__((noipa)) +bar (int aligned, double *p) +{ + if (aligned) + { + *(aligned_double *)p = 3.; + p[1] = 4.; + } + else + { + p[2] = 0.; + p[3] = 1.; + } +} + +void __attribute__((noipa)) +foo (int i) +{ + if (i) + __builtin_exit (0); +} +void __attribute__((noipa)) +baz (double *p) +{ + p[0] = 0.; + p[1] = 1.; + foo (1); + *(aligned_double *)p = 3.; + p[1] = 4.; +} + +double x[8] __attribute__((aligned(2*sizeof (double)))); +int main() +{ + bar (0, &x[1]); + baz (&x[1]); + return 0; +} |