On Fri, Jan 5, 2018 at 9:47 AM, Richard Biener
<richard.guent...@gmail.com> wrote:
> On Wed, Jan 3, 2018 at 4:06 PM, Richard Sandiford
> <richard.sandif...@linaro.org> wrote:
>> r241959 included code to stop us increasing the alignment of a
>> "user-aligned" variable.  This wasn't the main purpose of the patch,
>> and I think it was just there 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.
>>
>> The DECL_USER_ALIGN code seemed to be treating as a sort of maximum
>> instead, but there's not really such a thing as a maximum here: the
>> variable might still end up at the start of a section that has a higher
>> alignment, or might end up by chance on a "very aligned" boundary at
>> link or load time.
>>
>> I think people who add alignment attributes want to ensure that
>> accesses to that variable are fast, so it seems counter-intuitive
>> for it to make the access slower.  The vect-align-4.c test is an
>> example of this: for targets with 128-bit vectors, we get better
>> code without the aligned attribute than we do with it.
>>
>> Tested on aarch64-linux-gnu so far, will test more widely if OK.
>
> Works for me - I think I did this to copy behavior of code elsewhere
> (pass_increase_alignment::increase_alignment).

Note I had the impression that using the aligned attribute with a "low"
alignment is a hint to the compiler to not increase .data by overaligning
variables.  I think there were PRs asking for that.

Richard.

> Richard.
>
>> Thanks,
>> Richard
>>
>>
>> 2018-01-03  Richard Sandiford  <richard.sandif...@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.
>>
>> Index: gcc/tree-vect-data-refs.c
>> ===================================================================
>> --- gcc/tree-vect-data-refs.c   2018-01-03 15:03:14.301330558 +0000
>> +++ gcc/tree-vect-data-refs.c   2018-01-03 15:03:14.454324422 +0000
>> @@ -920,19 +920,6 @@ vect_compute_data_ref_alignment (struct
>>           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.  */
>> Index: gcc/testsuite/gcc.dg/vect/vect-align-4.c
>> ===================================================================
>> --- /dev/null   2018-01-03 08:32:43.873058927 +0000
>> +++ gcc/testsuite/gcc.dg/vect/vect-align-4.c    2018-01-03 
>> 15:03:14.453324462 +0000
>> @@ -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" } } */
>> Index: gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-2.c
>> ===================================================================
>> --- gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-2.c       2018-01-03 
>> 15:03:14.301330558 +0000
>> +++ gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-2.c       2018-01-03 
>> 15:03:14.454324422 +0000
>> @@ -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)

Reply via email to