On May 7, 2020 4:27:26 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote:
>On Thu, May 07, 2020 at 09:59:57AM +0200, Richard Biener wrote:
>> Maybe write A - B + -1 >= A to actually match what you match below
>...
>> on the plus :c is not needed, canonicalization will put the constant
>> literal second
>> 
>> The previous pattern has a single_use check on the minus, since
>> the result is always "simple" (a single stmt) the :s have no
>> effect (hmm, I guess a genmatch warning for this case might be nice).
>> 
>> And yes, if the TYPE_OVERFLOW_WRAPS checks are unnecessary remove
>> them please, we'll hopefully resist all attempts to ubsan
>> unsigned overflow ...
>
>So like this if it passes bootstrap/regtest?

Yes. Mit sure what Jeff is suggesting. 

Thanks, 
Richard. 

>2020-05-07  Jakub Jelinek  <ja...@redhat.com>
>
>       PR tree-optimization/94913
>       * match.pd (A - B + -1 >= A to B >= A): New simplification.
>       (A - B > A to A < B): Don't test TYPE_OVERFLOW_WRAPS which is always
>       true for TYPE_UNSIGNED integral types.
>
>       * gcc.dg/tree-ssa/pr94913.c: New test.
>
>--- gcc/match.pd.jj    2020-05-06 11:18:35.000000000 +0200
>+++ gcc/match.pd       2020-05-07 15:52:41.450787729 +0200
>@@ -4787,10 +4787,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>   (cmp:c (minus@2 @0 @1) @0)
>   (if (single_use (@2)
>        && ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
>-       && TYPE_UNSIGNED (TREE_TYPE (@0))
>-       && TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0)))
>+       && TYPE_UNSIGNED (TREE_TYPE (@0)))
>    (cmp @1 @0))))
> 
>+/* Optimize A - B + -1 >= A into B >= A for unsigned comparisons.  */
>+(for cmp (ge lt)
>+ (simplify
>+  (cmp:c (plus (minus @0 @1) integer_minus_onep) @0)
>+   (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
>+      && TYPE_UNSIGNED (TREE_TYPE (@0)))
>+    (cmp @1 @0))))
>+
>/* Testing for overflow is unnecessary if we already know the result. 
>*/
> /* A - B > A  */
> (for cmp (gt le)
>--- gcc/testsuite/gcc.dg/tree-ssa/pr94913.c.jj 2020-05-06
>15:20:08.306376994 +0200
>+++ gcc/testsuite/gcc.dg/tree-ssa/pr94913.c    2020-05-06
>15:19:45.120725533 +0200
>@@ -0,0 +1,33 @@
>+/* PR tree-optimization/94913 */
>+/* { dg-do compile } */
>+/* { dg-options "-O2 -fdump-tree-optimized" } */
>+/* { dg-final { scan-tree-dump " (?:b_\[0-9]+\\\(D\\\) >=
>a|a_\[0-9]+\\\(D\\\) <= b)_\[0-9]+\\\(D\\\);" "optimized" } } */
>+/* { dg-final { scan-tree-dump " (?:c_\[0-9]+\\\(D\\\) >
>d|d_\[0-9]+\\\(D\\\) < c)_\[0-9]+\\\(D\\\);" "optimized" } } */
>+/* { dg-final { scan-tree-dump " (?:f_\[0-9]+\\\(D\\\) >=
>e|e_\[0-9]+\\\(D\\\) <= f)_\[0-9]+\\\(D\\\);" "optimized" } } */
>+/* { dg-final { scan-tree-dump " (?:g_\[0-9]+\\\(D\\\) >
>h|h_\[0-9]+\\\(D\\\) < g)_\[0-9]+\\\(D\\\);" "optimized" } } */
>+
>+int
>+foo (unsigned a, unsigned b)
>+{
>+  return (a - b - 1) >= a;
>+}
>+
>+int
>+bar (unsigned c, unsigned d)
>+{
>+  return (c - d - 1) < c;
>+}
>+
>+int
>+baz (unsigned e, unsigned f)
>+{
>+  unsigned t = e - f;
>+  return (t - 1) >= e;
>+}
>+
>+int
>+qux (unsigned g, unsigned h)
>+{
>+  unsigned t = g - h;
>+  return (t - 1) < g;
>+}
>
>
>       Jakub

Reply via email to