With two sources: struct A { long b[8] __attribute__((aligned (32))); }; void foo (long double, struct A);
int main (void) { struct A a = { { 0, 1, 2, 3, 4, 5, 6, 7 } }; foo (8.0L, a); return 0; } and: struct A { long b[8] __attribute__((aligned (32))); }; void foo (long double x, struct A y) { int i; if (x != 8.0L) __builtin_abort (); for (i = 0; i < 8; i++) if (y.b[i] != i) __builtin_abort (); } when one of these is compiled with -mavx while the other one is not, the testcase ICEs, while when -mavx is used in both or none of the compilations, it works. This is because ix86_function_arg_boundary returns 16 for -mno-avx while 32 for -mavx in this case. Shouldn't it return > 16 only if the mode is for 256-bit vector modes or aggregate which contains some 256-bit vector somewhere in it? -- Summary: -mavx changes ABI Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org GCC target triplet: x86_64-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44948