]> git.ipfire.org Git - thirdparty/gcc.git/commit
ifconv: simple factor out operators while doing ifcvt [PR119920]
authorAndrew Pinski <quic_apinski@quicinc.com>
Tue, 8 Jul 2025 03:01:04 +0000 (20:01 -0700)
committerAndrew Pinski <quic_apinski@quicinc.com>
Wed, 16 Jul 2025 15:03:10 +0000 (08:03 -0700)
commit4d6c3f3b4fbf8c2774848fcb36705ea5f0d514d4
tree1eccd6a8a333c7859f038df2ff23f4bf366c8cc7
parentfbc849d9c3872a05a308724f4009c18685b5af9c
ifconv: simple factor out operators while doing ifcvt [PR119920]

For possible reductions, ifconv currently handles if the addition
is on one side of the if. But in the case of PR 119920, the reduction
addition is on both sides of the if.
E.g.
```
  if (_27 == 0)
    goto <bb 14>; [50.00%]
  else
    goto <bb 13>; [50.00%]

  <bb 14>
  a_29 = b_14(D) + a_17;
  goto <bb 15>; [100.00%]

  <bb 13>
  a_28 = c_12(D) + a_17;

  <bb 15>
  # a_30 = PHI <a_28(13), a_29(14)>
```

Which ifcvt converts into:
```
  _34 = _32 + _33;
  a_15 = (int) _34;
  _23 = _4 == 0;
  _37 = _33 + _35;
  a_13 = (int) _37;
  a_5 = _23 ? a_15 : a_13;
```

But the vectorizer does not recognize this as a reduction.
To fix this, we should factor out the addition from the `if`.
This allows us to get:
```
  iftmp.0_7 = _22 ? b_13(D) : c_12(D);
  a_14 = iftmp.0_7 + a_18;
```

Which then the vectorizer recognizes as a reduction.

In the case of PR 112324 and PR 110015, it is similar but with MAX_EXPR reduction
instead of an addition.

Note while this should be done in phiopt, there are regressions
due to other passes not able to handle the factored out cases
(see linked bug to PR 64700). I have not had time to fix all of the passes
that could handle the addition being in the if/then/else rather than being outside yet.
So this is I thought it would be useful just to have a localized version in ifconv which
is then only used for the vectorizer.

Bootstrapped and tested on x86_64-linux-gnu.

PR tree-optimization/119920
PR tree-optimization/112324
PR tree-optimization/110015

gcc/ChangeLog:

* tree-if-conv.cc (find_different_opnum): New function.
(factor_out_operators): New function.
(predicate_scalar_phi): Call factor_out_operators when
there is only 2 elements of a phi.

gcc/testsuite/ChangeLog:

* gcc.dg/vect/vect-reduc-cond-1.c: New test.
* gcc.dg/vect/vect-reduc-cond-2.c: New test.
* gcc.dg/vect/vect-reduc-cond-3.c: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
gcc/testsuite/gcc.dg/vect/vect-reduc-cond-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-reduc-cond-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-reduc-cond-3.c [new file with mode: 0644]
gcc/tree-if-conv.cc