https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114197
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> --- The issue is really unexpected if-conversion which ends up putting the vector copy of an innner loop outside of the enclosing loop of a scalar loop. Such mishap usually happens because of simplifications. In this case we see bitfield lowering touching a volatile access which it shouldn't do, even removing the volatile marking and then value-numbering concluding the lowered d.b is 5: Value numbering stmt = _ifc__21 = d.D.2770; RHS d.D.2770 simplified to 5 Setting value number of _ifc__21 to 5 (changed) Replaced d.D.2770 with 5 in all uses of _ifc__21 = d.D.2770; Value numbering stmt = _ifc__22 = BIT_FIELD_REF <_ifc__21, 8, 0>; Match-and-simplified BIT_FIELD_REF <_ifc__21, 8, 0> to 5 RHS BIT_FIELD_REF <_ifc__21, 8, 0> simplified to 5 Setting value number of _ifc__22 to 5 (changed) Replaced BIT_FIELD_REF <_ifc__21, 8, 0> with 5 in all uses of _ifc__22 = BIT_FIELD_REF <_ifc__21, 8, 0>; Value numbering stmt = _1 = _ifc__22; Setting value number of _1 to 5 (changed) Value numbering stmt = if (_1 == 0) marking known outgoing edge 4 -> 5 executable gimple_simplified to if (0 != 0)