diff options
author | Kugan Vivekanandarajah <kuganv@linaro.org> | 2016-10-17 23:35:48 +0000 |
---|---|---|
committer | Kugan Vivekanandarajah <kugan@gcc.gnu.org> | 2016-10-17 23:35:48 +0000 |
commit | 735b8f9fc4b14384b246b39dfccbf529402b7791 (patch) | |
tree | 79b96808abe9a9f3a2571e69510e046068caad46 /gcc/tree-vrp.c | |
parent | 86f980870a28bc9022cc57362b5031ede43ecff9 (diff) | |
download | gcc-735b8f9fc4b14384b246b39dfccbf529402b7791.zip gcc-735b8f9fc4b14384b246b39dfccbf529402b7791.tar.gz gcc-735b8f9fc4b14384b246b39dfccbf529402b7791.tar.bz2 |
Set nonnull attribute to ptr_info_def based on VRP
Set nonnull attribute to ptr_info_def based on VRP
gcc/ChangeLog:
2016-10-18 Kugan Vivekanandarajah <kuganv@linaro.org>
* tree-ssa-alias.h (pt_solution_singleton_or_null_p): Renamed from
pt_solution_singleton_p.
* tree-ssa-ccp.c (fold_builtin_alloca_with_align): Use renamed
pt_solution_singleton_or_null_p from pt_solution_singleton_p.
* tree-ssa-structalias.c (find_what_p_points_to): Preserve
pointer nonnull computed by VRP.
Also Conservatively set pt.null to 1.
(pt_solution_reset): Conservatively set pt.null to 1.
(pt_solution_singleton_or_null_p): Renamed from
pt_solution_singleton_p.
* tree-ssanames.h (set_ptr_nonnull): Declare.
(get_ptr_nonnull): Likewise.
* tree-ssanames.c (set_ptr_nonnull): New.
(get_ptr_nonnull): Likewise.
* tree-vrp.c (vrp_finalize): Set ptr that are nonnull.
(evrp_dom_walker::before_dom_children): Likewise.
gcc/testsuite/ChangeLog:
2016-10-18 Kugan Vivekanandarajah <kuganv@linaro.org>
* gcc.dg/torture/pr39074-2.c: Adjust testcase.
* gcc.dg/torture/pr39074.c: Likewise.
From-SVN: r241287
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 1aebc72..b11fc64 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -10601,18 +10601,24 @@ vrp_finalize (bool warn_array_bounds_p) { tree name = ssa_name (i); - if (!name - || POINTER_TYPE_P (TREE_TYPE (name)) - || (vr_value[i]->type == VR_VARYING) - || (vr_value[i]->type == VR_UNDEFINED)) - continue; + if (!name + || (vr_value[i]->type == VR_VARYING) + || (vr_value[i]->type == VR_UNDEFINED) + || (TREE_CODE (vr_value[i]->min) != INTEGER_CST) + || (TREE_CODE (vr_value[i]->max) != INTEGER_CST)) + continue; - if ((TREE_CODE (vr_value[i]->min) == INTEGER_CST) - && (TREE_CODE (vr_value[i]->max) == INTEGER_CST) - && (vr_value[i]->type == VR_RANGE - || vr_value[i]->type == VR_ANTI_RANGE)) - set_range_info (name, vr_value[i]->type, vr_value[i]->min, - vr_value[i]->max); + if (POINTER_TYPE_P (TREE_TYPE (name)) + && ((vr_value[i]->type == VR_RANGE + && range_includes_zero_p (vr_value[i]->min, + vr_value[i]->max) == 0) + || (vr_value[i]->type == VR_ANTI_RANGE + && range_includes_zero_p (vr_value[i]->min, + vr_value[i]->max) == 1))) + set_ptr_nonnull (name); + else if (!POINTER_TYPE_P (TREE_TYPE (name))) + set_range_info (name, vr_value[i]->type, vr_value[i]->min, + vr_value[i]->max); } substitute_and_fold (op_with_constant_singleton_value_range, @@ -10821,17 +10827,25 @@ evrp_dom_walker::before_dom_children (basic_block bb) def_operand_p def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF); /* Set the SSA with the value range. */ if (def_p - && TREE_CODE (DEF_FROM_PTR (def_p)) == SSA_NAME - && INTEGRAL_TYPE_P (TREE_TYPE (DEF_FROM_PTR (def_p)))) + && TREE_CODE (DEF_FROM_PTR (def_p)) == SSA_NAME) { tree def = DEF_FROM_PTR (def_p); value_range *vr = get_value_range (def); - if ((vr->type == VR_RANGE - || vr->type == VR_ANTI_RANGE) + if (INTEGRAL_TYPE_P (TREE_TYPE (DEF_FROM_PTR (def_p))) + && (vr->type == VR_RANGE + || vr->type == VR_ANTI_RANGE) && (TREE_CODE (vr->min) == INTEGER_CST) && (TREE_CODE (vr->max) == INTEGER_CST)) set_range_info (def, vr->type, vr->min, vr->max); + else if (POINTER_TYPE_P (TREE_TYPE (DEF_FROM_PTR (def_p))) + && ((vr->type == VR_RANGE + && range_includes_zero_p (vr->min, + vr->max) == 0) + || (vr->type == VR_ANTI_RANGE + && range_includes_zero_p (vr->min, + vr->max) == 1))) + set_ptr_nonnull (def); } } else |