Commit 557532d1 by Richard Sandiford Committed by Richard Sandiford

Reject versioning for alignment with different masks (PR 92526)

Allowing mixed vector sizes broke the assumption in the following assert,
since it's now possible for different accesses to require different
levels of alignment:

              /* FORNOW: use the same mask to test all potentially unaligned
                 references in the loop.  The vectorizer currently supports
                 a single vector size, see the reference to
                 GET_MODE_NUNITS (TYPE_MODE (vectype)) where the
                 vectorization factor is computed.  */
              gcc_assert (!LOOP_VINFO_PTR_MASK (loop_vinfo)
                          || LOOP_VINFO_PTR_MASK (loop_vinfo) == mask);

I guess we could try to over-align smaller accesses so that all
of them are consistent, or try to support multiple alignment masks,
but for now the easiest fix seems to be to turn the assert into a
bail-out check.

2019-11-21  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	PR tree-optimization/92526
	* tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Reject
	versioning for alignment if the accesses do not have a consistent
	mask, rather than asserting that the masks are consistent.

gcc/testsuite/
	PR tree-optimization/92526
	* gcc.target/aarch64/pr92526.c: New test.

From-SVN: r278592
parent 91f161b0
2019-11-21 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/92526
* tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Reject
versioning for alignment if the accesses do not have a consistent
mask, rather than asserting that the masks are consistent.
2019-11-21 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/92595
* tree-vect-stmts.c (get_group_load_store_type): Add a VECTOR_MODE_P
check.
2019-11-21 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/92526
* gcc.target/aarch64/pr92526.c: New test.
2019-11-21 Richard Sandiford <richard.sandiford@arm.com>
PR testsuite/92543
* gcc.dg/vect/vect-alias-check-1.c: XFAIL the alias check message
if there is no realignment support and no support for unaligned
......
/* { dg-options "-O3 -mstrict-align" } */
void
f (unsigned int *restrict x, unsigned int *restrict y,
unsigned char *restrict z, unsigned int n)
{
for (unsigned int i = 0; i < n % 4; ++i)
x[i] = x[i] + y[i] + z[i];
}
......@@ -2266,13 +2266,15 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
mask must be 15 = 0xf. */
mask = size - 1;
/* FORNOW: use the same mask to test all potentially unaligned
references in the loop. The vectorizer currently supports
a single vector size, see the reference to
GET_MODE_NUNITS (TYPE_MODE (vectype)) where the
vectorization factor is computed. */
gcc_assert (!LOOP_VINFO_PTR_MASK (loop_vinfo)
|| LOOP_VINFO_PTR_MASK (loop_vinfo) == mask);
/* FORNOW: use the same mask to test all potentially unaligned
references in the loop. */
if (LOOP_VINFO_PTR_MASK (loop_vinfo)
&& LOOP_VINFO_PTR_MASK (loop_vinfo) != mask)
{
do_versioning = false;
break;
}
LOOP_VINFO_PTR_MASK (loop_vinfo) = mask;
LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo).safe_push (stmt_info);
}
......
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