Commit 735b8f9f by Kugan Vivekanandarajah Committed by Kugan Vivekanandarajah

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
parent 86f98087
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.
2016-10-17 Eric Botcazou <ebotcazou@adacore.com> 2016-10-17 Eric Botcazou <ebotcazou@adacore.com>
* config/i386/i386.h (TARGET_CUSTOM_FUNCTION_DESCRIPTORS): Move to... * config/i386/i386.h (TARGET_CUSTOM_FUNCTION_DESCRIPTORS): Move to...
......
2016-10-18 Kugan Vivekanandarajah <kuganv@linaro.org>
* gcc.dg/torture/pr39074-2.c: Adjust testcase.
* gcc.dg/torture/pr39074.c: Likewise.
2016-10-17 Eric Botcazou <ebotcazou@adacore.com> 2016-10-17 Eric Botcazou <ebotcazou@adacore.com>
* gcc.dg/Wtrampolines.c: XFAIL warning on ia64-*-* and powerpc64-*-*. * gcc.dg/Wtrampolines.c: XFAIL warning on ia64-*-* and powerpc64-*-*.
......
...@@ -31,4 +31,4 @@ int main() ...@@ -31,4 +31,4 @@ int main()
} }
/* { dg-final { scan-tree-dump "y.._. = { i }" "alias" } } */ /* { dg-final { scan-tree-dump "y.._. = { i }" "alias" } } */
/* { dg-final { scan-tree-dump "y.._., points-to vars: { D..... }" "alias" } } */ /* { dg-final { scan-tree-dump "y.._., points-to NULL, points-to vars: { D..... }" "alias" } } */
...@@ -30,4 +30,4 @@ int main() ...@@ -30,4 +30,4 @@ int main()
} }
/* { dg-final { scan-tree-dump "y.._. = { i }" "alias" } } */ /* { dg-final { scan-tree-dump "y.._. = { i }" "alias" } } */
/* { dg-final { scan-tree-dump "y.._., points-to vars: { D..... }" "alias" } } */ /* { dg-final { scan-tree-dump "y.._., points-to NULL, points-to vars: { D..... }" "alias" } } */
...@@ -146,7 +146,7 @@ extern void dump_alias_stats (FILE *); ...@@ -146,7 +146,7 @@ extern void dump_alias_stats (FILE *);
/* In tree-ssa-structalias.c */ /* In tree-ssa-structalias.c */
extern unsigned int compute_may_aliases (void); extern unsigned int compute_may_aliases (void);
extern bool pt_solution_empty_p (struct pt_solution *); extern bool pt_solution_empty_p (struct pt_solution *);
extern bool pt_solution_singleton_p (struct pt_solution *, unsigned *); extern bool pt_solution_singleton_or_null_p (struct pt_solution *, unsigned *);
extern bool pt_solution_includes_global (struct pt_solution *); extern bool pt_solution_includes_global (struct pt_solution *);
extern bool pt_solution_includes (struct pt_solution *, const_tree); extern bool pt_solution_includes (struct pt_solution *, const_tree);
extern bool pt_solutions_intersect (struct pt_solution *, struct pt_solution *); extern bool pt_solutions_intersect (struct pt_solution *, struct pt_solution *);
......
...@@ -2135,7 +2135,7 @@ fold_builtin_alloca_with_align (gimple *stmt) ...@@ -2135,7 +2135,7 @@ fold_builtin_alloca_with_align (gimple *stmt)
{ {
bool singleton_p; bool singleton_p;
unsigned uid; unsigned uid;
singleton_p = pt_solution_singleton_p (&pi->pt, &uid); singleton_p = pt_solution_singleton_or_null_p (&pi->pt, &uid);
gcc_assert (singleton_p); gcc_assert (singleton_p);
SET_DECL_PT_UID (var, uid); SET_DECL_PT_UID (var, uid);
} }
......
...@@ -6451,6 +6451,7 @@ find_what_p_points_to (tree fndecl, tree p) ...@@ -6451,6 +6451,7 @@ find_what_p_points_to (tree fndecl, tree p)
struct ptr_info_def *pi; struct ptr_info_def *pi;
tree lookup_p = p; tree lookup_p = p;
varinfo_t vi; varinfo_t vi;
bool nonnull = get_ptr_nonnull (p);
/* For parameters, get at the points-to set for the actual parm /* For parameters, get at the points-to set for the actual parm
decl. */ decl. */
...@@ -6466,6 +6467,12 @@ find_what_p_points_to (tree fndecl, tree p) ...@@ -6466,6 +6467,12 @@ find_what_p_points_to (tree fndecl, tree p)
pi = get_ptr_info (p); pi = get_ptr_info (p);
pi->pt = find_what_var_points_to (fndecl, vi); pi->pt = find_what_var_points_to (fndecl, vi);
/* Conservatively set to NULL from PTA (to true). */
pi->pt.null = 1;
/* Preserve pointer nonnull computed by VRP. See get_ptr_nonnull
in gcc/tree-ssaname.c for more information. */
if (nonnull)
set_ptr_nonnull (p);
} }
...@@ -6505,6 +6512,7 @@ pt_solution_reset (struct pt_solution *pt) ...@@ -6505,6 +6512,7 @@ pt_solution_reset (struct pt_solution *pt)
{ {
memset (pt, 0, sizeof (struct pt_solution)); memset (pt, 0, sizeof (struct pt_solution));
pt->anything = true; pt->anything = true;
pt->null = true;
} }
/* Set the points-to solution *PT to point only to the variables /* Set the points-to solution *PT to point only to the variables
...@@ -6599,10 +6607,10 @@ pt_solution_empty_p (struct pt_solution *pt) ...@@ -6599,10 +6607,10 @@ pt_solution_empty_p (struct pt_solution *pt)
return the var uid in *UID. */ return the var uid in *UID. */
bool bool
pt_solution_singleton_p (struct pt_solution *pt, unsigned *uid) pt_solution_singleton_or_null_p (struct pt_solution *pt, unsigned *uid)
{ {
if (pt->anything || pt->nonlocal || pt->escaped || pt->ipa_escaped if (pt->anything || pt->nonlocal || pt->escaped || pt->ipa_escaped
|| pt->null || pt->vars == NULL || pt->vars == NULL
|| !bitmap_single_bit_set_p (pt->vars)) || !bitmap_single_bit_set_p (pt->vars))
return false; return false;
......
...@@ -374,6 +374,35 @@ get_range_info (const_tree name, wide_int *min, wide_int *max) ...@@ -374,6 +374,35 @@ get_range_info (const_tree name, wide_int *min, wide_int *max)
return SSA_NAME_RANGE_TYPE (name); return SSA_NAME_RANGE_TYPE (name);
} }
/* Set nonnull attribute to pointer NAME. */
void
set_ptr_nonnull (tree name)
{
gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
struct ptr_info_def *pi = get_ptr_info (name);
pi->pt.null = 0;
}
/* Return nonnull attribute of pointer NAME. */
bool
get_ptr_nonnull (const_tree name)
{
gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
if (pi == NULL)
return false;
/* TODO Now pt->null is conservatively set to true in PTA
analysis. vrp is the only pass (including ipa-vrp)
that clears pt.null via set_ptr_nonull when it knows
for sure. PTA will preserves the pt.null value set by VRP.
When PTA analysis is improved, pt.anything, pt.nonlocal
and pt.escaped may also has to be considered before
deciding that pointer cannot point to NULL. */
return !pi->pt.null;
}
/* Change non-zero bits bitmask of NAME. */ /* Change non-zero bits bitmask of NAME. */
void void
......
...@@ -88,6 +88,8 @@ extern void set_ptr_info_alignment (struct ptr_info_def *, unsigned int, ...@@ -88,6 +88,8 @@ extern void set_ptr_info_alignment (struct ptr_info_def *, unsigned int,
extern void adjust_ptr_info_misalignment (struct ptr_info_def *, extern void adjust_ptr_info_misalignment (struct ptr_info_def *,
unsigned int); unsigned int);
extern struct ptr_info_def *get_ptr_info (tree); extern struct ptr_info_def *get_ptr_info (tree);
extern void set_ptr_nonnull (tree);
extern bool get_ptr_nonnull (const_tree);
extern tree copy_ssa_name_fn (struct function *, tree, gimple *); extern tree copy_ssa_name_fn (struct function *, tree, gimple *);
extern void duplicate_ssa_name_ptr_info (tree, struct ptr_info_def *); extern void duplicate_ssa_name_ptr_info (tree, struct ptr_info_def *);
......
...@@ -10601,18 +10601,24 @@ vrp_finalize (bool warn_array_bounds_p) ...@@ -10601,18 +10601,24 @@ vrp_finalize (bool warn_array_bounds_p)
{ {
tree name = ssa_name (i); tree name = ssa_name (i);
if (!name if (!name
|| POINTER_TYPE_P (TREE_TYPE (name)) || (vr_value[i]->type == VR_VARYING)
|| (vr_value[i]->type == VR_VARYING) || (vr_value[i]->type == VR_UNDEFINED)
|| (vr_value[i]->type == VR_UNDEFINED)) || (TREE_CODE (vr_value[i]->min) != INTEGER_CST)
continue; || (TREE_CODE (vr_value[i]->max) != INTEGER_CST))
continue;
if ((TREE_CODE (vr_value[i]->min) == INTEGER_CST) if (POINTER_TYPE_P (TREE_TYPE (name))
&& (TREE_CODE (vr_value[i]->max) == INTEGER_CST) && ((vr_value[i]->type == VR_RANGE
&& (vr_value[i]->type == VR_RANGE && range_includes_zero_p (vr_value[i]->min,
|| vr_value[i]->type == VR_ANTI_RANGE)) vr_value[i]->max) == 0)
set_range_info (name, vr_value[i]->type, vr_value[i]->min, || (vr_value[i]->type == VR_ANTI_RANGE
vr_value[i]->max); && 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, substitute_and_fold (op_with_constant_singleton_value_range,
...@@ -10821,17 +10827,25 @@ evrp_dom_walker::before_dom_children (basic_block bb) ...@@ -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); def_operand_p def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
/* Set the SSA with the value range. */ /* Set the SSA with the value range. */
if (def_p if (def_p
&& TREE_CODE (DEF_FROM_PTR (def_p)) == SSA_NAME && TREE_CODE (DEF_FROM_PTR (def_p)) == SSA_NAME)
&& INTEGRAL_TYPE_P (TREE_TYPE (DEF_FROM_PTR (def_p))))
{ {
tree def = DEF_FROM_PTR (def_p); tree def = DEF_FROM_PTR (def_p);
value_range *vr = get_value_range (def); value_range *vr = get_value_range (def);
if ((vr->type == VR_RANGE if (INTEGRAL_TYPE_P (TREE_TYPE (DEF_FROM_PTR (def_p)))
|| vr->type == VR_ANTI_RANGE) && (vr->type == VR_RANGE
|| vr->type == VR_ANTI_RANGE)
&& (TREE_CODE (vr->min) == INTEGER_CST) && (TREE_CODE (vr->min) == INTEGER_CST)
&& (TREE_CODE (vr->max) == INTEGER_CST)) && (TREE_CODE (vr->max) == INTEGER_CST))
set_range_info (def, vr->type, vr->min, vr->max); 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 else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment