match.pd: combine successive multiplications by constants
authorAlexander Monakov <amonakov@ispras.ru>
Tue, 25 Jul 2017 14:36:03 +0000 (17:36 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Tue, 25 Jul 2017 14:36:03 +0000 (17:36 +0300)
* match.pd ((X * CST1) * CST2): Simplify to X * (CST1 * CST2).
testsuite:
* gcc.dg/tree-ssa/assoc-2.c: Enhance.
* gcc.dg/tree-ssa/slsr-4.c: Adjust.

From-SVN: r250524

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/assoc-2.c
gcc/testsuite/gcc.dg/tree-ssa/slsr-4.c

index 654227cd55ddcc6ba4610500b1b2da4d82f2fbb5..34bbe013441fcfa8b0dcc47fcf510cf304866e00 100644 (file)
@@ -1,3 +1,7 @@
+2017-07-25  Alexander Monakov  <amonakov@ispras.ru>
+
+       * match.pd ((X * CST1) * CST2): Simplify to X * (CST1 * CST2).
+
 2017-07-25  Alexander Monakov  <amonakov@ispras.ru>
 
        * match.pd ((X * CST) * Y): Reassociate to (X * Y) * CST.
index 39e1e5c8384f32e515064dbd4ec963d4d765e44f..732b80c04bf732a1418beef1dc55f19c9208f7ad 100644 (file)
@@ -284,6 +284,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
         || mul != wi::min_value (TYPE_PRECISION (type), SIGNED))
      { build_zero_cst (type); })))))
 
+/* Combine successive multiplications.  Similar to above, but handling
+   overflow is different.  */
+(simplify
+ (mult (mult @0 INTEGER_CST@1) INTEGER_CST@2)
+ (with {
+   bool overflow_p;
+   wide_int mul = wi::mul (@1, @2, TYPE_SIGN (type), &overflow_p);
+  }
+  /* Skip folding on overflow: the only special case is @1 * @2 == -INT_MIN,
+     otherwise undefined overflow implies that @0 must be zero.  */
+  (if (!overflow_p || TYPE_OVERFLOW_WRAPS (type))
+   (mult @0 { wide_int_to_tree (type, mul); }))))
+
 /* Optimize A / A to 1.0 if we don't care about
    NaNs or Infinities.  */
 (simplify
index a5c00b4e25ba068a8d5d635a3159f5d1dbfe1d54..6c25221694fdfb8b63febdaa43889a94afce41cf 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-25  Alexander Monakov  <amonakov@ispras.ru>
+
+       * gcc.dg/tree-ssa/assoc-2.c: Enhance.
+       * gcc.dg/tree-ssa/slsr-4.c: Adjust.
+
 2017-07-25  Alexander Monakov  <amonakov@ispras.ru>
 
        * gcc.dg/tree-ssa/assoc-2.c: New testcase.
index a92c88226e55a4a6ae156f6d6feec35f430e4e35..cc0e9d429b4ef028b9a7bf3c3ff0b3599e1d5bfc 100644 (file)
@@ -5,4 +5,15 @@ int f0(int a, int b){
   return a * 33 * b * 55;
 }
 
-/* { dg-final { scan-tree-dump-times "mult_expr" 2 "gimple" } } */
+int f1(int a){
+  a *= 33;
+  return a * 55;
+}
+
+int f2(int a, int b){
+  a *= 33;
+  return a * b * 55;
+}
+
+/* { dg-final { scan-tree-dump-times "mult_expr" 7 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "mult_expr" 5 "optimized" } } */
index 17d7b4c6951d6237a6a4e0307a21e8aae0cd8ff1..1e943b737b91e8dd17498a6dee5ea6b8011d72cc 100644 (file)
@@ -23,13 +23,9 @@ f (int i)
   foo (y);
 }
 
-/* { dg-final { scan-tree-dump-times "\\* 4" 1 "slsr" } } */
-/* { dg-final { scan-tree-dump-times "\\* 10" 1 "slsr" } } */
-/* { dg-final { scan-tree-dump-times "\\+ 20;" 1 "slsr" } } */
+/* { dg-final { scan-tree-dump-times "\\* 40" 1 "slsr" } } */
 /* { dg-final { scan-tree-dump-times "\\+ 200" 1 "slsr" } } */
-/* { dg-final { scan-tree-dump-times "\\- 16;" 1 "slsr" } } */
 /* { dg-final { scan-tree-dump-times "\\- 160" 1 "slsr" } } */
-/* { dg-final { scan-tree-dump-times "\\* 4" 1 "optimized" } } */
-/* { dg-final { scan-tree-dump-times "\\* 10" 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "\\* 40" 1 "optimized" } } */
 /* { dg-final { scan-tree-dump-times "\\+ 200" 1 "optimized" } } */
 /* { dg-final { scan-tree-dump-times "\\+ 40" 1 "optimized" } } */