re PR tree-optimization/81346 (Missed constant propagation into comparison)
authorJakub Jelinek <jakub@redhat.com>
Wed, 19 Jul 2017 13:10:05 +0000 (15:10 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 19 Jul 2017 13:10:05 +0000 (15:10 +0200)
PR tree-optimization/81346
* match.pd: Optimize (X - 1U) <= INT_MAX-1U into (int) X > 0.

* gcc.dg/tree-ssa/pr81346-5.c: New test.

From-SVN: r250342

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr81346-5.c [new file with mode: 0644]

index bdd1234ac8138cf3d7ee0a54602288e60b077f93..c87edc1fcf844f9b112cad01c5f06525ee65aeba 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/81346
+       * match.pd: Optimize (X - 1U) <= INT_MAX-1U into (int) X > 0.
+
 2017-07-19  Tom de Vries  <tom@codesourcery.com>
 
        * config/nvptx/nvptx.md (VECIM): Add V2DI.
index fe270934c03fe3519fbffefc79577569ec810d2c..56d13b3c1758563d37aeafa72f8e1b9bb178424b 100644 (file)
@@ -1125,6 +1125,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && wi::neg_p (@1, TYPE_SIGN (TREE_TYPE (@1))))
     (cmp @2 @0))))))
 
+/* (X - 1U) <= INT_MAX-1U into (int) X > 0.  */
+(for cmp (le gt)
+     icmp (gt le)
+ (simplify
+  (cmp (plus @0 integer_minus_onep@1) INTEGER_CST@2)
+   (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
+       && TYPE_UNSIGNED (TREE_TYPE (@0))
+       && TYPE_PRECISION (TREE_TYPE (@0)) > 1
+       && wi::eq_p (@2, wi::max_value (TYPE_PRECISION (TREE_TYPE (@0)),
+                                       SIGNED) - 1))
+    (with { tree stype = signed_type_for (TREE_TYPE (@0)); }
+     (icmp (convert:stype @0) { build_int_cst (stype, 0); })))))
+
 /* X / 4 < Y / 4 iff X < Y when the division is known to be exact.  */
 (for cmp (simple_comparison)
  (simplify
index e0526a5c49c56928888432768e4daff786a9a10f..a193548b0048a9bc5421ff0a8b35704e84ff169f 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/81346
+       * gcc.dg/tree-ssa/pr81346-5.c: New test.
+
 2017-07-19  Tom de Vries  <tom@codesourcery.com>
 
        * gcc.target/nvptx/decl-init.c: Update alignment.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr81346-5.c b/gcc/testsuite/gcc.dg/tree-ssa/pr81346-5.c
new file mode 100644 (file)
index 0000000..14562a1
--- /dev/null
@@ -0,0 +1,17 @@
+/* PR tree-optimization/81346 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-times "\\(signed int\\) x" 10 "optimized" } } */
+/* { dg-final { scan-tree-dump-times " <= 0;" 5 "optimized" } } */
+/* { dg-final { scan-tree-dump-times " > 0;" 5 "optimized" } } */
+
+int f1 (unsigned x) { return x - 1 <= __INT_MAX__ - 1; }
+int f2 (unsigned x) { unsigned a = 1, b = __INT_MAX__ - 1; return x - a <= b; }
+int f3 (unsigned x) { return x - 1 < __INT_MAX__; }
+int f4 (unsigned x) { unsigned a = 1, b = __INT_MAX__; return x - a < b; }
+int f5 (unsigned x) { return x >= 1 && x <= __INT_MAX__; }
+int f6 (unsigned x) { return x - 1 > __INT_MAX__ - 1; }
+int f7 (unsigned x) { unsigned a = 1, b = __INT_MAX__ - 1; return x - a > b; }
+int f8 (unsigned x) { return x - 1 >= __INT_MAX__; }
+int f9 (unsigned x) { unsigned a = 1, b = __INT_MAX__; return x - a >= b; }
+int f10 (unsigned x) { return x < 1 || x > __INT_MAX__; }