Bug 102138 - t = a==0 and a = PHI<0, t> should be done earlier than PRE
Summary: t = a==0 and a = PHI<0, t> should be done earlier than PRE
Status: ASSIGNED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 12.0
: P3 enhancement
Target Milestone: ---
Assignee: Andrew Pinski
URL:
Keywords: missed-optimization
Depends on:
Blocks: 93447
  Show dependency treegraph
 
Reported: 2021-08-30 23:52 UTC by Andrew Pinski
Modified: 2024-09-25 02:30 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2022-10-30 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andrew Pinski 2021-08-30 23:52:38 UTC
Take:
int len(int f, int l) {
 return l < f ? 0 : l - f + 1;
}

int lenzero(int f, int l) {
 return len(f, l) == 0;
}

int g(); int h();
int lenzero1(int f, int l) {
 if ( len(f, l) == 0)
   return g();
  return h();
}

we should be able to optimize lenzero at -O1 but don't.  lenzero1 is optimized at -O1 because dom is able to jump thread.
The difference in IR is:
  # iftmp.0_9 = PHI <0(2), iftmp.0_8(3)>
  _2 = iftmp.0_9 == 0;

vs:
  # iftmp.0_13 = PHI <0(2), iftmp.0_12(3)>
  if (iftmp.0_13 == 0)

at -O2 PRE is enabled which does the optimization.
This is similar to spaceship_replacement in tree-ssa-phiopt but a more general statement of the problem.
Comment 1 Andrew Pinski 2021-08-30 23:57:49 UTC
that is we should be able to optimize lenzero at -O1.
Comment 2 Richard Biener 2021-08-31 07:34:17 UTC
Confirmed.  I attached some propagation through PHI folding for forwprop (WIP) to the spaceship PR.  There's also tree-ssa-phiprop.c which does sth like PHI-translation for loads that could be generalized.

In general it opens the same issues as PRE - possibly extra copies due to the
constants in PHIs and possibly less optimized code because readily available
constants (in registers) are explicitely represented and need to be re-materialized.
Comment 3 Andrew Pinski 2023-11-02 18:55:17 UTC
mine.
Comment 4 Andrew Pinski 2023-11-02 19:00:18 UTC
This is the generic solution to what was done to fix PR 104639.
Comment 6 Andrew Pinski 2024-09-25 02:30:47 UTC
(In reply to Andrew Pinski from comment #5)
> https://gcc.gnu.org/pipermail/gcc-patches/2017-November/489192.html

Review from Richard B.:
https://gcc.gnu.org/pipermail/gcc-patches/2018-May/498001.html