https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95034
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #6) > 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 > ... Or we could support what we do for casts for `~` and push the ~ outside of the if statement to see if that improves the phi-opt. That is get: ``` bool f(bool a, bool b) { bool t = a | b; bool t1; if (t) t1 = a & b; else t1 = 1; return !t1; } ``` Which is already known how to optimized to `t1 = a == b;`