https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89545
Bug ID: 89545
Summary: ABI clarification for over-aligned type stack passing
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: rguenth at gcc dot gnu.org
Target Milestone: ---
For the following, if you compile with -O3 -mavx2
-fno-tree-loop-distribute-patterns -fno-ipa-cp you see vectorization assuming
32byte alignment of the stack slot for 'y' in foo. That seems to be OK
given that main uses appropriately aligned stack-slots for the arguments
but I don't see this documented in the x86 ABI anywhere.
struct X { char x[32]; } __attribute__((aligned(32)));
struct X x;
struct Y { int i; float f; };
void __attribute__((noinline)) baz (struct X *p) { *(volatile char *)p->x; }
void __attribute__((noinline))
foo (int i1, int i2, int i3, int i4, int i5, int i6, struct X pad1, struct Y
pad, struct X y)
{
for (unsigned i = 0; i < 32; ++i)
y.x[i] = 1;
baz (&y);
}
int main()
{
struct Y y;
foo (0,1,2,3,4,5, x, y, x);
}