diff options
-rw-r--r-- | gcc/match.pd | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr25530.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c | 16 |
4 files changed, 34 insertions, 2 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index e5985de..f059b47 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 b846ab3..771b36b9 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 0000000..f2ef3f1 --- /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 0000000..25d7412 --- /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"} } */ |