http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53505
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-05-28 13:25:34 UTC --- SRA creates: <unnamed-unsigned:1> a$6; ... a$6_21 = MEM[(const struct A &)D.9923_20 + 6]; D.10122_23 = (int) a$6_21; which expansion doesn't handle as extract_bit_field (both MEM_REF and TARGET_MEM_REF are expanded that way), so the zero extension is performed just as QI->SImode zero extension. I'd say that SRA shouldn't be creating such MEM_REFs and instead should keep the BIT_FIELD_REFs.