re PR tree-optimization/81655 (new test case gcc.dg/tree-ssa/pr81588.c fails on power...
authorJakub Jelinek <jakub@redhat.com>
Thu, 3 Aug 2017 09:41:55 +0000 (11:41 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 3 Aug 2017 09:41:55 +0000 (11:41 +0200)
PR tree-optimization/81655
PR tree-optimization/81588
* tree-ssa-reassoc.c (optimize_range_tests_var_bound): Handle also
the case when ranges[i].low and high are 1 for unsigned type with
precision 1.

From-SVN: r250849

gcc/ChangeLog
gcc/tree-ssa-reassoc.c

index a9b923a22fa89e9466955dc2f64bc0e6f2fa164f..466afb908b6a9ee824503f7a6ca0e533f02dec66 100644 (file)
@@ -1,5 +1,11 @@
 2017-08-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/81655
+       PR tree-optimization/81588
+       * tree-ssa-reassoc.c (optimize_range_tests_var_bound): Handle also
+       the case when ranges[i].low and high are 1 for unsigned type with
+       precision 1.
+
        PR middle-end/81052
        * omp-low.c (diagnose_sb_0): Handle flag_openmp_simd like flag_openmp.
        (pass_diagnose_omp_blocks::gate): Enable also for flag_openmp_simd.
index b4fe488e79776894b2f634edebff8ec2f6ee640d..6ecba809199cabe143138311cfcfd83cf444d9f4 100644 (file)
@@ -2918,11 +2918,22 @@ optimize_range_tests_var_bound (enum tree_code opcode, int first, int length,
 
   for (i = 0; i < length; i++)
     {
+      bool in_p = ranges[i].in_p;
       if (ranges[i].low == NULL_TREE
-         || ranges[i].high == NULL_TREE
-         || !integer_zerop (ranges[i].low)
-         || !integer_zerop (ranges[i].high))
+         || ranges[i].high == NULL_TREE)
        continue;
+      if (!integer_zerop (ranges[i].low)
+         || !integer_zerop (ranges[i].high))
+       {
+         if (ranges[i].exp
+             && TYPE_PRECISION (TREE_TYPE (ranges[i].exp)) == 1
+             && TYPE_UNSIGNED (TREE_TYPE (ranges[i].exp))
+             && integer_onep (ranges[i].low)
+             && integer_onep (ranges[i].high))
+           in_p = !in_p;
+         else
+           continue;
+       }
 
       gimple *stmt;
       tree_code ccode;
@@ -2964,7 +2975,7 @@ optimize_range_tests_var_bound (enum tree_code opcode, int first, int length,
        default:
          continue;
        }
-      if (ranges[i].in_p)
+      if (in_p)
        ccode = invert_tree_comparison (ccode, false);
       switch (ccode)
        {