https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94617
--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> --- For the first function (vanilla_bandpass), GCC 12+ produces now: movq %rcx, %rax cmpl %edx, %edi jg .L2 cmpl %esi, %edx cmovl %r8, %rax .L2: ret For the second the problem is: _3 = ~within_interval_11; # RANGE [irange] long unsigned int [0, 1] NONZERO 0x1 _4 = (long unsigned intD.16) _3; ... low_ptr_13 = _4 * low.0_5; # RANGE [irange] long unsigned int [0, 1] NONZERO 0x1 _6 = (long unsigned intD.16) within_interval_11; ... high_ptr_15 = _6 * high.1_7; ptr_sum_16 = low_ptr_13 + high_ptr_15; We should recongize that ptr_sum_16 is really just within_interval_11 ? high.1_7 : low.0_5; Match pattern for that: ``` (for op (plus bit_ior bit_xor) (simplify (op:c (mult:c (convert @0) @1) (mult:c (convert (bit_not @0)) @2)) (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && TYPE_PRECISION (TREE_TYPE (@0)) == 1 && TYPE_UNSIGNED (TREE_TYPE (@0))) (cond @0 @1 @2)) ```