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.
that is we should be able to optimize lenzero at -O1.
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.
mine.
This is the generic solution to what was done to fix PR 104639.
https://gcc.gnu.org/pipermail/gcc-patches/2017-November/489192.html
(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