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

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |NEW
           Assignee|marxin at gcc dot gnu.org          |unassigned at gcc dot 
gnu.org

--- Comment #7 from Martin Liška <marxin at gcc dot gnu.org> ---
(In reply to Martin Sebor from comment #5)
> The feature already exists at -Os by default (i.e., all functions are by
> default minimally aligned).  The suggestion here is only to let GCC minimize
> the amount of padding it adds to functions in order to align the explicitly
> overaligned ones that follow by changing the order it emits them in.
> 
> Outside -Os, functions would continue to be optimally aligned unless
> overridden by the attribute.  When their alignment is explicitly reduced by
> the attribute GCC could still be smart about ordering them so as to minimize
> wasted space.  Consider:
> 
>   __attribute__ ((aligned (4))) int f4 (int i) { return 2 * i; }
>   double f (double x) { return x * x * x; }
>   __attribute__ ((aligned (4))) int g4 (int i) { return i; }
> 
> for which GCC for x86_64 emits:
> 
>   0000000000000000 <f4>:        ;; unnecessarily overaligned
>      0:       8d 04 3f                lea    (%rdi,%rdi,1),%eax
>      3:       c3                      retq   
>      4:       66 90                   xchg   %ax,%ax
>      6:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
>      d:       00 00 00 
> 
>   0000000000000010 <f>:         ;; optimally aligned
>     10:       66 0f 28 c8             movapd %xmm0,%xmm1
>     14:       f2 0f 59 c8             mulsd  %xmm0,%xmm1
>     18:       f2 0f 59 c1             mulsd  %xmm1,%xmm0
>     1c:       c3                      retq   
>     1d:       0f 1f 00                nopl   (%rax)
> 
>   0000000000000020 <g4>:        ;; also unnecessarily overaligned
>     20:       89 f8                   mov    %edi,%eax
>     22:       c3                      retq   
> 
> If it laid down f first instead it would be able to avoid padding f4:
> 
> 0000000000000000 <f>:
>    0: 66 0f 28 c8             movapd %xmm0,%xmm1
>    4: f2 0f 59 c8             mulsd  %xmm0,%xmm1
>    8: f2 0f 59 c1             mulsd  %xmm1,%xmm0
>    c: c3                      retq   
>    d: 0f 1f 00                nopl   (%rax)
> 
> 0000000000000010 <f4>:          ;; unavoidably overaligned
>   10: 8d 04 3f                lea    (%rdi,%rdi,1),%eax
>   13: c3                      retq   
> 
> 0000000000000014 <g4>:          ;; aligned exactly as requested
>   14: 89 f8                   mov    %edi,%eax
>   16: c3                      retq   
> 

Can we do such an optimization without GAS information about size of every
function?

Reply via email to