Hi,
>> handle exact_div differently, like fold-const.c does.
>> Then expressing ~1 with the result expression is really excessive - you
>> should simply build this with @1 - 1 if @1 is a power of two.
Thanks for the review and comments.
Please find attached the modified patch as per your comments.
Please review the same and let me know if any further modifications are
required.
Regression Tested on X86_64.
Thanks,
Naveen
gcc/testsuite/ChangeLog:
2015-07-21 Naveen H.S <naveen.hurugalaw...@caviumnetworks.com>
PR middle-end/25530
* gcc.dg/pr25530.c: New test.
gcc/ChangeLog:
2015-07-21 Naveen H.S <naveen.hurugalaw...@caviumnetworks.com>
PR middle-end/25530
* match.pd (mult (exact_div @0 INTEGET_CST@1) @1) : New simplifier.
(mult (trunc_div @0 integer_pow2p@1) @1) : New simplifier.
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -280,6 +280,15 @@ along with GCC; see the file COPYING3. If not see
&& integer_pow2p (@2) && tree_int_cst_sgn (@2) > 0)
(bit_and @0 (convert (minus @1 { build_int_cst (TREE_TYPE (@1), 1); }))))))
+/* Simplify (unsigned t / 2) * 2 -> unsigned t & ~1. */
+(simplify
+ (mult (exact_div @0 INTEGET_CST@1) @1)
+ @0)
+
+(simplify
+ (mult (trunc_div @0 integer_pow2p@1) @1)
+ (bit_and @0 (negate @1)))
+
/* X % Y is smaller than Y. */
(for cmp (lt ge)
(simplify
new file mode 100644
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr25530.c
@@ -0,0 +1,14 @@
+new file mode 100644
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/pr25530.c
+@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+int
+f (unsigned t)
+{
+ return (t / 2) * 2;
+}
+
+/* { dg-final { scan-tree-dump "\& -2" "optimized" } } */