https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95034
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So after phiopt2 we end up with: ``` _1 = a_3(D) | b_4(D); if (_1 != 0) goto <bb 3>; [50.00%] else goto <bb 4>; [50.00%] <bb 3> [local count: 536870912]: _5 = a_3(D) & b_4(D); _7 = ~_5; <bb 4> [local count: 1073741824]: # iftmp.0_2 = PHI <_7(3), 0(2)> ``` Phi-opt does not support more than one statement inside the middle BB so it does nothing here. But if we rewrite it such that the 2 statements were not inside the middle BB by phiopt2, we get the xor as expected. That is: ``` bool f(bool a, bool b) { bool c = a | b; bool d = a & b; d = !d; return c ? d : false; } ``` Will produce: ``` _8 = a_3(D) ^ b_4(D); return _8; ``` >From the phiopt2 dump: ``` Folded into the sequence: _8 = a_3(D) ^ b_4(D); ``` I wonder if we could support more than 1 statement in the middle BBs iff the resulting simplifications only reference one SSA_NAME of the statements max ...