Commit 288fe52e by Alexander Monakov Committed by Alexander Monakov

match.pd: combine successive multiplications by constants

	* 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
parent b771c609
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.
2017-07-25 Torsten Duwe <duwe@suse.de>
......
......@@ -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
......
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.
2017-07-25 Torsten Duwe <duwe@suse.de>
......
......@@ -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" } } */
......@@ -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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment