Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.


#1330 gcc 4.4 generates unaligned stack offsets with sse2 code

gcc (462)
Peter Hurley

gcc 4.4 is generating stack frame offsets to compiler-generated locals that are not 16-byte aligned for sse2 instructions, causing #GP(0) faults.

This bug is different than artifact id# 1008330 (movaps problem with mingw). That bug was due to the fact that the base pointer itself was not aligned at function entry, rather than frame offsets being unaligned.

In the attached submission file, compiled with:
g++ -O3 -msse3 -g3 -Wall -c -save-temps -osubmission.o submission.cpp
the following assembly code is emitted:
# 60 "..\submission.cpp" 1
movddup 16(%eax),%xmm0
# 0 "" 2
.loc 1 103 0
addpd %xmm0, %xmm0
movapd %xmm0, -88(%ebp)

The frame offset of the destination operand in the movapd instruction, -88, is not 16-byte aligned and causes a GP fault.

The same file compiled with:
g++ -O0 -msse3 -g3 -Wall -c -save-temps -osubmission.o submission.cpp
generates a different sequence for the same source (obviously) that does not exhibit the same error as above. However, later in the same output the following sequence is emitted:
.loc 1 127 0
movsd -40(%ebp), %xmm0
movhpd -32(%ebp), %xmm0
cmpltpd -216(%ebp), %xmm0
movlpd %xmm0, -40(%ebp)
movhpd %xmm0, -32(%ebp)

The frame offset value of the source operand in the cmpltpd instruction, -216, is not 16-byte aligned, and generates a GP fault.


  • Peter Hurley
    Peter Hurley

    Submission source file exhibiting described behavior

  • Peter Hurley
    Peter Hurley

    Forgot to include environment
    -- Enviroment --
    intel harpertown
    windows xp pro sp3
    gcc v.4.4.0 (mingw32 target)
    binutils v.2.19.1

  • Peter Hurley
    Peter Hurley

    I closed this submission because this problem is related to artifact id# 1008330.

    I did not realize that the implicit ABI change was that ebp *must* be offset by 8 from 16-byte boundaries, ie. that -8(%ebp) *does* refer to a 16-byte aligned address.

  • Peter Hurley
    Peter Hurley

    • status: open --> closed-invalid