On November 20, 2021 7:03:02 AM GMT+01:00, apinski--- via Gcc-patches 
<gcc-patches@gcc.gnu.org> wrote:
>From: Andrew Pinski <apin...@marvell.com>
>
>The problem here is that int_fits_type_p will return false if we just
>change the sign of things like -2 (or 254) so we should accept the case
>where we just change the sign (and not the precision) of the type.
>
>OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

OK. 

Richard. 

>       PR tree-optimization/103220
>
>gcc/ChangeLog:
>
>       * match.pd ((type) X bitop CST): Don't check if CST
>       fits into the type if only the sign changes.
>
>gcc/testsuite/ChangeLog:
>
>       * gcc.dg/tree-ssa/pr103220-1.c: New test.
>       * gcc.dg/tree-ssa/pr103220-2.c: New test.
>       * gcc.dg/pr25530.c: Update test to check for
>       4294967294 in the case -2 is not matched.
>---
> gcc/match.pd                               |  3 ++-
> gcc/testsuite/gcc.dg/pr25530.c             |  2 +-
> gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c | 15 +++++++++++++++
> gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c | 16 ++++++++++++++++
> 4 files changed, 34 insertions(+), 2 deletions(-)
> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c
> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c
>
>diff --git a/gcc/match.pd b/gcc/match.pd
>index 24a84e3b504..37c5be9e5f4 100644
>--- a/gcc/match.pd
>+++ b/gcc/match.pd
>@@ -1607,7 +1607,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>   (bitop (convert@2 @0) (convert?@3 @1))
>   (if (((TREE_CODE (@1) == INTEGER_CST
>        && INTEGRAL_TYPE_P (TREE_TYPE (@0))
>-       && int_fits_type_p (@1, TREE_TYPE (@0)))
>+       && (int_fits_type_p (@1, TREE_TYPE (@0))
>+           || tree_nop_conversion_p (TREE_TYPE (@0), type)))
>       || types_match (@0, @1))
>        /* ???  This transform conflicts with fold-const.c doing
>         Convert (T)(x & c) into (T)x & (T)c, if c is an integer
>diff --git a/gcc/testsuite/gcc.dg/pr25530.c b/gcc/testsuite/gcc.dg/pr25530.c
>index b846ab30140..771b36b9c29 100644
>--- a/gcc/testsuite/gcc.dg/pr25530.c
>+++ b/gcc/testsuite/gcc.dg/pr25530.c
>@@ -8,4 +8,4 @@ f (unsigned t)
>   return (t / 2) * 2;
> }
> 
>-/* { dg-final { scan-tree-dump "\& -2" "optimized" } } */
>+/* { dg-final { scan-tree-dump "\& -2|4294967294" "optimized" } } */
>diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c 
>b/gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c
>new file mode 100644
>index 00000000000..f2ef3f1d93c
>--- /dev/null
>+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c
>@@ -0,0 +1,15 @@
>+/* { dg-do compile } */
>+/* { dg-options "-O2 -fdump-tree-optimized" } */
>+unsigned char f(unsigned char a)
>+{
>+  signed char d = (signed char) a;
>+  signed char e = d & ~1;
>+  unsigned char t = e;
>+  t &= ~2;
>+  return t;
>+}
>+/* The above should reduce down to just & 252 rather than keping
>+   the two &s there. */
>+/* { dg-final { scan-tree-dump-times "& 252" 1 "optimized"} } */
>+/* { dg-final { scan-tree-dump-times "& -2" 0 "optimized"} } */
>+/* { dg-final { scan-tree-dump-times "& 253" 0 "optimized"} } */
>diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c 
>b/gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c
>new file mode 100644
>index 00000000000..25d7412a095
>--- /dev/null
>+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c
>@@ -0,0 +1,16 @@
>+/* { dg-do compile } */
>+/* { dg-options "-O2 -fdump-tree-optimized" } */
>+signed char f(unsigned char a)
>+{
>+  unsigned char b = a & 127;
>+  signed char c = (signed char) b;
>+  signed char d = (signed char) a;
>+  signed char e = d & -128;
>+  signed char h = c | e;
>+  return h;
>+}
>+/* The above should reduce down to just return with a cast.
>+   removing the two &s there and |'s. */
>+/* { dg-final { scan-tree-dump-times "& 127" 0 "optimized"} } */
>+/* { dg-final { scan-tree-dump-times "& -128" 0 "optimized"} } */
>+/* { dg-final { scan-tree-dump-times "\\\| " 0 "optimized"} } */

Reply via email to