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:
parent
e5b1fae41b
commit
0557293fc2
|
@ -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.
|
||||
|
|
19
gcc/match.pd
19
gcc/match.pd
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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" } } */
|
Loading…
Reference in New Issue