aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEikansh Gupta <quic_eikagupt@quicinc.com>2024-11-11 17:06:04 +0530
committerAndrew Pinski <quic_apinski@quicinc.com>2024-11-14 00:37:33 -0800
commit879c1619ab5a708514cbb1f3754e59f30ba29e6c (patch)
treeee43624a03c8bb32874baf428bd04c2516947dd9 /gcc
parent6d85a0bc2e09221bdb412bc47aefbcd10c546fd5 (diff)
downloadgcc-879c1619ab5a708514cbb1f3754e59f30ba29e6c.zip
gcc-879c1619ab5a708514cbb1f3754e59f30ba29e6c.tar.gz
gcc-879c1619ab5a708514cbb1f3754e59f30ba29e6c.tar.bz2
MATCH: Simplify `a rrotate (32-b) -> a lrotate b` [PR109906]
The pattern `a rrotate (32-b)` should be optimized to `a lrotate b`. The same is also true for `a lrotate (32-b)`. It can be optimized to `a rrotate b`. This patch adds following patterns: a rrotate (32-b) -> a lrotate b a lrotate (32-b) -> a rrotate b Bootstrapped and tested on x86_64-linux-gnu with no regressions. PR tree-optimization/109906 gcc/ChangeLog: * match.pd (a rrotate (32-b) -> a lrotate b): New pattern (a lrotate (32-b) -> a rrotate b): New pattern gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/pr109906.c: New test. Signed-off-by: Eikansh Gupta <quic_eikagupt@quicinc.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd9
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr109906.c41
2 files changed, 50 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 6fa1b59..0ac5674 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 0000000..9aa015d
--- /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" } } */