This patch introduces a match.pd simplification rule to address a missed
optimization where expressions of the form (x == 0) | ((x | y) == 0) were
not reduced down to (x == 0). Utilizing a 2-way macro iterator loop, the
pattern simultaneously handles the bitwise AND reduction variant:
(x != 0) & ((x | y) != 0) -> (x != 0).
gcc/ChangeLog:
PR tree-optimization/125442
* match.pd: Add bitop reduction simplifications against zero.
gcc/testsuite/ChangeLog:
PR tree-optimization/125442
* gcc.dg/int-bwise-opt-1.c: Update existing testcases to _Bool
and add new logic reduction patterns.
* gcc.dg/int-bwise-opt-2.c: Update return types to _Bool.
Suggested-by: Andrew Pinski <[email protected]>
Co-authored-by: Kael Franco <[email protected]>
Signed-off-by: Souradipto Das <[email protected]>
Successfully bootstrapped and regression tested on x86_64-pc-linux-gnu.
Verified targeted test suite compliance via dejagnu:
- gcc.dg/int-bwise-opt-1.c: 6 passes
- gcc.dg/int-bwise-opt-2.c: 2 passes
Totaling 8 expected passes with no regressions.
---
gcc/match.pd | 9 +++++++++
gcc/testsuite/gcc.dg/int-bwise-opt-1.c | 18 ++++++++++++++----
gcc/testsuite/gcc.dg/int-bwise-opt-2.c | 4 ++--
3 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/gcc/match.pd b/gcc/match.pd
index 8a2de136e..2bb4066d3 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6660,6 +6660,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(simplify
(bitop (neeql @0 @1) (neeqr (bit_ior @0 @1) integer_zerop))
{ constant_boolean_node (bitop == BIT_IOR_EXPR, type); }))
+
+/* (a == 0) | ((a | b) == 0) -> (a == 0) -- PR125422
+ (a != 0) & ((a | b) != 0) -> (a != 0) -- PR125422 */
+
+(for bitop (bit_and bit_ior)
+ neeq (ne eq)
+(simplify
+ (bitop:c (neeq@2 @0 integer_zerop) (neeq (bit_ior:c @0 @1) integer_zerop))
+ @2))
#endif
/* These was part of minmax phiopt. */
diff --git a/gcc/testsuite/gcc.dg/int-bwise-opt-1.c
b/gcc/testsuite/gcc.dg/int-bwise-opt-1.c
index 11ea9acb3..57a2cc4a6 100644
--- a/gcc/testsuite/gcc.dg/int-bwise-opt-1.c
+++ b/gcc/testsuite/gcc.dg/int-bwise-opt-1.c
@@ -1,26 +1,36 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
-int f1(int a, int b)
+_Bool f1(int a, int b)
{
return (a != b) & ((a | b) != 0);
}
-int f2(int a, int b)
+_Bool f2(int a, int b)
{
return (a == b) | ((a | b) == 0);
}
-int f3(int a, int b)
+_Bool f3(int a, int b)
{
return (a != b) & ((a | b) == 0);
}
-int f4(int a, int b)
+_Bool f4(int a, int b)
{
return (a == b) | ((a | b) != 0);
}
+_Bool f5(int a, int b)
+{
+ return (a != 0) & ((a | b) != 0);
+}
+
+_Bool f6(int a, int b)
+{
+ return (a == 0) | ((a | b) == 0);
+}
+
/* { dg-final { scan-tree-dump-times "\\\|" 0 "optimized" } } */
/* { dg-final { scan-tree-dump-times "\&" 0 "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/int-bwise-opt-2.c
b/gcc/testsuite/gcc.dg/int-bwise-opt-2.c
index cc1a48b06..ea7de2c0b 100644
--- a/gcc/testsuite/gcc.dg/int-bwise-opt-2.c
+++ b/gcc/testsuite/gcc.dg/int-bwise-opt-2.c
@@ -1,12 +1,12 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
-int f1(int a, int b)
+_Bool f1(int a, int b)
{
return (a != b) | ((a | b) != 0);
}
-int f2(int a, int b)
+_Bool f2(int a, int b)
{
return (a == b) & ((a | b) == 0);
}
--
2.43.0