https://gcc.gnu.org/g:86f5031c804220274a9bbebd26b8ebf47a2207ac

commit r15-3353-g86f5031c804220274a9bbebd26b8ebf47a2207ac
Author: Hu, Lin1 <lin1...@intel.com>
Date:   Mon Sep 2 10:24:31 2024 +0800

    i386: Optimize ordered and nonequal
    
    Currently, when we input !__builtin_isunordered (a, b) && (a != b), gcc
    will emit
      ucomiss %xmm1, %xmm0
      movl $1, %ecx
      setp %dl
      setnp %al
      cmovne %ecx, %edx
      andl %edx, %eax
      movzbl %al, %eax
    
    In fact,
      xorl %eax, %eax
      ucomiss %xmm1, %xmm0
      setne %al
    is better.
    
    gcc/ChangeLog:
    
            * match.pd: Optimize (and ordered non-equal) to
            (not (or unordered  equal))
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/i386/optimize_one.c: New test.

Diff:
---
 gcc/match.pd                                 | 3 +++
 gcc/testsuite/gcc.target/i386/optimize_one.c | 9 +++++++++
 2 files changed, 12 insertions(+)

diff --git a/gcc/match.pd b/gcc/match.pd
index be211535a49f..4298e89dad6d 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6651,6 +6651,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
  (ltgt @0 @0)
  (if (!flag_trapping_math || !tree_expr_maybe_nan_p (@0))
   { constant_boolean_node (false, type); }))
+(simplify
+ (bit_and (ordered @0 @1) (ne @0 @1))
+ (bit_not (uneq @0 @1)))
 
 /* x == ~x -> false */
 /* x != ~x -> true */
diff --git a/gcc/testsuite/gcc.target/i386/optimize_one.c 
b/gcc/testsuite/gcc.target/i386/optimize_one.c
new file mode 100644
index 000000000000..62728d3c5ba4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/optimize_one.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mfpmath=sse" } */
+/* { dg-final { scan-assembler-times "comi" 1 } } */
+/* { dg-final { scan-assembler-times "set" 1 } } */
+
+int is_ordered_or_nonequal_sh (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && (a != b);
+}

Reply via email to