diff options
author | Andrew Pinski <apinski@marvell.com> | 2023-07-29 21:52:31 -0700 |
---|---|---|
committer | Andrew Pinski <apinski@marvell.com> | 2023-07-31 10:12:07 -0700 |
commit | ac0e0966ebf08c454d53042a649403e2880ccbc1 (patch) | |
tree | 501cade81f7ba2186f27213341658a42af0a8498 | |
parent | 0258b73680e21fd96290af961c80966ac6b3cc68 (diff) | |
download | gcc-ac0e0966ebf08c454d53042a649403e2880ccbc1.zip gcc-ac0e0966ebf08c454d53042a649403e2880ccbc1.tar.gz gcc-ac0e0966ebf08c454d53042a649403e2880ccbc1.tar.bz2 |
MATCH: Add `a == b | a cmp b` and `a != b & a cmp b` simplifications
Even though these are done by combine_comparisons, we can add them to match
to allow simplifcations during match rather than just during reassoc/ifcombine.
OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
gcc/ChangeLog:
PR tree-optimization/106164
* match.pd (`a != b & a <= b`, `a != b & a >= b`,
`a == b | a < b`, `a == b | a > b`): Handle these cases
too.
gcc/testsuite/ChangeLog:
PR tree-optimization/106164
* gcc.dg/tree-ssa/cmpbit-2.c: New test.
-rw-r--r-- | gcc/match.pd | 32 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/cmpbit-2.c | 39 |
2 files changed, 69 insertions, 2 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index fe4c245..74f0a84 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -2830,7 +2830,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (switch (if (code1 == EQ_EXPR && val) @3) (if (code1 == EQ_EXPR && !val) { constant_boolean_node (false, type); }) - (if (code1 == NE_EXPR && !val) @4))))))) + (if (code1 == NE_EXPR && !val) @4) + (if (code1 == NE_EXPR + && code2 == GE_EXPR + && cmp == 0) + (gt @0 @1)) + (if (code1 == NE_EXPR + && code2 == LE_EXPR + && cmp == 0) + (lt @0 @1)) + ) + ) + ) + ) + ) +) /* Convert (X OP1 CST1) && (X OP2 CST2). Convert (X OP1 Y) && (X OP2 Y). */ @@ -2915,7 +2929,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (switch (if (code1 == EQ_EXPR && val) @4) (if (code1 == NE_EXPR && val) { constant_boolean_node (true, type); }) - (if (code1 == NE_EXPR && !val) @3))))))) + (if (code1 == NE_EXPR && !val) @3) + (if (code1 == EQ_EXPR + && code2 == GT_EXPR + && cmp == 0) + (ge @0 @1)) + (if (code1 == EQ_EXPR + && code2 == LT_EXPR + && cmp == 0) + (le @0 @1)) + ) + ) + ) + ) + ) +) /* Convert (X OP1 CST1) || (X OP2 CST2). Convert (X OP1 Y) || (X OP2 Y). */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cmpbit-2.c b/gcc/testsuite/gcc.dg/tree-ssa/cmpbit-2.c new file mode 100644 index 0000000..c4226ef --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/cmpbit-2.c @@ -0,0 +1,39 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fno-tree-reassoc -fdump-tree-optimized-raw" } */ + +_Bool f(int a, int b) +{ + _Bool c = a == b; + _Bool d = a > b; + return c | d; +} + +_Bool f1(int a, int b) +{ + _Bool c = a != b; + _Bool d = a >= b; + return c & d; +} + +_Bool g(int a, int b) +{ + _Bool c = a == b; + _Bool d = a < b; + return c | d; +} + +_Bool g1(int a, int b) +{ + _Bool c = a != b; + _Bool d = a <= b; + return c & d; +} + + +/* We should be able to optimize these without reassociation too. */ +/* { dg-final { scan-tree-dump-not "bit_and_expr," "optimized" } } */ +/* { dg-final { scan-tree-dump-not "bit_ior_expr," "optimized" } } */ +/* { dg-final { scan-tree-dump-times "gt_expr," 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "ge_expr," 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "lt_expr," 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "le_expr," 1 "optimized" } } */ |