diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2017-07-25 17:36:03 +0300 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2017-07-25 17:36:03 +0300 |
commit | 288fe52ed1db0510d16a31a0b4cbc8ae0d4e288f (patch) | |
tree | 36141591cb946978aedacd0393ff806bc80177f7 /gcc | |
parent | b771c60914096866b6e8c2fa9b953b471e22708c (diff) | |
download | gcc-288fe52ed1db0510d16a31a0b4cbc8ae0d4e288f.zip gcc-288fe52ed1db0510d16a31a0b4cbc8ae0d4e288f.tar.gz gcc-288fe52ed1db0510d16a31a0b4cbc8ae0d4e288f.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/match.pd | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/assoc-2.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/slsr-4.c | 8 |
5 files changed, 36 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 654227c..34bbe01 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 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> diff --git a/gcc/match.pd b/gcc/match.pd index 39e1e5c..732b80c 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a5c00b4..6c25221 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/assoc-2.c b/gcc/testsuite/gcc.dg/tree-ssa/assoc-2.c index a92c882..cc0e9d4 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/assoc-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/assoc-2.c @@ -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" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/slsr-4.c b/gcc/testsuite/gcc.dg/tree-ssa/slsr-4.c index 17d7b4c..1e943b7 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/slsr-4.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/slsr-4.c @@ -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" } } */ |