Commit c34d0927 by Richard Sandiford Committed by Richard Sandiford

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  <richard.sandiford@linaro.org>

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
parent 86ae8a3d
2017-07-02 Richard Sandiford <richard.sandiford@linaro.org>
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 <ak@linux.intel.com> 2017-07-01 Andi Kleen <ak@linux.intel.com>
* print-tree.c (print_node): Print all attributes. * print-tree.c (print_node): Print all attributes.
......
2017-07-02 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/81136
* gcc.dg/vect/pr81136.c: New test.
2017-07-01 Jakub Jelinek <jakub@redhat.com> 2017-07-01 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/81262 PR sanitizer/81262
......
/* { 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];
}
...@@ -906,8 +906,10 @@ vect_update_misalignment_for_peel (struct data_reference *dr, ...@@ -906,8 +906,10 @@ vect_update_misalignment_for_peel (struct data_reference *dr,
{ {
if (current_dr != dr) if (current_dr != dr)
continue; continue;
gcc_assert (DR_MISALIGNMENT (dr) / dr_size == gcc_assert (!known_alignment_for_access_p (dr)
DR_MISALIGNMENT (dr_peel) / dr_peel_size); || !known_alignment_for_access_p (dr_peel)
|| (DR_MISALIGNMENT (dr) / dr_size
== DR_MISALIGNMENT (dr_peel) / dr_peel_size));
SET_DR_MISALIGNMENT (dr, 0); SET_DR_MISALIGNMENT (dr, 0);
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment