https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65146
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org, | |uros at gcc dot gnu.org --- Comment #21 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So, are we talking about something like (no -Wpsabi here) --- gcc/config/i386/i386.c.jj 2020-08-24 10:00:01.321258451 +0200 +++ gcc/config/i386/i386.c 2020-08-26 17:54:39.089468108 +0200 @@ -16487,7 +16487,11 @@ iamcu_alignment (tree type, int align) /* Intel MCU psABI specifies scalar types > 4 bytes aligned to 4 bytes. */ - mode = TYPE_MODE (strip_array_types (type)); + type = strip_array_types (type); + if (TYPE_ATOMIC (type)) + return align; + + mode = TYPE_MODE (type); switch (GET_MODE_CLASS (mode)) { case MODE_INT: @@ -16757,7 +16761,7 @@ ix86_minimum_alignment (tree exp, machin /* Don't do dynamic stack realignment for long long objects with -mpreferred-stack-boundary=2. */ if ((mode == DImode || (type && TYPE_MODE (type) == DImode)) - && (!type || !TYPE_USER_ALIGN (type)) + && (!type || (!TYPE_USER_ALIGN (type) && !TYPE_ATOMIC (type))) && (!decl || !DECL_USER_ALIGN (decl))) { gcc_checking_assert (!TARGET_STV); @@ -20293,7 +20297,10 @@ x86_field_alignment (tree type, int comp return computed; if (TARGET_IAMCU) return iamcu_alignment (type, computed); - mode = TYPE_MODE (strip_array_types (type)); + type = strip_array_types (type); + if (TYPE_ATOMIC (type)) + return computed; + mode = TYPE_MODE (type); if (mode == DFmode || mode == DCmode || GET_MODE_CLASS (mode) == MODE_INT || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT) No idea whether we need the ix86_minimum_alignment change and about IAMCU I'll defer to H.J., but the last hunk fixes something like #c1 or struct A { char a; _Atomic long long b; }; struct B { char a; _Atomic double b; }; int a = __builtin_offsetof (struct A, b); int b = __builtin_offsetof (struct B, b); with -m32 for me.