https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54525
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution|--- |FIXED Target Milestone|--- |14.0 --- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- We do recognize f now on the trunk after r14-1654-g7ceed7e3e29c . _9 = (unsigned int) b_2(D); # RANGE [irange] unsigned int [0, 0][+INF, +INF] _10 = -_9; _4 = x_5(D) ^ y_6(D); _3 = _10 & _4; _7 = _3 ^ y_6(D); After that patch _3 is able to convert to: _3 = _4 * _9; And we recongize that _7 to be: gimple_simplified to _7 = b_2(D) ? x_5(D) : y_6(D); Because match has a pattern for `A ^ (A^B)*cmp into cmp ? B : A` (since r13-793-g8fb94fc6097c ).