Bug 19131 - alloca returning unnecessarily aligned pointer and uses too much memory
Summary: alloca returning unnecessarily aligned pointer and uses too much memory
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 4.0.0
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-12-22 14:38 UTC by Richard Biener
Modified: 2005-07-23 22:49 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Richard Biener 2004-12-22 14:38:45 UTC
The testcase

int foo(int bar)
{
        int i, res = 0;
        for (i=0; i<bar; ++i) {
                int *x = __builtin_alloca(4);
                res += *x;
        }
        return res;
}

uses a lot more memory than necessary because of __builtin_alloca
apparently returning 16-byte aligned stack space (-O2 -fomit-frame-pointer):

.L5:
        subl    $32, %esp       #,
        incl    %edx    # i
        leal    15(%esp), %eax  #, tmp64
        andl    $-16, %eax      #, tmp64
        addl    (%eax), %ecx    #, res
        cmpl    %edx, %ebx      # i, bar
        jg      .L5     #,

I cannot find anything in the C standard about alloca, but alignment
bigger than the requested storage size should be not needed (though
this may be architecture dependent).

At least playing with alignment should be moved outside of the loop,
so we could save half of the wasted memory (I know the testcase is
dumb, but it's at least simple).

Btw. the same problem applies to 3.4, 3.3 doesn't play alignment
games but still allocates 16 bytes each time (that won't be aligned
to 16 bytes this way anyway?).  2.95 beats all of them again in
simplicity:

.L6:
        addl $-16,%esp
        addl (%esp),%eax
        decl %edx
        jnz .L6
Comment 1 Andrew Pinski 2004-12-22 15:06:00 UTC
The reason you cannot find anything in the C standard is because this is ABI thing so this is invalid

We need to keep the stack aligned sorry.
Comment 2 Richard Biener 2004-12-22 18:16:19 UTC
Subject: Re:  alloca returning unnecessarily aligned pointer
 and uses too much memory

pinskia at gcc dot gnu dot org wrote:
> ------- Additional Comments From pinskia at gcc dot gnu dot org  2004-12-22 15:06 -------
> The reason you cannot find anything in the C standard is because this is ABI thing so this is invalid
> 
> We need to keep the stack aligned sorry.

Inside a function!?  Or just at function callsites?  Humm, the Intel 
compiler produces

..B1.3:                         # Preds ..B1.2 ..B1.4
         movl      $4, %eax                                      #5.12
         subl      %eax, %esp                                    #5.12
         andl      $-16, %esp                                    #5.12
         movl      %esp, %eax                                    #5.12
                                 # LOE eax ebx ebp esi edi
..B1.4:                         # Preds ..B1.3
         addl      (%eax), %ebx                                  #6.3
         addl      $1, %esi                                      #4.21
         cmpl      %edi, %esi                                    #4.2
         jl        ..B1.3

which looks like it aligns the stack after alloca, but it manages to
waste less space by subtracting $4, not $32.

Also if the ABI says the stack is aligned, why do we not make use of 
this and avoid the andl $-16, %esp -- or is the alignment only about
alloca?

I'm a bit confused.

Richard.
Comment 3 Richard Biener 2004-12-23 22:23:19 UTC
Subject: Re:  alloca returning unnecessarily aligned pointer
 and uses too much memory

pinskia at gcc dot gnu dot org wrote:
> ------- Additional Comments From pinskia at gcc dot gnu dot org  2004-12-22 15:06 -------
> The reason you cannot find anything in the C standard is because this is ABI thing so this is invalid

Where is the ABI specified?  Is it the "System V ABI, Intel386 
Architecture Processor Supplement" document I found at
http://www.caldera.com/developers/devspecs/abi386-4.pdf?
This one talks about word-alignment of the stack, not 16 byte alignment.

> We need to keep the stack aligned sorry.
Comment 4 Jan Hubicka 2004-12-23 22:27:21 UTC
Subject: Re:  alloca returning unnecessarily aligned pointer and uses too much memory

> 
> ------- Additional Comments From rguenth at tat dot physik dot uni-tuebingen dot de  2004-12-23 22:23 -------
> Subject: Re:  alloca returning unnecessarily aligned pointer
>  and uses too much memory
> 
> pinskia at gcc dot gnu dot org wrote:
> > ------- Additional Comments From pinskia at gcc dot gnu dot org  2004-12-22 15:06 -------
> > The reason you cannot find anything in the C standard is because this is ABI thing so this is invalid
> 
> Where is the ABI specified?  Is it the "System V ABI, Intel386 
> Architecture Processor Supplement" document I found at
> http://www.caldera.com/developers/devspecs/abi386-4.pdf?
> This one talks about word-alignment of the stack, not 16 byte alignment.

We keep the stack 16 byte aligned as an extension to support SSE....
Honza
> 
> > We need to keep the stack aligned sorry.
> 
> 
> -- 
> 
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19131