Revert DECL_USER_ALIGN part of r241959

r241959 included code to stop the vectoriser increasing the alignment of
a "user-aligned" variable.  This wasn't the main purpose of the patch,
but was done for consistency with pass_increase_alignment, and was
needed to make the testcase work.

The documentation for the aligned attribute says:

  This attribute specifies a minimum alignment for the variable or
  structure field, measured in bytes.

so I think it's reasonable for the vectoriser to increase the
alignment further, if that helps us to vectorise code.  It's also
useful if the "user" alignment actually came from an earlier pass
rather than the source code.

A possible counterexample came up when this was discussed on the lists.
Users who are trying to collate things from several translation units
into a single section can use:

  __attribute__((section ("whatever"), aligned(N)))

and would not want extra padding.  It turns out that the supported way
of doing that is to add a "used" attribute, which works even when no
"aligned" attribute is given.

2018-01-05  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
	* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Don't
	punt for user-aligned variables.

gcc/testsuite/
	* gcc.dg/vect/vect-align-4.c: New test.
	* gcc.dg/vect/vect-nb-iter-ub-2.c (cc): Remove alignment attribute
	and redefine as a structure with an unaligned member "b".
	(foo): Update accordingly.

From-SVN: r256277
This commit is contained in:
Richard Sandiford 2018-01-05 13:49:46 +00:00 committed by Richard Sandiford
parent 8db2698d1c
commit ccf2064917
5 changed files with 31 additions and 16 deletions

View File

@ -1,3 +1,8 @@
2018-01-05 Richard Sandiford <richard.sandiford@linaro.org>
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Don't
punt for user-aligned variables.
2018-01-05 Richard Sandiford <richard.sandiford@linaro.org>
* tree-chrec.c (chrec_contains_symbols): Return true for

View File

@ -1,3 +1,10 @@
2018-01-05 Richard Sandiford <richard.sandiford@linaro.org>
* gcc.dg/vect/vect-align-4.c: New test.
* gcc.dg/vect/vect-nb-iter-ub-2.c (cc): Remove alignment attribute
and redefine as a structure with an unaligned member "b".
(foo): Update accordingly.
2018-01-05 Sudakshina Das <sudi.das@arm.com>
PR target/82439

View File

@ -0,0 +1,15 @@
/* { dg-do compile } */
/* { dg-require-effective-target vect_int } */
/* { dg-add-options bind_pic_locally } */
__attribute__((aligned (8))) int a[2048] = {};
void
f1 (void)
{
for (int i = 0; i < 2048; i++)
a[i]++;
}
/* { dg-final { scan-tree-dump-not "Vectorizing an unaligned access" "vect" } } */
/* { dg-final { scan-tree-dump-not "Alignment of access forced using peeling" "vect" } } */

View File

@ -3,18 +3,19 @@
#include "tree-vect.h"
int ii[32];
char cc[66] __attribute__((aligned(1))) =
struct { char a; char b[66]; } cc = { 0,
{ 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0,
10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, 0,
20, 0, 21, 0, 22, 0, 23, 0, 24, 0, 25, 0, 26, 0, 27, 0, 28, 0, 29, 0,
30, 0, 31, 0 };
30, 0, 31, 0 }
};
void __attribute__((noinline,noclone))
foo (int s)
{
int i;
for (i = 0; i < s; i++)
ii[i] = (int) cc[i*2];
ii[i] = (int) cc.b[i*2];
}
int main (int argc, const char **argv)

View File

@ -920,19 +920,6 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
return true;
}
if (DECL_USER_ALIGN (base))
{
if (dump_enabled_p ())
{
dump_printf_loc (MSG_NOTE, vect_location,
"not forcing alignment of user-aligned "
"variable: ");
dump_generic_expr (MSG_NOTE, TDF_SLIM, base);
dump_printf (MSG_NOTE, "\n");
}
return true;
}
/* Force the alignment of the decl.
NOTE: This is the only change to the code we make during
the analysis phase, before deciding to vectorize the loop. */