https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106331

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
                 CC|                            |rguenth at gcc dot gnu.org
             Target|                            |x86_64-*-*

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed - we get

  # S.0_3 = PHI <1(2), S.0_7(4)>
  if (S.0_3 > 2)
    goto <bb 5>; [33.33%]
  else
    goto <bb 4>; [66.67%]

  _1 = S.0_3 + -1;
  _2 = &a[_1];
  __builtin_memset (_2, 32, 24);
  S.0_7 = S.0_3 + 1;
  goto <bb 3>; [100.00%]

but somehow we fail to see that while the first [24] is 16 byte aligned, the
second is not:

.L4:
        leaq    -3(%rax,%rax,2), %rcx
        leaq    0(,%rcx,8), %rdx
        leaq    -56(%rsp,%rdx), %rdx
        movdqa  .LC0(%rip), %xmm0
        movaps  %xmm0, (%rdx)
        movabsq $2314885530818453536, %rsi
        movq    %rsi, 16(%rdx)
        addq    $1, %rax
.L3:
        cmpq    $2, %rax
        jle     .L4

we shouldn't have used movaps %xmm0, (%rdx) here.  Probably middle-end but
bisection will show.

Reply via email to