From c34d09274e72031d768e18d3f2365a1532357879 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 2 Jul 2017 08:37:07 +0000 Subject: [PATCH] PR81136: ICE from inconsistent DR_MISALIGNMENTs The test case triggered this assert in vect_update_misalignment_for_peel: gcc_assert (DR_MISALIGNMENT (dr) / dr_size == DR_MISALIGNMENT (dr_peel) / dr_peel_size); The problem was that: - one memory reference guaranteed a high base alignment, when considering that reference in isolation. This meant that we could calculate the vector misalignment for its DR at compile time. - the other memory reference only guaranteed a low base alignment, when considering that reference in isolation. We therefore couldn't calculate the vector misalignment for its DR at compile time. - when looking at the values of the two addresses as a pair (rather than the memory references), it was obvious that they had the same misalignment, whatever that misalignment happened to be. This is working as designed, so the patch restricts the assert to cases in which both addresses have a compile-time misalignment. In the test case this looks like a missed opportunity. Both references are unconditional, so it should be possible to use the highest of the available base alignment guarantees when analyzing each reference. A later patch does this, but the problem would still remain for conditional references. 2017-07-02 Richard Sandiford gcc/ PR tree-optimization/81136 * tree-vect-data-refs.c (vect_update_misalignment_for_peel): Only assert that two references with the same misalignment have the same compile-time misalignment if those compile-time misalignments are known. gcc/testsuite/ PR tree-optimization/81136 * gcc.dg/vect/pr81136.c: New test. From-SVN: r249878 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/vect/pr81136.c | 16 ++++++++++++++++ gcc/tree-vect-data-refs.c | 6 ++++-- 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/pr81136.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bbcff7463e6..76944d5ea01 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-07-02 Richard Sandiford + + PR tree-optimization/81136 + * tree-vect-data-refs.c (vect_update_misalignment_for_peel): Only + assert that two references with the same misalignment have the same + compile-time misalignment if those compile-time misalignments + are known. + 2017-07-01 Andi Kleen * print-tree.c (print_node): Print all attributes. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c71540aa811..46259217cc0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-07-02 Richard Sandiford + + PR tree-optimization/81136 + * gcc.dg/vect/pr81136.c: New test. + 2017-07-01 Jakub Jelinek PR sanitizer/81262 diff --git a/gcc/testsuite/gcc.dg/vect/pr81136.c b/gcc/testsuite/gcc.dg/vect/pr81136.c new file mode 100644 index 00000000000..24bd8fa3b19 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr81136.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +struct __attribute__((aligned (32))) +{ + char misaligner; + int foo[100]; + int bar[100]; +} *a; + +void +fn1 (int n) +{ + int *b = a->foo; + for (int i = 0; i < n; i++) + a->bar[i] = b[i]; +} diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 623acf695ed..1595bb4247c 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -906,8 +906,10 @@ vect_update_misalignment_for_peel (struct data_reference *dr, { if (current_dr != dr) continue; - gcc_assert (DR_MISALIGNMENT (dr) / dr_size == - DR_MISALIGNMENT (dr_peel) / dr_peel_size); + gcc_assert (!known_alignment_for_access_p (dr) + || !known_alignment_for_access_p (dr_peel) + || (DR_MISALIGNMENT (dr) / dr_size + == DR_MISALIGNMENT (dr_peel) / dr_peel_size)); SET_DR_MISALIGNMENT (dr, 0); return; } -- 2.30.2