Simplify mult where both arguments are 0 or 1 (PR tree-optimization/87954).
authorMartin Liska <mliska@suse.cz>
Thu, 6 Jun 2019 07:55:51 +0000 (09:55 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 6 Jun 2019 07:55:51 +0000 (07:55 +0000)
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

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

index 84c01ce3836bd5ac3b07c18cbef067f1681dda16..e6dd35a8eaae2b86c3e23528a939dd642b29e468 100644 (file)
@@ -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
index 02e0471dd4efdd17fd53baa852975a7f36cfae94..88dae4231d8f0e2f50d6676df2f8d06b14d64d6b 100644 (file)
@@ -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
index 8213e33ce25ee19551cda00d2e667deb12312407..4bc2c2906672c40bd583161375fd8f19369b9663 100644 (file)
@@ -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 (file)
index 0000000..620657c
--- /dev/null
@@ -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" } } */