From: Sudi Das <Sudi.Das@arm.com>
To: "gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Cc: Marcus Shawcroft <Marcus.Shawcroft@arm.com>,
Richard Earnshaw <Richard.Earnshaw@arm.com>,
James Greenhalgh <James.Greenhalgh@arm.com>, nd <nd@arm.com>
Subject: [PATCH][GCC] Simplification of 1U << (31 - x)
Date: Wed, 12 Apr 2017 09:30:00 -0000 [thread overview]
Message-ID: <VI1PR08MB26887B0900BF829A25462F0698000@VI1PR08MB2688.eurprd08.prod.outlook.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1006 bytes --]
Hi all
This is a fix for PR 80131
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
So for a test case :
unsigned int f1(unsigned int i)
{
return 1U << (31 - i);
}
We see a gimple dump of
f1 (unsigned int i)
{
unsigned int D.3121;
D.3121 = 2147483648 >> i;
return D.3121;
}
instead of
f1 (unsigned int i)
{
unsigned int D.3121;
_1 = 31 - i;
D.3121 = 1 << _1;
return D.3121;
}
Add a new test case and checked for regressions on bootstrapped aarch64-none-linux-gnu.
Ok for stage 1?
Thanks
Sudi
2017-03-23 Sudakshina Das <sudi.das@arm.com>
PR middle-end/80131
* match.pd: Simplify 1 << (C - x) where C = precision (type) - 1.
2017-03-23 Sudakshina Das <sudi.das@arm.com>
PR middle-end/80131
* testsuite/gcc.dg/pr80131-1.c: New Test.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch-7259-4(1).diff --]
[-- Type: text/x-patch; name="patch-7259-4(1).diff", Size: 1815 bytes --]
diff --git a/gcc/match.pd b/gcc/match.pd
index 7b96800..be20fb7 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -508,6 +508,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 INTEGER_CST@1 @2))
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_PRECISION (type) <= HOST_BITS_PER_WIDE_INT
+ && tree_to_uhwi (@1) == (unsigned)(TYPE_PRECISION (type) - 1))
+ (if (TYPE_UNSIGNED(type))
+ (rshift (lshift @0 @1) @2)
+ (with
+ { tree utype = unsigned_type_for (type); }
+ (convert:type (rshift (lshift (convert:utype @0) @1) @2))))))
+
/* Fold (C1/X)*C2 into (C1*C2)/X. */
(simplify
(mult (rdiv@3 REAL_CST@0 @1) REAL_CST@2)
diff --git a/gcc/testsuite/gcc.dg/pr80131-1.c b/gcc/testsuite/gcc.dg/pr80131-1.c
new file mode 100644
index 0000000..2bb6ff3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr80131-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { 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" } } */
next reply other threads:[~2017-04-12 9:30 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-12 9:30 Sudi Das [this message]
2017-04-12 17:06 ` Jakub Jelinek
2017-04-12 18:16 ` Segher Boessenkool
2017-04-12 18:59 ` Jakub Jelinek
2017-04-12 19:34 ` Segher Boessenkool
2017-04-13 11:16 Wilco Dijkstra
2017-04-13 11:21 ` Jakub Jelinek
2017-04-13 11:33 ` Wilco Dijkstra
2017-04-13 11:41 ` Jakub Jelinek
2017-04-13 11:49 ` Richard Biener
2017-04-13 11:55 ` Jakub Jelinek
2017-04-13 12:01 ` Wilco Dijkstra
2017-08-01 9:15 ` Sudi Das
2017-08-04 10:16 ` Richard Biener
2017-09-26 12:44 ` Sudi Das
2017-09-26 13:06 ` Jakub Jelinek
2017-09-26 13:20 ` Wilco Dijkstra
2017-10-06 17:00 ` Sudi Das
2017-10-09 12:05 ` Richard Biener
2017-10-09 13:04 ` Wilco Dijkstra
2017-10-10 11:12 ` Sudi Das
2017-11-07 12:37 ` Wilco Dijkstra
2017-11-07 14:48 ` Christophe Lyon
2017-11-07 14:49 ` Wilco Dijkstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=VI1PR08MB26887B0900BF829A25462F0698000@VI1PR08MB2688.eurprd08.prod.outlook.com \
--to=sudi.das@arm.com \
--cc=James.Greenhalgh@arm.com \
--cc=Marcus.Shawcroft@arm.com \
--cc=Richard.Earnshaw@arm.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=nd@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).