https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95923
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- After r14-1597-g64d90d06d2db, we now have: _8 = a_6(D) | b_7(D); _10 = a_6(D) == b_7(D); _1 = _8 & _10; (a == b) & (a | b) I am no longer working on this right now. That is a job for reassociate I think. Note I noticed that we don't remove some "dead" statements during phiopt3 too: ``` if (_8 != 0) goto <bb 3>; [66.00%] else goto <bb 4>; [34.00%] <bb 3> [local count: 708669601]: _1 = ~a_6(D); _2 = _1 & b_7(D); _10 = a_6(D) == b_7(D); <bb 4> [local count: 1073741824]: # _5 = PHI <_10(3), 0(2)> ``` I will fix that before unassigning. The problem there is: We had: _1 = ~a_6(D); _2 = _1 & b_7(D); if (_2 != 0) But we don't mark _2 as possible unused even though match will produce without it: Folded into the sequence: _3 = ~b_7(D); _4 = _3 | a_6(D); _11 = a_6(D) ^ b_7(D); _10 = a_6(D) == b_7(D); statement un-sinked: _12 = _1 | b_7(D);