https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102105
Bug ID: 102105 Summary: x86_64: ABI break with vector in union and -mno-mmx -mavx Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: mpolacek at gcc dot gnu.org Target Milestone: --- This looks like another ABI break. Started with r271213. -mno-mmx -mavx is an unusual combination I guess, but I'm filing this anyway. $ cat m.c void vector_1_x(); int main() { vector_1_x(); } $ cat x.c typedef int di; typedef di __attribute__((vector_size(8))) v1di; typedef union { v1di v; di a[1]; } u1di; v1di g_v1di; int pass_v1di_j; di pass_v1di_a[1]; di pass_v1di_a_0; u1di pass_v1di_u; void test_v8qi(); void pass_v8qi() {} void test_v1di(); void checkp_1di(); void pass_v1di(v1di v) { pass_v1di_u.v = v; pass_v1di_a_0 = pass_v1di_u.a[pass_v1di_j]; checkp_1di(pass_v1di_a); } void vector_1_x() { test_v8qi(); test_v1di(); } $ cat y.c typedef int qi; typedef int __attribute__((mode(DI))) di; int test_v8qi_i, checkp_1di_i; extern __attribute__((__vector_size__(sizeof(di)))) di g_v1di; void abort(); typedef union { __attribute__((__vector_size__(2 * sizeof(qi)))) qi v; qi a[8]; } u8qi; void pass_v8qi(); void checkp_8qi(qi *p) { for (; 0;) if (p) abort(); } void test_v8qi() { u8qi u; qi *p = u.a; for (; test_v8qi_i;) u.a[test_v8qi_i] = test_v8qi_i; pass_v8qi(u.v); checkp_8qi(p); } void pass_v1di(); void checkp_1di(di *p) { if (p[checkp_1di_i]) abort(); } void test_v1di() { pass_v1di(g_v1di); } And then: $ xgcc-11 -c m.c $ xgcc-11 -c x.c -mno-mmx -mavx $ xgcc-9 -c y.c -mno-mmx -mavx $ xgcc-11 m.o x.o y.o -o foo $ ./foo Aborted (core dumped) $ xgcc-10 -c y.c -mno-mmx -mavx $ xgcc-11 m.o x.o y.o -o foo $ ./foo && echo ok ok