On 4/30/24 9:21 PM, Andrew Pinski wrote:
This adds a few more of what is currently done in phiopt's value_replacement
to match. I noticed this when I was hooking up phiopt's value_replacement
code to use match and disabling the old code. But this can be done
independently from the hooking up phiopt's value_replacement as phiopt
is already hooked up for simplified versions already.

/* a != 0 ? a / b : 0  -> a / b iff b is nonzero. */
/* a != 0 ? a * b : 0 -> a * b */
/* a != 0 ? a & b : 0 -> a & b */

We prefer the `cond ? a : 0` forms to allow optimization of `a * cond` which
uses that form.

Bootstrapped and tested on x86_64-linux-gnu with no regressions.

        PR treee-optimization/114894

gcc/ChangeLog:

        * match.pd (`a != 0 ? a / b : 0`): New pattern.
        (`a != 0 ? a * b : 0`): New pattern.
        (`a != 0 ? a & b : 0`): New pattern.

gcc/testsuite/ChangeLog:

        * gcc.dg/tree-ssa/phi-opt-value-5.c: New test.
Is there any need to also handle the reversed conditional with the arms swapped? If not, this is fine as-is. If yes, then fine with the obvious generalization.

jeff

Reply via email to