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))
```

Reply via email to