]> git.ipfire.org Git - thirdparty/gcc.git/commit
tree-optimization/88540 - FP x > y ? x : y if-conversion without -ffast-math
authorRichard Biener <rguenther@suse.de>
Thu, 13 Jul 2023 06:58:58 +0000 (08:58 +0200)
committerRichard Biener <rguenther@suse.de>
Fri, 21 Jul 2023 07:35:29 +0000 (09:35 +0200)
commit9f8f37f5490076b10436993fb90d18092a960922
treeb245873ed13d368336da592755a0833451c8bf0c
parent6d449531a60b56ed0f4aeb640aa9e46e4ec35208
tree-optimization/88540 - FP x > y ? x : y if-conversion without -ffast-math

The following makes sure that FP x > y ? x : y style max/min operations
are if-converted at the GIMPLE level.  While we can neither match
it to MAX_EXPR nor .FMAX as both have different semantics with IEEE
than the ternary ?: operation we can make sure to maintain this form
as a COND_EXPR so backends have the chance to match this to instructions
their ISA offers.

The patch does this in phiopt where we recognize min/max and instead
of giving up when we have to honor NaNs we alter the generated code
to a COND_EXPR.

This resolves PR88540 and we can then SLP vectorize the min operation
for its testcase.  It also resolves part of the regressions observed
with the change matching bit-inserts of bit-field-refs to vec_perm.

Expansion from a COND_EXPR rather than from compare-and-branch
gcc.target/i386/pr54855-9.c by producing extra moves while the
corresponding min/max operations are now already synthesized by
RTL expansion, register selection isn't optimal.  This can be also
provoked without this change by altering the operand order in the source.
I have XFAILed that part of the test.

PR tree-optimization/88540
* tree-ssa-phiopt.cc (minmax_replacement): Do not give up
with NaNs but handle the simple case by if-converting to a
COND_EXPR.

* gcc.target/i386/pr88540.c: New testcase.
* gcc.target/i386/pr54855-9.c: XFAIL check for redundant moves.
* gcc.target/i386/pr54855-12.c: Adjust.
* gcc.target/i386/pr54855-13.c: Likewise.
* gcc.target/i386/pr110170.c: Likewise.
* gcc.dg/tree-ssa/split-path-12.c: Likewise.
gcc/testsuite/gcc.dg/tree-ssa/split-path-12.c
gcc/testsuite/gcc.target/i386/pr110170.c
gcc/testsuite/gcc.target/i386/pr54855-12.c
gcc/testsuite/gcc.target/i386/pr54855-13.c
gcc/testsuite/gcc.target/i386/pr54855-9.c
gcc/testsuite/gcc.target/i386/pr88540.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.cc