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