diff options
author | Richard Biener <rguenther@suse.de> | 2017-01-11 09:06:29 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-01-11 09:06:29 +0000 |
commit | 80c74722bc934e376b06fa2e59925cb134202266 (patch) | |
tree | 3bdccc60769ba543734fa198aa5ebb8041cced1a /gcc/tree-vrp.c | |
parent | 4c4b47031d4bcbf116cbc3c479933adf14b2b4fe (diff) | |
download | gcc-80c74722bc934e376b06fa2e59925cb134202266.zip gcc-80c74722bc934e376b06fa2e59925cb134202266.tar.gz gcc-80c74722bc934e376b06fa2e59925cb134202266.tar.bz2 |
tree-vrp.c (evrp_dom_walker::before_dom_children): Also set range/nonnull info for PHI results.
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
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 54df161..4cfdd0a 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -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); |