]> git.ipfire.org Git - thirdparty/gcc.git/commit
phiopt: Fix value_replacement for middle bb having phi nodes [PR118922]
authorAndrew Pinski <quic_apinski@quicinc.com>
Sun, 9 Mar 2025 06:43:54 +0000 (22:43 -0800)
committerAndrew Pinski <quic_apinski@quicinc.com>
Tue, 15 Apr 2025 00:32:49 +0000 (17:32 -0700)
commit0d931663498d2f95fb7ea0ae0ef8473f88eed26a
treea5ae03cd3f9308e179971c31f1e7a880d1278c16
parentf3d5cd4c40b58904d32530a8797c0ebeff0c54ac
phiopt: Fix value_replacement for middle bb having phi nodes [PR118922]

After r12-5300-gf98f373dd822b3, value_replacement would be able to look at the
following cfg structure:
```
  <bb 5> [local count: 1014686024]:
  if (h_6 != 0)
    goto <bb 7>; [94.50%]
  else
    goto <bb 6>; [5.50%]

  <bb 6> [local count: 114863530]:
  # h_6 = PHI <0(4), 1(5)>

  <bb 7> [local count: 1073741824]:
  # f_8 = PHI <0(5), h_6(6)>
  _9 = f_8 ^ 1;
  a.0_10 = a;
  _11 = _9 + a.0_10;
  if (_11 != -117)
    goto <bb 5>; [94.50%]
  else
    goto <bb 8>; [5.50%]
```

value_replacement would incorrectly think the middle bb (6) was empty and so it decides
to remove condition in bb5 and replacing it with 0 as the function thought it was `h_6 ? 0 : h_6`.
But since the there is an incoming phi node to bb6 defining h_6 that is incorrect.

The fix is to check if there is phi nodes in the middle bb and set empty_or_with_defined_p to false.
This was not needed before r12-5300-gf98f373dd822b3 because the phi would have been dead otherwise due to
other checks.

Bootstrapped and tested on x86_64-linux-gnu.

PR tree-optimization/118922

gcc/ChangeLog:

* tree-ssa-phiopt.cc (value_replacement): Set empty_or_with_defined_p
to false when there is phi nodes for the middle bb.

gcc/testsuite/ChangeLog:

* gcc.dg/torture/pr118922-1.c: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
(cherry picked from commit 7232c005afb5002cdfd0a2dbd0e8b8f2d80250ce)
gcc/testsuite/gcc.dg/torture/pr118922-1.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.cc