tree-vrp.c (get_value_range): Only set parameter default definitions to varying,...
authorRichard Guenther <rguenther@suse.de>
Fri, 29 Jul 2011 09:24:23 +0000 (09:24 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 29 Jul 2011 09:24:23 +0000 (09:24 +0000)
2011-07-29  Richard Guenther  <rguenther@suse.de>

* tree-vrp.c (get_value_range): Only set parameter default
definitions to varying, leave others at undefined.
(extract_range_from_binary_expr): Fix undefined handling.
(vrp_visit_phi_node): Handle merged undefined state.

* gcc.dg/uninit-suppress.c: Also disable VRP.
* gcc.dg/uninit-suppress_2.c: Likewise.

From-SVN: r176918

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/uninit-suppress.c
gcc/testsuite/gcc.dg/uninit-suppress_2.c
gcc/tree-vrp.c

index 0b70415acad0e9684e65e6a1003d277aba4ecdc5..a184cc27cc9f9b29b06c907333e3c8497f017d6d 100644 (file)
@@ -1,3 +1,10 @@
+2011-07-29  Richard Guenther  <rguenther@suse.de>
+
+       * tree-vrp.c (get_value_range): Only set parameter default
+       definitions to varying, leave others at undefined.
+       (extract_range_from_binary_expr): Fix undefined handling.
+       (vrp_visit_phi_node): Handle merged undefined state.
+
 2011-07-29  Wei Guozhi  <carrot@google.com>
 
        PR rtl-optimization/49799
index c825d3bade048fc6dd99e17d5820069b9218945f..6ba2c8de1db7d73166d7933f80a836637da1aae9 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-29  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.dg/uninit-suppress.c: Also disable VRP.
+       * gcc.dg/uninit-suppress_2.c: Likewise.
+
 2011-07-28  Jason Merrill  <jason@redhat.com>
 
        PR c++/49808
index 64038a3a2398161f29b0ceb86510a15b626e8ea6..be3b4c1ab4fecc700f0e3646d7f8c26230c0e693 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-fno-tree-ccp -O2 -Wuninitialized -Wno-maybe-uninitialized" } */
+/* { dg-options "-fno-tree-ccp -fno-tree-vrp -O2 -Wuninitialized -Wno-maybe-uninitialized" } */
 void blah();
 int gflag;
 
index a48b182f8cbcd6b442e788a238762f7cb87d6a37..e1497347336a74d3bc7e06f44abc351835be2290 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-fno-tree-ccp -O2 -Wuninitialized -Werror=uninitialized -Wno-error=maybe-uninitialized" } */
+/* { dg-options "-fno-tree-ccp -fno-tree-vrp -O2 -Wuninitialized -Werror=uninitialized -Wno-error=maybe-uninitialized" } */
 void blah();
 int gflag;
 
index b53ef5e75e27ce6b64809558a2d71c2077f3d5c7..15331e1fcc69b04671d49c4b037619cc0be785a3 100644 (file)
@@ -692,16 +692,16 @@ get_value_range (const_tree var)
   /* Defer allocating the equivalence set.  */
   vr->equiv = NULL;
 
-  /* If VAR is a default definition, the variable can take any value
-     in VAR's type.  */
+  /* If VAR is a default definition of a parameter, the variable can
+     take any value in VAR's type.  */
   sym = SSA_NAME_VAR (var);
-  if (SSA_NAME_IS_DEFAULT_DEF (var))
+  if (SSA_NAME_IS_DEFAULT_DEF (var)
+      && TREE_CODE (sym) == PARM_DECL)
     {
       /* Try to use the "nonnull" attribute to create ~[0, 0]
         anti-ranges for pointers.  Note that this is only valid with
         default definitions of PARM_DECLs.  */
-      if (TREE_CODE (sym) == PARM_DECL
-         && POINTER_TYPE_P (TREE_TYPE (sym))
+      if (POINTER_TYPE_P (TREE_TYPE (sym))
          && nonnull_arg_p (sym))
        set_value_range_to_nonnull (vr, TREE_TYPE (sym));
       else
@@ -2225,12 +2225,20 @@ extract_range_from_binary_expr (value_range_t *vr,
   else
     set_value_range_to_varying (&vr1);
 
-  /* If either range is UNDEFINED, so is the result.  */
-  if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
+  /* If both ranges are UNDEFINED, so is the result.  */
+  if (vr0.type == VR_UNDEFINED && vr1.type == VR_UNDEFINED)
     {
       set_value_range_to_undefined (vr);
       return;
     }
+  /* If one of the ranges is UNDEFINED drop it to VARYING for the following
+     code.  At some point we may want to special-case operations that
+     have UNDEFINED result for all or some value-ranges of the not UNDEFINED
+     operand.  */
+  else if (vr0.type == VR_UNDEFINED)
+    set_value_range_to_varying (&vr0);
+  else if (vr1.type == VR_UNDEFINED)
+    set_value_range_to_varying (&vr1);
 
   /* The type of the resulting value range defaults to VR0.TYPE.  */
   type = vr0.type;
@@ -6642,6 +6650,8 @@ vrp_visit_phi_node (gimple phi)
 
   if (vr_result.type == VR_VARYING)
     goto varying;
+  else if (vr_result.type == VR_UNDEFINED)
+    goto update_range;
 
   old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
   vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
@@ -6713,6 +6723,7 @@ vrp_visit_phi_node (gimple phi)
 
   /* If the new range is different than the previous value, keep
      iterating.  */
+update_range:
   if (update_value_range (lhs, &vr_result))
     {
       if (dump_file && (dump_flags & TDF_DETAILS))