re PR ipa/60912 (wrong code with -O -fno-inline -fipa-pta)

2014-04-25  Richard Biener  <rguenther@suse.de>

	PR ipa/60912
	* tree-ssa-structalias.c (ipa_pta_execute): Compute direct
	call stmt use/clobber sets during stmt walk instead of
	walking the possibly incomplete set of caller edges.

	* g++.dg/opt/pr60912.C: New testcase.

From-SVN: r209780
This commit is contained in:
Richard Biener 2014-04-25 07:47:22 +00:00 committed by Richard Biener
parent 78422fb13c
commit 92b3326b2f
4 changed files with 46 additions and 25 deletions

View file

@ -1,3 +1,10 @@
2014-04-25 Richard Biener <rguenther@suse.de>
PR ipa/60912
* tree-ssa-structalias.c (ipa_pta_execute): Compute direct
call stmt use/clobber sets during stmt walk instead of
walking the possibly incomplete set of caller edges.
2014-04-25 Richard Biener <rguenther@suse.de>
PR ipa/60911

View file

@ -1,3 +1,8 @@
2014-04-25 Richard Biener <rguenther@suse.de>
PR ipa/60912
* g++.dg/opt/pr60912.C: New testcase.
2014-04-25 Richard Biener <rguenther@suse.de>
PR ipa/60911

View file

@ -0,0 +1,18 @@
// { dg-do run }
// { dg-options "-O -fno-inline -fipa-pta" }
struct IFoo
{
virtual void Foo () = 0;
};
struct Bar:IFoo
{
void Foo () {}
};
int main ()
{
(new Bar ())->Foo ();
return 0;
}

View file

@ -7244,10 +7244,7 @@ ipa_pta_execute (void)
tree ptr;
struct function *fn;
unsigned i;
varinfo_t fi;
basic_block bb;
struct pt_solution uses, clobbers;
struct cgraph_edge *e;
/* Nodes without a body are not interesting. */
if (!cgraph_function_with_gimple_body_p (node) || node->clone_of)
@ -7263,21 +7260,6 @@ ipa_pta_execute (void)
find_what_p_points_to (ptr);
}
/* Compute the call-use and call-clobber sets for all direct calls. */
fi = lookup_vi_for_tree (node->decl);
gcc_assert (fi->is_fn_info);
clobbers
= find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers));
uses = find_what_var_points_to (first_vi_for_offset (fi, fi_uses));
for (e = node->callers; e; e = e->next_caller)
{
if (!e->call_stmt)
continue;
*gimple_call_clobber_set (e->call_stmt) = clobbers;
*gimple_call_use_set (e->call_stmt) = uses;
}
/* Compute the call-use and call-clobber sets for indirect calls
and calls to external functions. */
FOR_EACH_BB_FN (bb, fn)
@ -7288,17 +7270,27 @@ ipa_pta_execute (void)
{
gimple stmt = gsi_stmt (gsi);
struct pt_solution *pt;
varinfo_t vi;
varinfo_t vi, fi;
tree decl;
if (!is_gimple_call (stmt))
continue;
/* Handle direct calls to external functions. */
/* Handle direct calls to functions with body. */
decl = gimple_call_fndecl (stmt);
if (decl
&& (!(fi = lookup_vi_for_tree (decl))
|| !fi->is_fn_info))
&& (fi = lookup_vi_for_tree (decl))
&& fi->is_fn_info)
{
*gimple_call_clobber_set (stmt)
= find_what_var_points_to
(first_vi_for_offset (fi, fi_clobbers));
*gimple_call_use_set (stmt)
= find_what_var_points_to
(first_vi_for_offset (fi, fi_uses));
}
/* Handle direct calls to external functions. */
else if (decl)
{
pt = gimple_call_use_set (stmt);
if (gimple_call_flags (stmt) & ECF_CONST)
@ -7342,10 +7334,9 @@ ipa_pta_execute (void)
pt->nonlocal = 1;
}
}
/* Handle indirect calls. */
if (!decl
&& (fi = get_fi_for_callee (stmt)))
else if (!decl
&& (fi = get_fi_for_callee (stmt)))
{
/* We need to accumulate all clobbers/uses of all possible
callees. */