Match: Fix ordered and nonequal

Message ID 20240904054345.1827642-1-lin1.hu@intel.com
State Committed
Commit 91421e21e8f0f05f440174b8de7a43a311700e08
Headers
Series Match: Fix ordered and nonequal |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Test passed

Commit Message

Hu, Lin1 Sept. 4, 2024, 5:43 a.m. UTC
  Hi, all

This patch is a fix patch.

Need to add :c for bit_and, because bit_and is commutative. And is (ltgt @0 @1)
is simpler than (bit_not (uneq @0 @1)).

Bootstrapped/regtested on x86-64-pc-linux-gnu, OK for trunk?

BRs,
Lin

gcc/ChangeLog:

	* match.pd: Fix match for (bit_and (ordered @0 @1) (ne @0 @1)).

gcc/testsuite/ChangeLog:

	* gcc.dg/opt-ordered-and-nonequal-1.c: New test.
	* gcc.target/i386/optimize_one.c: Change name to opt-comi-1.c.
	* gcc.target/i386/opt-comi-1.c: New test.
---
 gcc/match.pd                                  |  4 +-
 .../gcc.dg/opt-ordered-and-nonequal-1.c       | 49 +++++++++++++++++++
 gcc/testsuite/gcc.target/i386/opt-comi-1.c    | 49 +++++++++++++++++++
 gcc/testsuite/gcc.target/i386/optimize_one.c  |  9 ----
 4 files changed, 100 insertions(+), 11 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/opt-comi-1.c
 delete mode 100644 gcc/testsuite/gcc.target/i386/optimize_one.c
  

Comments

Hu, Lin1 Sept. 4, 2024, 7:14 a.m. UTC | #1
Type wrong hongtao's e-mail address.

> -----Original Message-----
> From: Hu, Lin1 <lin1.hu@intel.com>
> Sent: Wednesday, September 4, 2024 1:44 PM
> To: gcc-patches@gcc.gnu.org
> Cc: hontao.liu@intel.com; ubizjak@gmail.com; rguenther@suse.de;
> jakub@redhat.com; pinskia@gmail.com
> Subject: [PATCH] Match: Fix ordered and nonequal
> 
> Hi, all
> 
> This patch is a fix patch.
> 
> Need to add :c for bit_and, because bit_and is commutative. And is (ltgt @0 @1)
> is simpler than (bit_not (uneq @0 @1)).
> 
> Bootstrapped/regtested on x86-64-pc-linux-gnu, OK for trunk?
> 
> BRs,
> Lin
> 
> gcc/ChangeLog:
> 
> 	* match.pd: Fix match for (bit_and (ordered @0 @1) (ne @0 @1)).
> 
> gcc/testsuite/ChangeLog:
> 
> 	* gcc.dg/opt-ordered-and-nonequal-1.c: New test.
> 	* gcc.target/i386/optimize_one.c: Change name to opt-comi-1.c.
> 	* gcc.target/i386/opt-comi-1.c: New test.
> ---
>  gcc/match.pd                                  |  4 +-
>  .../gcc.dg/opt-ordered-and-nonequal-1.c       | 49 +++++++++++++++++++
>  gcc/testsuite/gcc.target/i386/opt-comi-1.c    | 49 +++++++++++++++++++
>  gcc/testsuite/gcc.target/i386/optimize_one.c  |  9 ----
>  4 files changed, 100 insertions(+), 11 deletions(-)  create mode 100644
> gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/opt-comi-1.c
>  delete mode 100644 gcc/testsuite/gcc.target/i386/optimize_one.c
> 
> diff --git a/gcc/match.pd b/gcc/match.pd index 4298e89dad6..621306213e4
> 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -6652,8 +6652,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>   (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)))
> + (bit_and:c (ordered @0 @1) (ne @0 @1)) (ltgt @0 @1))
> 
>  /* x == ~x -> false */
>  /* x != ~x -> true */
> diff --git a/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
> b/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
> new file mode 100644
> index 00000000000..6d102c2bd0c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
> @@ -0,0 +1,49 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-forwprop1-details" } */
> +
> +int is_ordered_and_nonequal_sh_1 (float a, float b) {
> +  return !__builtin_isunordered (a, b) && (a != b); }
> +
> +int is_ordered_and_nonequal_sh_2 (float a, float b) {
> +  return !__builtin_isunordered (a, b) && (b != a); }
> +
> +int is_ordered_and_nonequal_sh_3 (float a, float b) {
> +  return (b != a) && !__builtin_isunordered (a, b); }
> +
> +int is_ordered_and_nonequal_sh_4 (float a, float b) {
> +  return !__builtin_isunordered (a, b) && !(a == b); }
> +
> +int is_ordered_and_nonequal_sh_5 (float a, float b) {
> +  return !__builtin_isunordered (a, b) && !(b == a); }
> +
> +int is_ordered_and_nonequal_sh_6 (float a, float b) {
> +  return !(b == a) && !__builtin_isunordered (a, b); }
> +
> +int is_ordered_or_nonequal_sh_7 (float a, float b) {
> +  return !(__builtin_isunordered (a, b) || (a == b)); }
> +
> +int is_ordered_or_nonequal_sh_8 (float a, float b) {
> +  return !(__builtin_isunordered (a, b) || (b == a)); }
> +
> +int is_ordered_or_nonequal_sh_9 (float a, float b) {
> +  return !((a == b) || __builtin_isunordered (b, a)); }
> +
> +/* { dg-final { scan-tree-dump-times "gimple_simplified to\[^\n\r]*<>"
> +9 "forwprop1" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/opt-comi-1.c
> b/gcc/testsuite/gcc.target/i386/opt-comi-1.c
> new file mode 100644
> index 00000000000..fc7b8632004
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/opt-comi-1.c
> @@ -0,0 +1,49 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mfpmath=sse -msse2" } */
> +/* { dg-final { scan-assembler-times "comiss" 9 } } */
> +/* { dg-final { scan-assembler-times "set" 9 } } */
> +
> +int is_ordered_and_nonequal_sh_1 (float a, float b) {
> +  return !__builtin_isunordered (a, b) && (a != b); }
> +
> +int is_ordered_and_nonequal_sh_2 (float a, float b) {
> +  return !__builtin_isunordered (a, b) && (b != a); }
> +
> +int is_ordered_and_nonequal_sh_3 (float a, float b) {
> +  return (b != a) && !__builtin_isunordered (a, b); }
> +
> +int is_ordered_and_nonequal_sh_4 (float a, float b) {
> +  return !__builtin_isunordered (a, b) && !(a == b); }
> +
> +int is_ordered_and_nonequal_sh_5 (float a, float b) {
> +  return !__builtin_isunordered (a, b) && !(b == a); }
> +
> +int is_ordered_and_nonequal_sh_6 (float a, float b) {
> +  return !(b == a) && !__builtin_isunordered (a, b); }
> +
> +int is_ordered_or_nonequal_sh_7 (float a, float b) {
> +  return !(__builtin_isunordered (a, b) || (a == b)); }
> +
> +int is_ordered_or_nonequal_sh_8 (float a, float b) {
> +  return !(__builtin_isunordered (a, b) || (b == a)); }
> +
> +int is_ordered_or_nonequal_sh_9 (float a, float b) {
> +  return !((a == b) || __builtin_isunordered (b, a)); }
> diff --git a/gcc/testsuite/gcc.target/i386/optimize_one.c
> b/gcc/testsuite/gcc.target/i386/optimize_one.c
> deleted file mode 100644
> index 3a682ed4028..00000000000
> --- a/gcc/testsuite/gcc.target/i386/optimize_one.c
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -/* { dg-do compile } */
> -/* { dg-options "-O2 -mfpmath=sse -msse2" } */
> -/* { 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); -}
> --
> 2.31.1
  
Richard Biener Sept. 4, 2024, 7:40 a.m. UTC | #2
On Wed, Sep 4, 2024 at 9:15 AM Hu, Lin1 <lin1.hu@intel.com> wrote:
>
> Type wrong hongtao's e-mail address.
>
> > -----Original Message-----
> > From: Hu, Lin1 <lin1.hu@intel.com>
> > Sent: Wednesday, September 4, 2024 1:44 PM
> > To: gcc-patches@gcc.gnu.org
> > Cc: hontao.liu@intel.com; ubizjak@gmail.com; rguenther@suse.de;
> > jakub@redhat.com; pinskia@gmail.com
> > Subject: [PATCH] Match: Fix ordered and nonequal
> >
> > Hi, all
> >
> > This patch is a fix patch.
> >
> > Need to add :c for bit_and, because bit_and is commutative. And is (ltgt @0 @1)
> > is simpler than (bit_not (uneq @0 @1)).
> >
> > Bootstrapped/regtested on x86-64-pc-linux-gnu, OK for trunk?

OK

> > BRs,
> > Lin
> >
> > gcc/ChangeLog:
> >
> >       * match.pd: Fix match for (bit_and (ordered @0 @1) (ne @0 @1)).
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * gcc.dg/opt-ordered-and-nonequal-1.c: New test.
> >       * gcc.target/i386/optimize_one.c: Change name to opt-comi-1.c.
> >       * gcc.target/i386/opt-comi-1.c: New test.
> > ---
> >  gcc/match.pd                                  |  4 +-
> >  .../gcc.dg/opt-ordered-and-nonequal-1.c       | 49 +++++++++++++++++++
> >  gcc/testsuite/gcc.target/i386/opt-comi-1.c    | 49 +++++++++++++++++++
> >  gcc/testsuite/gcc.target/i386/optimize_one.c  |  9 ----
> >  4 files changed, 100 insertions(+), 11 deletions(-)  create mode 100644
> > gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
> >  create mode 100644 gcc/testsuite/gcc.target/i386/opt-comi-1.c
> >  delete mode 100644 gcc/testsuite/gcc.target/i386/optimize_one.c
> >
> > diff --git a/gcc/match.pd b/gcc/match.pd index 4298e89dad6..621306213e4
> > 100644
> > --- a/gcc/match.pd
> > +++ b/gcc/match.pd
> > @@ -6652,8 +6652,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> >   (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)))
> > + (bit_and:c (ordered @0 @1) (ne @0 @1)) (ltgt @0 @1))
> >
> >  /* x == ~x -> false */
> >  /* x != ~x -> true */
> > diff --git a/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
> > b/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
> > new file mode 100644
> > index 00000000000..6d102c2bd0c
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
> > @@ -0,0 +1,49 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O2 -fdump-tree-forwprop1-details" } */
> > +
> > +int is_ordered_and_nonequal_sh_1 (float a, float b) {
> > +  return !__builtin_isunordered (a, b) && (a != b); }
> > +
> > +int is_ordered_and_nonequal_sh_2 (float a, float b) {
> > +  return !__builtin_isunordered (a, b) && (b != a); }
> > +
> > +int is_ordered_and_nonequal_sh_3 (float a, float b) {
> > +  return (b != a) && !__builtin_isunordered (a, b); }
> > +
> > +int is_ordered_and_nonequal_sh_4 (float a, float b) {
> > +  return !__builtin_isunordered (a, b) && !(a == b); }
> > +
> > +int is_ordered_and_nonequal_sh_5 (float a, float b) {
> > +  return !__builtin_isunordered (a, b) && !(b == a); }
> > +
> > +int is_ordered_and_nonequal_sh_6 (float a, float b) {
> > +  return !(b == a) && !__builtin_isunordered (a, b); }
> > +
> > +int is_ordered_or_nonequal_sh_7 (float a, float b) {
> > +  return !(__builtin_isunordered (a, b) || (a == b)); }
> > +
> > +int is_ordered_or_nonequal_sh_8 (float a, float b) {
> > +  return !(__builtin_isunordered (a, b) || (b == a)); }
> > +
> > +int is_ordered_or_nonequal_sh_9 (float a, float b) {
> > +  return !((a == b) || __builtin_isunordered (b, a)); }
> > +
> > +/* { dg-final { scan-tree-dump-times "gimple_simplified to\[^\n\r]*<>"
> > +9 "forwprop1" } } */
> > diff --git a/gcc/testsuite/gcc.target/i386/opt-comi-1.c
> > b/gcc/testsuite/gcc.target/i386/opt-comi-1.c
> > new file mode 100644
> > index 00000000000..fc7b8632004
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/i386/opt-comi-1.c
> > @@ -0,0 +1,49 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O2 -mfpmath=sse -msse2" } */
> > +/* { dg-final { scan-assembler-times "comiss" 9 } } */
> > +/* { dg-final { scan-assembler-times "set" 9 } } */
> > +
> > +int is_ordered_and_nonequal_sh_1 (float a, float b) {
> > +  return !__builtin_isunordered (a, b) && (a != b); }
> > +
> > +int is_ordered_and_nonequal_sh_2 (float a, float b) {
> > +  return !__builtin_isunordered (a, b) && (b != a); }
> > +
> > +int is_ordered_and_nonequal_sh_3 (float a, float b) {
> > +  return (b != a) && !__builtin_isunordered (a, b); }
> > +
> > +int is_ordered_and_nonequal_sh_4 (float a, float b) {
> > +  return !__builtin_isunordered (a, b) && !(a == b); }
> > +
> > +int is_ordered_and_nonequal_sh_5 (float a, float b) {
> > +  return !__builtin_isunordered (a, b) && !(b == a); }
> > +
> > +int is_ordered_and_nonequal_sh_6 (float a, float b) {
> > +  return !(b == a) && !__builtin_isunordered (a, b); }
> > +
> > +int is_ordered_or_nonequal_sh_7 (float a, float b) {
> > +  return !(__builtin_isunordered (a, b) || (a == b)); }
> > +
> > +int is_ordered_or_nonequal_sh_8 (float a, float b) {
> > +  return !(__builtin_isunordered (a, b) || (b == a)); }
> > +
> > +int is_ordered_or_nonequal_sh_9 (float a, float b) {
> > +  return !((a == b) || __builtin_isunordered (b, a)); }
> > diff --git a/gcc/testsuite/gcc.target/i386/optimize_one.c
> > b/gcc/testsuite/gcc.target/i386/optimize_one.c
> > deleted file mode 100644
> > index 3a682ed4028..00000000000
> > --- a/gcc/testsuite/gcc.target/i386/optimize_one.c
> > +++ /dev/null
> > @@ -1,9 +0,0 @@
> > -/* { dg-do compile } */
> > -/* { dg-options "-O2 -mfpmath=sse -msse2" } */
> > -/* { 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); -}
> > --
> > 2.31.1
>
  

Patch

diff --git a/gcc/match.pd b/gcc/match.pd
index 4298e89dad6..621306213e4 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6652,8 +6652,8 @@  DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
  (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)))
+ (bit_and:c (ordered @0 @1) (ne @0 @1))
+ (ltgt @0 @1))
 
 /* x == ~x -> false */
 /* x != ~x -> true */
diff --git a/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c b/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
new file mode 100644
index 00000000000..6d102c2bd0c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/opt-ordered-and-nonequal-1.c
@@ -0,0 +1,49 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-forwprop1-details" } */
+
+int is_ordered_and_nonequal_sh_1 (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && (a != b);
+}
+
+int is_ordered_and_nonequal_sh_2 (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && (b != a);
+}
+
+int is_ordered_and_nonequal_sh_3 (float a, float b)
+{
+  return (b != a) && !__builtin_isunordered (a, b);
+}
+
+int is_ordered_and_nonequal_sh_4 (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && !(a == b);
+}
+
+int is_ordered_and_nonequal_sh_5 (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && !(b == a);
+}
+
+int is_ordered_and_nonequal_sh_6 (float a, float b)
+{
+  return !(b == a) && !__builtin_isunordered (a, b);
+}
+
+int is_ordered_or_nonequal_sh_7 (float a, float b)
+{
+  return !(__builtin_isunordered (a, b) || (a == b));
+}
+
+int is_ordered_or_nonequal_sh_8 (float a, float b)
+{
+  return !(__builtin_isunordered (a, b) || (b == a));
+}
+
+int is_ordered_or_nonequal_sh_9 (float a, float b)
+{
+  return !((a == b) || __builtin_isunordered (b, a));
+}
+
+/* { dg-final { scan-tree-dump-times "gimple_simplified to\[^\n\r]*<>" 9 "forwprop1" } } */
diff --git a/gcc/testsuite/gcc.target/i386/opt-comi-1.c b/gcc/testsuite/gcc.target/i386/opt-comi-1.c
new file mode 100644
index 00000000000..fc7b8632004
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/opt-comi-1.c
@@ -0,0 +1,49 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -mfpmath=sse -msse2" } */
+/* { dg-final { scan-assembler-times "comiss" 9 } } */
+/* { dg-final { scan-assembler-times "set" 9 } } */
+
+int is_ordered_and_nonequal_sh_1 (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && (a != b);
+}
+
+int is_ordered_and_nonequal_sh_2 (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && (b != a);
+}
+
+int is_ordered_and_nonequal_sh_3 (float a, float b)
+{
+  return (b != a) && !__builtin_isunordered (a, b);
+}
+
+int is_ordered_and_nonequal_sh_4 (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && !(a == b);
+}
+
+int is_ordered_and_nonequal_sh_5 (float a, float b)
+{
+  return !__builtin_isunordered (a, b) && !(b == a);
+}
+
+int is_ordered_and_nonequal_sh_6 (float a, float b)
+{
+  return !(b == a) && !__builtin_isunordered (a, b);
+}
+
+int is_ordered_or_nonequal_sh_7 (float a, float b)
+{
+  return !(__builtin_isunordered (a, b) || (a == b));
+}
+
+int is_ordered_or_nonequal_sh_8 (float a, float b)
+{
+  return !(__builtin_isunordered (a, b) || (b == a));
+}
+
+int is_ordered_or_nonequal_sh_9 (float a, float b)
+{
+  return !((a == b) || __builtin_isunordered (b, a));
+}
diff --git a/gcc/testsuite/gcc.target/i386/optimize_one.c b/gcc/testsuite/gcc.target/i386/optimize_one.c
deleted file mode 100644
index 3a682ed4028..00000000000
--- a/gcc/testsuite/gcc.target/i386/optimize_one.c
+++ /dev/null
@@ -1,9 +0,0 @@ 
-/* { dg-do compile } */
-/* { dg-options "-O2 -mfpmath=sse -msse2" } */
-/* { 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);
-}