https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68360
Thomas Koenig <tkoenig at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed|2015-11-16 00:00:00 |2023-7-16 CC| |tkoenig at gcc dot gnu.org --- Comment #7 from Thomas Koenig <tkoenig at gcc dot gnu.org> --- Just stumbled across this. A maybe simpler testcase: typedef struct { unsigned long x: 42; unsigned b: 1; unsigned long y: 42; } myfield; typedef struct { unsigned long x: 7; unsigned b: 1; unsigned long y: 42; } yourfield; void foo(myfield *x) { x->b = 1; } void bar (yourfield *x) { x->b = 1; } gets, on RISC-V, foo: ld a5,0(a0) li a4,1 slli a4,a4,42 or a5,a5,a4 sd a5,0(a0) ret bar: ld a5,0(a0) ori a5,a5,128 sd a5,0(a0) ret Using an indexed load byte/store byte would be an advantage for foo, at least.