Since r17-2886, GCC does a wrong optimize with:

(a == b) & ((a|b) == 0) -> ((a|b) != 0)
(a != b) | ((a|b) != 0) -> ((a|b) == 0)

Should be:

(a == b) & ((a|b) == 0) -> ((a|b) == 0)
(a != b) | ((a|b) != 0) -> ((a|b) != 0)

Regtest missed this because gcc.dg/int-bwise-opt-2.c only test:

/* { dg-final { scan-tree-dump-times "a == b" 0 "optimized" } } */
/* { dg-final { scan-tree-dump-times "a != b" 0 "optimized" } } */

Make this test more rigorous by comparing the final code.

Bootstrapped and regtested on x86_64-pc-linux-gnu.

        PR middle-end/126742

gcc/ChangeLog:

        * match.pd: Fix wrong code.

gcc/testsuite/ChangeLog:

        * gcc.dg/int-bwise-opt-2.c: Also test for PR126742.

Signed-off-by: Kael Andrew Franco <[email protected]>
---
 gcc/match.pd                           |  2 +-
 gcc/testsuite/gcc.dg/int-bwise-opt-2.c | 15 +++++++++------
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index c2f411001a0..efaf0026711 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -7037,7 +7037,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (neeq @0 @1))
  (simplify
   (bitop:c (eqne @0 @1) (eqne (bit_ior@2 @0 @1) integer_zerop@3))
-  (neeq @2 @3))
+  (eqne @2 @3))
  (simplify
   (bitop (neeq @0 @1) (eqne (bit_ior @0 @1) integer_zerop))
   { constant_boolean_node (bitop == BIT_IOR_EXPR, type); })
diff --git a/gcc/testsuite/gcc.dg/int-bwise-opt-2.c 
b/gcc/testsuite/gcc.dg/int-bwise-opt-2.c
index cc1a48b061a..e0c065a54f3 100644
--- a/gcc/testsuite/gcc.dg/int-bwise-opt-2.c
+++ b/gcc/testsuite/gcc.dg/int-bwise-opt-2.c
@@ -1,15 +1,18 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -fdump-tree-optimized" } */
 
-int f1(int a, int b)
+_Bool
+a_ne_b_bit_ior (int a, int b)
 {
-  return (a != b) | ((a | b) != 0);
+  _Bool ret = ((a | b) != 0);
+  return (((a != b) | ret) == ret);
 }
 
-int f2(int a, int b)
+_Bool
+a_eq_b_bit_and (int a, int b)
 {
-  return (a == b) & ((a | b) == 0);
+  _Bool ret = ((a | b) == 0);
+  return (((a == b) & ret) == ret);
 }
 
- /* { dg-final { scan-tree-dump-times "a == b" 0 "optimized" } } */
- /* { dg-final { scan-tree-dump-times "a != b" 0 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" } } */
-- 
2.55.0

Reply via email to