tree-vrp.c (evrp_dom_walker::before_dom_children): Also set range/nonnull info for...
authorRichard Biener <rguenther@suse.de>
Wed, 11 Jan 2017 09:06:29 +0000 (09:06 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 11 Jan 2017 09:06:29 +0000 (09:06 +0000)
2017-01-11  Richard Biener  <rguenther@suse.de>

* tree-vrp.c (evrp_dom_walker::before_dom_children): Also
set range/nonnull info for PHI results.  Do not set it on
stmts marked for removal.

* gcc.dg/tree-ssa/pr61743-1.c: Adjust.

From-SVN: r244305

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr61743-1.c
gcc/tree-vrp.c

index cc81d79a758f442af89746bd02aadcd81cf51b3e..caa26f8ea5562cb475b4401ec9e57599e85e0726 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-11  Richard Biener  <rguenther@suse.de>
+
+       * tree-vrp.c (evrp_dom_walker::before_dom_children): Also
+       set range/nonnull info for PHI results.  Do not set it on
+       stmts marked for removal.
+
 2017-01-10  Eric Botcazou  <ebotcazou@adacore.com>
 
        * expr.c (store_field): In the bitfield case, fetch the return value
index 2b5f3b9dca00c07b25dd18621c3040742fec17c4..f189a4484deed5a31ea51415e1b97e50e7c4ae22 100644 (file)
@@ -1,3 +1,7 @@
+2017-01-11  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/pr61743-1.c: Adjust.
+
 2017-01-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/50199
index 8041c6a323e72ae6c18c866eeb575bd315a87303..a5c83cf8ecf4a92b89bb3c1420dc416a405b368f 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */\r
-/* { dg-options "-O3 -funroll-loops -fno-tree-vectorize -fdump-tree-cunroll-details -fno-peel-loops" } */\r
+/* { dg-options "-O3 -funroll-loops -fno-tree-vectorize -fdump-tree-cunroll-details -fdump-tree-cunrolli-details -fno-peel-loops" } */\r
 \r
 #define N 8\r
 #define M 14\r
@@ -48,5 +48,5 @@ int foo1 (e_u8 a[4][N], int b1, int b2, e_u8 b[M+1][4][N])
   return 0;\r
 }\r
 \r
-/* { dg-final { scan-tree-dump-times "loop with 4 iterations completely unrolled" 2 "cunroll" } } */\r
-/* { dg-final { scan-tree-dump-times "loop with 8 iterations completely unrolled" 2 "cunroll" } } */\r
+/* { dg-final { scan-tree-dump-times "loop with 4 iterations completely unrolled" 8 "cunroll" } } */\r
+/* { dg-final { scan-tree-dump-times "loop with 9 iterations completely unrolled" 2 "cunrolli" } } */\r
index 54df161ca257bf13a35471455d006695a16120dd..4cfdd0ae6dea35d5ebe1561052211a5a2905576e 100644 (file)
@@ -10862,7 +10862,29 @@ evrp_dom_walker::before_dom_children (basic_block bb)
       /* Mark PHIs whose lhs we fully propagate for removal.  */
       tree val = op_with_constant_singleton_value_range (lhs);
       if (val && may_propagate_copy (lhs, val))
-       stmts_to_remove.safe_push (phi);
+       {
+         stmts_to_remove.safe_push (phi);
+         continue;
+       }
+
+      /* Set the SSA with the value range.  */
+      if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
+       {
+         if ((vr_result.type == VR_RANGE
+              || vr_result.type == VR_ANTI_RANGE)
+             && (TREE_CODE (vr_result.min) == INTEGER_CST)
+             && (TREE_CODE (vr_result.max) == INTEGER_CST))
+           set_range_info (lhs,
+                           vr_result.type, vr_result.min, vr_result.max);
+       }
+      else if (POINTER_TYPE_P (TREE_TYPE (lhs))
+              && ((vr_result.type == VR_RANGE
+                   && range_includes_zero_p (vr_result.min,
+                                             vr_result.max) == 0)
+                  || (vr_result.type == VR_ANTI_RANGE
+                      && range_includes_zero_p (vr_result.min,
+                                                vr_result.max) == 1)))
+       set_ptr_nonnull (lhs);
     }
 
   edge taken_edge = NULL;
@@ -10908,6 +10930,17 @@ evrp_dom_walker::before_dom_children (basic_block bb)
              update_value_range (output, &vr);
              vr = *get_value_range (output);
 
+             /* Mark stmts whose output we fully propagate for removal.  */
+             tree val;
+             if ((val = op_with_constant_singleton_value_range (output))
+                 && may_propagate_copy (output, val)
+                 && !stmt_could_throw_p (stmt)
+                 && !gimple_has_side_effects (stmt))
+               {
+                 stmts_to_remove.safe_push (stmt);
+                 continue;
+               }
+
              /* Set the SSA with the value range.  */
              if (INTEGRAL_TYPE_P (TREE_TYPE (output)))
                {
@@ -10925,17 +10958,6 @@ evrp_dom_walker::before_dom_children (basic_block bb)
                               && range_includes_zero_p (vr.min,
                                                         vr.max) == 1)))
                set_ptr_nonnull (output);
-
-             /* Mark stmts whose output we fully propagate for removal.  */
-             tree val;
-             if ((val = op_with_constant_singleton_value_range (output))
-                 && may_propagate_copy (output, val)
-                 && !stmt_could_throw_p (stmt)
-                 && !gimple_has_side_effects (stmt))
-               {
-                 stmts_to_remove.safe_push (stmt);
-                 continue;
-               }
            }
          else
            set_defs_to_varying (stmt);