[EMAIL PROTECTED] gcc]$ cat /tmp/push-1.c 
/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
/* { dg-options "-w -msse2 -Os" } */

typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));

extern void foo (__m128 x, __m128 y ,__m128 z ,__m128 a, int size);

void
bar (void)
{
  __m128 x = { 1.0 };
  foo (x, x, x, x, 5);
}

/* { dg-final { scan-assembler-not "movups" } } */
[EMAIL PROTECTED] gcc]$ ./xgcc -B./ -Os -m32 -msse2 -S /tmp/push-1.c
[EMAIL PROTECTED] gcc]$ cat push-1.s 
        .file   "push-1.c"
        .text
.globl bar
        .type   bar, @function
bar:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $20, %esp
        movss   .LC0, %xmm0
        pushl   $5
        subl    $16, %esp
        movups  %xmm0, (%esp)
        movaps  %xmm0, %xmm2
        movaps  %xmm0, %xmm1
        call    foo
        addl    $32, %esp
        leave
        ret

-mno-accumulate-outgoing-args will push argument onto stack.
Since there is no push insn for __m128, ix86_expand_push is
called to emulate push __m128. But it doesn't set proper
alignment. As the result, unaligned move insn is generated
even though memory is aligned.  Since ix86_expand_push is
used to push a value onto an aligned location on the stack,
the alignment of destination should be at least aligned to
function argument boundary, which is the minimum alignment
of push destination.


-- 
           Summary: Unaligned move used on aligned  destination of push insn
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hjl dot tools at gmail dot com
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37049

Reply via email to