PATCH: PR target/35767: x86 backend uses aligned load on unaligned memory

H.J. Lu hjl.tools@gmail.com
Tue May 27 16:44:00 GMT 2008


On Tue, May 27, 2008 at 8:30 AM, Paolo Bonzini <bonzini@gnu.org> wrote:
>
>> +      if (TYPE_STRUCTURAL_EQUALITY_P (type))
>> +       align = TYPE_ALIGN (type);
>> +      else
>> +       align = TYPE_ALIGN (TYPE_CANONICAL (type));
>
> This seems very wrong.  TYPE_STRUCTURAL_EQUALITY_P and TYPE_CANONICAL should
> only be used for C++, and you only included C test cases.  Do you actually

TYPE_CANONICAL is used in C:

/* Make a variant type in the proper way for C/C++, propagating qualifiers
   down to the element type of an array.  */

tree
c_build_qualified_type (tree type, int type_quals)
{

They are at least used for parameter passing.

> have a testcase for this?

Yes, it is included in the patch:

[hjl@gnu-13 testsuite]$ cat gcc.target/i386/pr35767-3.c
/* { dg-do run } */
/* { dg-require-effective-target dfp } */
/* { dg-options "-O -msse2 -std=gnu99" } */

#include "sse2-check.h"

typedef _Decimal128 unaligned __attribute__((aligned(1)));

_Decimal128 __attribute__((noinline))
foo (_Decimal128 a1, _Decimal128 a2, _Decimal128 a3, _Decimal128 a4,
     _Decimal128 a5, _Decimal128 a6, _Decimal128 a7, _Decimal128 a8,
     int b1, int b2, int b3, int b4, int b5, int b6, int b7, unaligned y)
{
  return y;
}

void
sse2_test (void)
{
  unaligned x;
  _Decimal128 y = -1;
  x = y;
  y = foo (0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, -1, x);
  if (__builtin_memcmp (&y, &x, sizeof (y)))
    abort ();
}

>
>> -  /* TDmode values are passed as TImode on the stack.  TImode values
>> -     are moved via xmm registers, and moving them to stack can result in
>> -     unaligned memory access.  Use ix86_expand_vector_move_misalign()
>> -     if memory operand is not aligned correctly.  */
>> +  /* We need to check memory alignment for SSE mode since attribute
>> +     can make operands unaligned.  */
>>   if (can_create_pseudo_p ()
>> -      && (mode == TImode) && !TARGET_64BIT
>> +      && SSE_REG_MODE_P (mode)
>
> Isn't this the only necessary change?
>

No, without the ix86_function_arg_boundary change, I got

FAIL: gcc.target/i386/pr35767-3.c execution test

on both Linux/ia32 and Linux/Intel64.


H.J.



More information about the Gcc-patches mailing list