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?

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