Commit b7091901 by Richard Guenther Committed by Richard Biener

re PR tree-optimization/36400 (points-to results wrong)

2008-06-27  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/36400
	PR tree-optimization/36373
	PR tree-optimization/36344
	* tree-ssa-structalias.c (var_escaped, escaped_tree, escaped_id,
	var_nonlocal, nonlocal_tree, nonlocal_id): New globals
	(update_alias_info): Remove call clobbering code.
	(make_constraint_to): New helper function.
	(make_escape_constraint): Likewise.
	(handle_rhs_call): Use it on all pointer containing arguments.
	Also mark the static chain escaped.
	(handle_lhs_call): Make constraints from NONLOCAL and ESCAPED
	instead of ANYTHING.
	(make_constraint_from): New helper split out from ...
	(make_constraint_from_anything): ... here.
	(find_func_aliases): Add constraints for escape sites.
	(intra_create_variable_infos): Make constraints from NONLOCAL
	for parameters.
	(find_what_p_points_to): Interpret NONLOCAL and ESCAPED the same
	as ANYTHING.
	(clobber_what_p_points_to): Remove.
	(clobber_what_escaped): New function.
	(init_base_vars): Init NONLOCAL and ESCAPED.
	(do_sd_constraint): Do not propagate the solution from ESCAPED
	but use ESCAPED as a placeholder.
	(solve_graph): Likewise.
	* tree-flow.h (clobber_what_p_points_to): Remove.
	(clobber_what_escaped): Declare.
	* tree-ssa-alias.c (set_initial_properties): Call it.
	Remove code clobbering escaped pointers.

	* gcc.dg/torture/pr36373-1.c: New testcase.
	* gcc.dg/torture/pr36373-2.c: Likewise.
	* gcc.dg/torture/pr36373-3.c: Likewise.
	* gcc.dg/torture/pr36373-4.c: Likewise.
	* gcc.dg/torture/pr36373-5.c: Likewise.
	* gcc.dg/torture/pr36373-6.c: Likewise.
	* gcc.dg/torture/pr36373-7.c: Likewise.
	* gcc.dg/torture/pr36373-8.c: Likewise.
	* gcc.dg/torture/pr36373-9.c: Likewise.
	* gcc.dg/torture/pr36373-10.c: Likewise.
	* gcc.dg/torture/pr36400.c: Likewise.
	* gcc.c-torture/execute/pta-field-1.c: Likewise.
	* gcc.c-torture/execute/pta-field-2.c: Likewise.
	* gcc.dg/tree-ssa/loadpre8.c: Remove XFAIL.
	* gcc.dg/tree-ssa/pr24287.c: XFAIL.

From-SVN: r137197
parent 04dbd891
2008-06-27 Richard Guenther <rguenther@suse.de>
PR tree-optimization/36400
PR tree-optimization/36373
PR tree-optimization/36344
* tree-ssa-structalias.c (var_escaped, escaped_tree, escaped_id,
var_nonlocal, nonlocal_tree, nonlocal_id): New globals
(update_alias_info): Remove call clobbering code.
(make_constraint_to): New helper function.
(make_escape_constraint): Likewise.
(handle_rhs_call): Use it on all pointer containing arguments.
Also mark the static chain escaped.
(handle_lhs_call): Make constraints from NONLOCAL and ESCAPED
instead of ANYTHING.
(make_constraint_from): New helper split out from ...
(make_constraint_from_anything): ... here.
(find_func_aliases): Add constraints for escape sites.
(intra_create_variable_infos): Make constraints from NONLOCAL
for parameters.
(find_what_p_points_to): Interpret NONLOCAL and ESCAPED the same
as ANYTHING.
(clobber_what_p_points_to): Remove.
(clobber_what_escaped): New function.
(init_base_vars): Init NONLOCAL and ESCAPED.
(do_sd_constraint): Do not propagate the solution from ESCAPED
but use ESCAPED as a placeholder.
(solve_graph): Likewise.
* tree-flow.h (clobber_what_p_points_to): Remove.
(clobber_what_escaped): Declare.
* tree-ssa-alias.c (set_initial_properties): Call it.
Remove code clobbering escaped pointers.
2008-06-27 Richard Sandiford <rdsandiford@googlemail.com> 2008-06-27 Richard Sandiford <rdsandiford@googlemail.com>
* function.c (allocate_struct_function): Only allocate a unique * function.c (allocate_struct_function): Only allocate a unique
......
2008-06-27 Richard Guenther <rguenther@suse.de>
PR tree-optimization/36400
PR tree-optimization/36373
PR tree-optimization/36344
* gcc.dg/torture/pr36373-1.c: New testcase.
* gcc.dg/torture/pr36373-2.c: Likewise.
* gcc.dg/torture/pr36373-3.c: Likewise.
* gcc.dg/torture/pr36373-4.c: Likewise.
* gcc.dg/torture/pr36373-5.c: Likewise.
* gcc.dg/torture/pr36373-6.c: Likewise.
* gcc.dg/torture/pr36373-7.c: Likewise.
* gcc.dg/torture/pr36373-8.c: Likewise.
* gcc.dg/torture/pr36373-9.c: Likewise.
* gcc.dg/torture/pr36373-10.c: Likewise.
* gcc.dg/torture/pr36400.c: Likewise.
* gcc.c-torture/execute/pta-field-1.c: Likewise.
* gcc.c-torture/execute/pta-field-2.c: Likewise.
* gcc.dg/tree-ssa/loadpre8.c: Remove XFAIL.
* gcc.dg/tree-ssa/pr24287.c: XFAIL.
2008-06-27 Eric Botcazou <ebotcazou@adacore.com> 2008-06-27 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/aggr9.ad[sb]: New test. * gnat.dg/aggr9.ad[sb]: New test.
......
...@@ -93,5 +93,5 @@ rewrite_add_phi_arguments (basic_block bb) ...@@ -93,5 +93,5 @@ rewrite_add_phi_arguments (basic_block bb)
get_reaching_def ((get_def_from_ptr (get_phi_result_ptr (phi)))->ssa_name.var); get_reaching_def ((get_def_from_ptr (get_phi_result_ptr (phi)))->ssa_name.var);
} }
} }
/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre" } } */
/* { dg-final { cleanup-tree-dump "pre" } } */ /* { dg-final { cleanup-tree-dump "pre" } } */
...@@ -21,5 +21,5 @@ int g(void) ...@@ -21,5 +21,5 @@ int g(void)
link_error (); link_error ();
return t2 == 2; return t2 == 2;
} }
/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */ /* { dg-final { scan-tree-dump-times "link_error" 0 "optimized" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */
...@@ -1173,7 +1173,7 @@ tree gimple_fold_indirect_ref (tree); ...@@ -1173,7 +1173,7 @@ tree gimple_fold_indirect_ref (tree);
/* In tree-ssa-structalias.c */ /* In tree-ssa-structalias.c */
bool find_what_p_points_to (tree); bool find_what_p_points_to (tree);
bool clobber_what_p_points_to (tree); bool clobber_what_escaped (void);
/* In tree-ssa-live.c */ /* In tree-ssa-live.c */
extern void remove_unused_locals (void); extern void remove_unused_locals (void);
......
...@@ -537,6 +537,12 @@ set_initial_properties (struct alias_info *ai) ...@@ -537,6 +537,12 @@ set_initial_properties (struct alias_info *ai)
} }
} }
if (!clobber_what_escaped ())
{
any_pt_anything = true;
pt_anything_mask |= ESCAPE_TO_CALL;
}
for (i = 0; VEC_iterate (tree, ai->processed_ptrs, i, ptr); i++) for (i = 0; VEC_iterate (tree, ai->processed_ptrs, i, ptr); i++)
{ {
struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr); struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
...@@ -557,18 +563,6 @@ set_initial_properties (struct alias_info *ai) ...@@ -557,18 +563,6 @@ set_initial_properties (struct alias_info *ai)
if (tag) if (tag)
mark_call_clobbered (tag, pi->escape_mask); mark_call_clobbered (tag, pi->escape_mask);
/* Defer to points-to analysis if possible, otherwise
clobber all addressable variables. Parameters cannot
point to local memory though.
??? Properly tracking which pointers point to non-local
memory only would make a big difference here. */
if (!clobber_what_p_points_to (ptr)
&& !(pi->escape_mask & ESCAPE_IS_PARM))
{
any_pt_anything = true;
pt_anything_mask |= pi->escape_mask;
}
} }
/* If the name tag is call clobbered, so is the symbol tag /* If the name tag is call clobbered, so is the symbol tag
...@@ -2906,6 +2900,12 @@ is_escape_site (tree stmt) ...@@ -2906,6 +2900,12 @@ is_escape_site (tree stmt)
if (TREE_CODE (lhs) == SSA_NAME) if (TREE_CODE (lhs) == SSA_NAME)
return NO_ESCAPE; return NO_ESCAPE;
/* If the LHS is a non-global decl, it isn't a non-local memory store.
If the LHS escapes, the RHS escape is dealt with in the PTA solver. */
if (DECL_P (lhs)
&& !is_global_var (lhs))
return NO_ESCAPE;
/* FIXME: LHS is not an SSA_NAME. Even if it's an assignment to a /* FIXME: LHS is not an SSA_NAME. Even if it's an assignment to a
local variables we cannot be sure if it will escape, because we local variables we cannot be sure if it will escape, because we
don't have information about objects not in SSA form. Need to don't have information about objects not in SSA form. Need to
......
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