From 0557293fc21c8c9ba94acb48e4373f974bf09d2e Mon Sep 17 00:00:00 2001 From: Alexander Monakov Date: Mon, 30 May 2016 17:37:02 +0300 Subject: [PATCH] match.pd: optimize unsigned mul overflow check gcc/ 2016-05-28 Alexander Monakov Marc Glisse PR tree-optimization/71289 * match.pd (-1 / B < A, A > -1 / B): New transformations. gcc/testsuite/ 2016-05-28 Alexander Monakov PR tree-optimization/71289 * gcc.dg/pr71289.c: New test. Co-Authored-By: Marc Glisse From-SVN: r236882 --- gcc/ChangeLog | 6 ++++++ gcc/match.pd | 19 +++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr71289.c | 18 ++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr71289.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df408182398..80e53bac6a3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-30 Alexander Monakov + Marc Glisse + + PR tree-optimization/71289 + * match.pd (-1 / B < A, A > -1 / B): New transformations. + 2016-05-30 Jan Hubicka * tree-vect-loop.c (vect_transform_loop): Update likely bounds. diff --git a/gcc/match.pd b/gcc/match.pd index 8d05e86b7bf..953c0703d92 100644 --- a/gcc/match.pd +++ b/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, ). */ +/* -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9d233f1773a..ae0a6691cdf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-30 Alexander Monakov + + PR tree-optimization/71289 + * gcc.dg/pr71289.c: New test. + 2016-05-30 Kugan Vivekanandarajah PR middle-end/71269 diff --git a/gcc/testsuite/gcc.dg/pr71289.c b/gcc/testsuite/gcc.dg/pr71289.c new file mode 100644 index 00000000000..39837b93365 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr71289.c @@ -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" } } */ -- 2.30.2