Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tree-optimization/88540 - FP x > y ? x : y if-conversion without -ffa…
…st-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 regresses gcc.target/i386/pr54855-13.c and 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. It regresses gcc.target/i386/pr110170.c where we end up CSEing the condition which makes RTL expansion no longer produce the min/max directly and code generation is obfuscated enough to confuse RTL if-conversion. It also regresses gcc.target/i386/ssefp-[12].c where oddly one variant isn't if-converted and ix86_expand_fp_movcc doesn't match directly (the FP constants get expanded twice). A fix could be in emit_conditional_move where both prepare_cmp_insn and emit_conditional_move_1 force the constants to (different) registers. Otherwise bootstrapped and tested on x86_64-unknown-linux-gnu. 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-12.c: Adjust. * gcc.target/i386/pr54855-13.c: Likewise.
- Loading branch information