diff options
author | Richard Guenther <rguenther@suse.de> | 2011-07-29 09:24:23 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-07-29 09:24:23 +0000 |
commit | a9b332d4faa42a781340b354d8a9f6426d6e3ebd (patch) | |
tree | 3ff702d99bd1b72a7e57dcb5000b12ec28ee85d6 | |
parent | 17b3c7a2dbccfb4dcb7d78e0c974a0ad212262a9 (diff) | |
download | gcc-a9b332d4faa42a781340b354d8a9f6426d6e3ebd.zip gcc-a9b332d4faa42a781340b354d8a9f6426d6e3ebd.tar.gz gcc-a9b332d4faa42a781340b354d8a9f6426d6e3ebd.tar.bz2 |
tree-vrp.c (get_value_range): Only set parameter default definitions to varying, leave others at undefined.
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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/uninit-suppress.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/uninit-suppress_2.c | 2 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 25 |
5 files changed, 32 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0b70415..a184cc2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c825d3b..6ba2c8d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.dg/uninit-suppress.c b/gcc/testsuite/gcc.dg/uninit-suppress.c index 64038a3..be3b4c1 100644 --- a/gcc/testsuite/gcc.dg/uninit-suppress.c +++ b/gcc/testsuite/gcc.dg/uninit-suppress.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/uninit-suppress_2.c b/gcc/testsuite/gcc.dg/uninit-suppress_2.c index a48b182..e149734 100644 --- a/gcc/testsuite/gcc.dg/uninit-suppress_2.c +++ b/gcc/testsuite/gcc.dg/uninit-suppress_2.c @@ -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; diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index b53ef5e..15331e1 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -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)) |