[PATCH 2/2] middle-end: Wrong code for a != b | (a|b) != 0. [PR126742]
Kael Andrew Alonzo Franco <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
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