https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114344
Bug ID: 114344 Summary: [arm/mips] __alignof__ report a member packed struct as 1, while normal load/store instruction is used Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: syq at gcc dot gnu.org Target Milestone: --- #include <stdio.h> volatile struct s { char c[4]; int i; long long l; float f; double d; } __attribute__ ((packed)) s; int main() { s.i = 0x12345678; printf ("%zd\n", __alignof__ (s.i)); } For this code, `1` is printed as the align of s.i. While on MIPS and ARM, normal instructions are emitted. $ mipsel-linux-gnu-gcc -Wall -mabi=32 -c -O3 xx.c -mips32r2 $ objdump -d xx.o ... 34: ac620004 sw v0,4(v1) ... If `__alignof__ (s.i)` reports correctly, `swl/swr` should be used instead of `sw`. And for $ mipsel-linux-gnu-gcc -c -O3 xx.c -mips32r6 -mno-unaligned-access $ arm-linux-gnueabihf-gcc -c -O3 xx.c -mno-unaligned-access 4 store_byte instruction should be used, while in fact, `sw/str` is used here.