PR80131: Simplification of 1U << (31 - x)
authorSudakshina Das <sudi.das@arm.com>
Tue, 7 Nov 2017 12:23:38 +0000 (12:23 +0000)
committerWilco Dijkstra <wilco@gcc.gnu.org>
Tue, 7 Nov 2017 12:23:38 +0000 (12:23 +0000)
Currently the code A << (B - C) is not simplified.
However at least a more specific case of 1U << (C -x) where
C = precision(type) - 1 can be simplified to (1 << C) >> x.

This is done by adding a new simplification rule in match.pd.

2017-11-07  Sudakshina Das  <sudi.das@arm.com>

    gcc/
PR middle-end/80131
* match.pd: Simplify 1 << (C - x) where C = precision (x) - 1.

    testsuite/
PR middle-end/80131
* testsuite/gcc.dg/pr80131-1.c: New Test.

From-SVN: r254496

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr80131-1.c [new file with mode: 0644]

index bbb51e3fc00c705a34e421c086bda49f7bffa910..ad93a20244a95d7c6083823924ea2e1b47b51d92 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-07  Sudakshina Das  <sudi.das@arm.com>
+
+       PR middle-end/80131
+       * match.pd: Simplify 1 << (C - x) where C = precision (x) - 1.
+
 2017-11-07  Marc Glisse  <marc.glisse@inria.fr>
 
        * match.pd ((a&~b)|(a^b),(a&~b)^~a,(a|b)&~(a^b),a|~(a^b),
index 40ac5dae8c031d6d833a536e77a49118a78dbbf8..49134bcb04f48f7c76c69ac8c323785505cb4f59 100644 (file)
@@ -605,6 +605,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && tree_nop_conversion_p (type, TREE_TYPE (@1)))
    (lshift @0 @2)))
 
+/* Fold (1 << (C - x)) where C = precision(type) - 1
+   into ((1 << C) >> x). */
+(simplify
+ (lshift integer_onep@0 (minus@1 INTEGER_CST@2 @3))
+  (if (INTEGRAL_TYPE_P (type)
+       && wi::eq_p (@2, TYPE_PRECISION (type) - 1)
+       && single_use (@1))
+   (if (TYPE_UNSIGNED (type))
+     (rshift (lshift @0 @2) @3)
+   (with
+    { tree utype = unsigned_type_for (type); }
+    (convert (rshift (lshift (convert:utype @0) @2) @3))))))
+
 /* Fold (C1/X)*C2 into (C1*C2)/X.  */
 (simplify
  (mult (rdiv@3 REAL_CST@0 @1) REAL_CST@2)
index bb0eb9bfa6427e3c5eee59b0eee757806c7ed284..2032379bcd73981af21f8608d44db11bcc976575 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-07  Sudakshina Das  <sudi.das@arm.com>
+
+       PR middle-end/80131
+       * testsuite/gcc.dg/pr80131-1.c: New Test.
+
 2017-11-07  Marc Glisse  <marc.glisse@inria.fr>
 
        * gcc.dg/tree-ssa/bitops-1.c: New file.
diff --git a/gcc/testsuite/gcc.dg/pr80131-1.c b/gcc/testsuite/gcc.dg/pr80131-1.c
new file mode 100644 (file)
index 0000000..0bfe1f4
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int32plus } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+/* Checks the simplification of:
+   1 << (C - x) to (1 << C) >> x, where C = precision (type) - 1
+   f1 is not simplified but f2, f3 and f4 are. */
+
+__INT64_TYPE__ f1 (__INT64_TYPE__ i)
+{
+  return (__INT64_TYPE__)1 << (31 - i);
+}
+
+__INT64_TYPE__ f2 (__INT64_TYPE__ i)
+{
+  return (__INT64_TYPE__)1 << (63 - i);
+}
+
+__UINT64_TYPE__ f3 (__INT64_TYPE__ i)
+{
+  return (__UINT64_TYPE__)1 << (63 - i);
+}
+
+__INT32_TYPE__ f4 (__INT32_TYPE__ i)
+{
+  return (__INT32_TYPE__)1 << (31 - i);
+}
+
+/* { dg-final { scan-tree-dump-times "= 31 -"  1 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "9223372036854775808 >>" 2 "gimple" } } */
+/* { dg-final { scan-tree-dump "2147483648 >>" "gimple" } } */