diff --git a/gcc/match.pd b/gcc/match.pd index 6fa1b59fc9713dc73f11ce458f89e9ad5c7828f8..0ac5674f24beae9ce0e8af4c552c02e1bc2040a3 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -5020,6 +5020,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) build_int_cst (TREE_TYPE (@1), element_precision (type)), @1); })) +/* a rrotate (32-b) -> a lrotate b */ +/* a lrotate (32-b) -> a rrotate b */ +(for rotate (lrotate rrotate) + orotate (rrotate lrotate) + (simplify + (rotate @0 (minus INTEGER_CST@1 @2)) + (if (element_precision (TREE_TYPE (@0)) == wi::to_wide (@1)) + (orotate @0 @2)))) + /* Turn (a OP c1) OP c2 into a OP (c1+c2). */ (for op (lrotate rrotate rshift lshift) (simplify diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr109906.c b/gcc/testsuite/gcc.dg/tree-ssa/pr109906.c new file mode 100644 index 0000000000000000000000000000000000000000..9aa015d8c65c56d0e2572bbd44d082ead2fb64e7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr109906.c @@ -0,0 +1,41 @@ +/* PR tree-optimization/109906 */ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized-raw" } */ +/* { dg-require-effective-target int32 } */ + +/* Implementation of rotate right operation */ +static inline +unsigned rrotate(unsigned x, int t) +{ + if (t >= 32) __builtin_unreachable(); + unsigned tl = x >> (t); + unsigned th = x << (32 - t); + return tl | th; +} + +/* Here rotate left is achieved by doing rotate right by (32 - x) */ +unsigned rotateleft(unsigned t, int x) +{ + return rrotate (t, 32 - x); +} + +/* Implementation of rotate left operation */ +static inline +unsigned lrotate(unsigned x, int t) +{ + if (t >= 32) __builtin_unreachable(); + unsigned tl = x << (t); + unsigned th = x >> (32 - t); + return tl | th; +} + +/* Here rotate right is achieved by doing rotate left by (32 - x) */ +unsigned rotateright(unsigned t, int x) +{ + return lrotate (t, 32 - x); +} + +/* Shouldn't have instruction for (32 - x). */ +/* { dg-final { scan-tree-dump-not "minus_expr" "optimized" } } */ +/* { dg-final { scan-tree-dump "rrotate_expr" "optimized" } } */ +/* { dg-final { scan-tree-dump "lrotate_expr" "optimized" } } */