https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97747
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2022-02-04 Ever confirmed|0 |1 Known to fail| |8.2.0 Summary|missed combine opt with |[9/10/11/12 Regression] |logical ops after zero |missed combine opt with |extended load |logical ops after zero | |extended load Known to work| |7.5.0 Status|UNCONFIRMED |ASSIGNED Component|rtl-optimization |tree-optimization --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Mine for GCC 13, bitfield lowering. Note the store merging pass also messes up and creates: _5 = _4 & 250; _6 = _5 | 5; Which can be optimized to just: _6 = _4 | 5; I might look at store merging first. Note I think this might be a regression in code generation (store merging caused the regressions). GCC 7.5.0 produced: ldr r2, .L3 ldrb r3, [r2] @ zero_extendqisi2 orr r3, r3, #5 strb r3, [r2] bx lr While GCC 8.2.0 produced: ldr r2, .L3 ldrb r3, [r2] @ zero_extendqisi2 bic r3, r3, #5 orr r3, r3, #5 strb r3, [r2] bx lr