https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70497
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- union U { int i[16]; char c[4]; }; char foo(int i) { union U u; u.i[0] = i; return u.c[1]; } I have a prototype that for the above generates movl %edi, %eax movsbl %ah, %eax instead of (through RTL DSE): movl %edi, %eax shrw $8, %ax The prototype ends up simply using BIT_FIELD_REFs. <bb 2>: _3 = BIT_FIELD_REF <i_2(D), 8, 8>; return _3;