aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2019-06-06 09:55:51 +0200
committerMartin Liska <marxin@gcc.gnu.org>2019-06-06 07:55:51 +0000
commitea8a6038b0b86ccc037d80a9b600e51b1558ad14 (patch)
tree0df38b73b39e84424d2945135bc584dc7b237e41
parent8ce6fb5fec60f0ce6363d2a41f30e5fc620a4beb (diff)
downloadgcc-ea8a6038b0b86ccc037d80a9b600e51b1558ad14.zip
gcc-ea8a6038b0b86ccc037d80a9b600e51b1558ad14.tar.gz
gcc-ea8a6038b0b86ccc037d80a9b600e51b1558ad14.tar.bz2
Simplify mult where both arguments are 0 or 1 (PR tree-optimization/87954).
2019-06-06 Martin Liska <mliska@suse.cz> PR tree-optimization/87954 * match.pd: Simplify mult where both arguments are 0 or 1. 2019-06-06 Martin Liska <mliska@suse.cz> PR tree-optimization/87954 * gcc.dg/pr87954.c: New test. From-SVN: r271991
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/match.pd8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr87954.c21
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 84c01ce..e6dd35a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-06 Martin Liska <mliska@suse.cz>
+
+ PR tree-optimization/87954
+ * match.pd: Simplify mult where both arguments are 0 or 1.
+
2019-06-06 Richard Biener <rguenther@suse.de>
* vr-values.c (vr_values::extract_range_from_ssa_name): Do not
diff --git a/gcc/match.pd b/gcc/match.pd
index 02e0471..88dae42 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -217,6 +217,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
|| !COMPLEX_FLOAT_TYPE_P (type)))
(negate @0)))
+/* Transform { 0 or 1 } * { 0 or 1 } into { 0 or 1 } & { 0 or 1 } */
+(simplify
+ (mult SSA_NAME@1 SSA_NAME@2)
+ (if (INTEGRAL_TYPE_P (type)
+ && get_nonzero_bits (@1) == 1
+ && get_nonzero_bits (@2) == 1)
+ (bit_and @1 @2)))
+
/* Transform x * { 0 or 1, 0 or 1, ... } into x & { 0 or -1, 0 or -1, ...},
unless the target has native support for the former but not the latter. */
(simplify
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8213e33..4bc2c29 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-06 Martin Liska <mliska@suse.cz>
+
+ PR tree-optimization/87954
+ * gcc.dg/pr87954.c: New test.
+
2019-06-06 Richard Biener <rguenther@suse.de>
* gcc.dg/tree-ssa/alias-37.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/pr87954.c b/gcc/testsuite/gcc.dg/pr87954.c
new file mode 100644
index 0000000..620657c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr87954.c
@@ -0,0 +1,21 @@
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#define __GFP_DMA 1u
+#define __GFP_RECLAIM 0x10u
+
+#define KMALLOC_DMA 2
+#define KMALLOC_RECLAIM 1
+
+unsigned int
+imul(unsigned int flags)
+{
+ int is_dma, type_dma, is_rec;
+
+ is_dma = !!(flags & __GFP_DMA);
+ type_dma = is_dma * KMALLOC_DMA;
+ is_rec = !!(flags & __GFP_RECLAIM);
+
+ return type_dma + (is_rec * !is_dma) * KMALLOC_RECLAIM;
+}
+
+/* { dg-final { scan-tree-dump-times { \* } 1 "optimized" } } */