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; }