https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78644
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So, before ccp4 we have: _7 = x3_1 + x2_3; _8 = {_7, _7, _7, _7}; x4.1_9 = x4; _15 = {_7, _7, _7, _7}; _16 = BIT_FIELD_REF <_15, 128, 0>; _17 = BIT_FIELD_REF <x4.1_9, 128, 0>; _18 = _16 + _17; _19 = {_7, _7, _7, _7}; _20 = BIT_FIELD_REF <_19, 128, 128>; _21 = BIT_FIELD_REF <x4.1_9, 128, 128>; _22 = _20 + _21; _23 = {_7, _7, _7, _7}; _24 = BIT_FIELD_REF <_23, 128, 256>; _25 = BIT_FIELD_REF <x4.1_9, 128, 256>; _26 = _24 + _25; _27 = {_7, _7, _7, _7}; _28 = BIT_FIELD_REF <_27, 128, 384>; _29 = BIT_FIELD_REF <x4.1_9, 128, 384>; _30 = _28 + _29; _10 = {_18, _22, _26, _30}; <retval> = _10; ccp4 sees those uses: _7 : -->20 uses. _27 = {_7, _7, _7, _7}; _27 = {_7, _7, _7, _7}; _27 = {_7, _7, _7, _7}; _27 = {_7, _7, _7, _7}; _23 = {_7, _7, _7, _7}; _23 = {_7, _7, _7, _7}; _23 = {_7, _7, _7, _7}; _23 = {_7, _7, _7, _7}; _19 = {_7, _7, _7, _7}; _19 = {_7, _7, _7, _7}; _19 = {_7, _7, _7, _7}; _19 = {_7, _7, _7, _7}; _15 = {_7, _7, _7, _7}; _15 = {_7, _7, _7, _7}; _15 = {_7, _7, _7, _7}; _15 = {_7, _7, _7, _7}; _8 = {_7, _7, _7, _7}; _8 = {_7, _7, _7, _7}; _8 = {_7, _7, _7, _7}; _8 = {_7, _7, _7, _7}; ... Visiting statement: _7 = x3_1 + x2_3; which is likely CONSTANT Match-and-simplified x3_1 + x2_3 to 0 Lattice value changed to CONSTANT 0. Adding SSA edges to worklist. and replaces all those ctors with {x2_3, x2_3, x2_3, x2_3}. But folding also happens while this is ongoing: Folding statement: _17 = BIT_FIELD_REF <x4.1_9, 128, 0>; Not folded Folding statement: _18 = _16 + _17; Folded into: _18 = _7 + _17; and thus a new _7 reference appears, and we don't fold that into _18 = x2_3 + _17, but remove the _7 setter, because we assume all uses are replaced: Removing dead stmt _7 = x3_1 + x2_3; Richi, I think this is your area of expertise.