match.pd: optimize unsigned mul overflow check

gcc/
2016-05-28  Alexander Monakov  <amonakov@ispras.ru>
            Marc Glisse  <marc.glisse@inria.fr>

	PR tree-optimization/71289
	* match.pd (-1 / B < A, A > -1 / B): New transformations.

gcc/testsuite/
2016-05-28  Alexander Monakov  <amonakov@ispras.ru>

	PR tree-optimization/71289
	* gcc.dg/pr71289.c: New test.


Co-Authored-By: Marc Glisse <marc.glisse@inria.fr>

From-SVN: r236882
This commit is contained in:
Alexander Monakov 2016-05-30 17:37:02 +03:00 committed by Alexander Monakov
parent e5b1fae41b
commit 0557293fc2
4 changed files with 48 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2016-05-30 Alexander Monakov <amonakov@ispras.ru>
Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/71289
* match.pd (-1 / B < A, A > -1 / B): New transformations.
2016-05-30 Jan Hubicka <hubicka@ucw.cz>
* tree-vect-loop.c (vect_transform_loop): Update likely bounds.

View File

@ -2657,6 +2657,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& types_match (TREE_TYPE (@0), TREE_TYPE (@1)))
(out (imagpart @2) { build_zero_cst (TREE_TYPE (@0)); }))))
/* For unsigned operands, A > -1 / B checks whether A * B would overflow.
Simplify it to __builtin_mul_overflow (A, B, <unused>). */
/* -1 / B < A */
(for cmp (lt ge)
out (ne eq)
(simplify
(cmp (trunc_div:s integer_all_onesp @1) @0)
(if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0)))
(with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); }
(out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); })))))
/* A > -1 / B */
(for cmp (gt le)
out (ne eq)
(simplify
(cmp @0 (trunc_div:s integer_all_onesp @1))
(if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0)))
(with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); }
(out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); })))))
/* Simplification of math builtins. These rules must all be optimizations
as well as IL simplifications. If there is a possibility that the new

View File

@ -1,3 +1,8 @@
2016-05-30 Alexander Monakov <amonakov@ispras.ru>
PR tree-optimization/71289
* gcc.dg/pr71289.c: New test.
2016-05-30 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/71269

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-O -fdump-tree-optimized-raw" } */
int f(unsigned a, unsigned b, unsigned *c)
{
if (a > -1 / b)
return -1;
*c = a * b;
return 0;
}
void g(unsigned long long a, unsigned long long b, unsigned long long *c)
{
if (a <= -1 / b)
*c = a * b;
}
/* { dg-final { scan-tree-dump-not "trunc_div_expr" "optimized" } } */