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?