Commit 27c2cfa6 by Richard Guenther Committed by Richard Biener

re PR tree-optimization/43879 (-fipa-pta causes various miscompilations)

2010-05-04  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/43879
	* tree-ssa-structalias.c (alias_get_name): Use
	DECL_ASSEMBLER_NAME if available.
	(create_function_info_for): Return the varinfo node.
	(ipa_pta_execute): Associate same-body aliases and extra names
	with their origin nodes varinfo.  Dump DECL_ASSEMBLER_NAME.

	* g++.dg/torture/pr43879-1_0.C: New testcase.
	* g++.dg/torture/pr43879-1_1.C: Likewise.

From-SVN: r159026
parent 9c265c4d
2010-05-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43879
* tree-ssa-structalias.c (alias_get_name): Use
DECL_ASSEMBLER_NAME if available.
(create_function_info_for): Return the varinfo node.
(ipa_pta_execute): Associate same-body aliases and extra names
with their origin nodes varinfo. Dump DECL_ASSEMBLER_NAME.
2010-05-04 Kaz Kojima <kkojima@gcc.gnu.org> 2010-05-04 Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/sh.c (sh_small_register_classes_for_mode_p): Remove * config/sh/sh.c (sh_small_register_classes_for_mode_p): Remove
......
2010-05-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43879
* g++.dg/torture/pr43879-1_0.C: New testcase.
* g++.dg/torture/pr43879-1_1.C: Likewise.
2010-05-03 Dodji Seketeli <dodji@redhat.com> 2010-05-03 Dodji Seketeli <dodji@redhat.com>
PR c++/43953 PR c++/43953
......
struct A {
int *i;
A();
~A();
};
static int x = 0;
A::A() : i(&x) {}
A::~A() {}
/* { dg-do run } */
/* { dg-options "-fipa-pta" } */
/* { dg-additional-sources "pr43879-1_0.C" } */
struct A {
int *i;
A();
~A();
};
static inline int
aa(int *a, int *b)
{
(void)b;
return *a;
}
struct B {
B() : i(0) {}
int i;
B(const A &a) : i(0)
{
f(*a.i);
}
void __attribute__((noinline, noclone))
f(int j)
{
aa(&i, &j);
i = 1;
}
};
int
test()
{
B b1;
B b2 = B(A());
b1 = B(A());
if (b1.i != b2.i) __builtin_abort();
return 0;
}
int
main()
{
return test();
}
...@@ -2759,10 +2759,14 @@ lookup_vi_for_tree (tree t) ...@@ -2759,10 +2759,14 @@ lookup_vi_for_tree (tree t)
static const char * static const char *
alias_get_name (tree decl) alias_get_name (tree decl)
{ {
const char *res = get_name (decl); const char *res;
char *temp; char *temp;
int num_printed = 0; int num_printed = 0;
if (DECL_ASSEMBLER_NAME_SET_P (decl))
res = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
else
res= get_name (decl);
if (res != NULL) if (res != NULL)
return res; return res;
...@@ -4956,7 +4960,7 @@ count_num_arguments (tree decl, bool *is_varargs) ...@@ -4956,7 +4960,7 @@ count_num_arguments (tree decl, bool *is_varargs)
/* Creation function node for DECL, using NAME, and return the index /* Creation function node for DECL, using NAME, and return the index
of the variable we've created for the function. */ of the variable we've created for the function. */
static unsigned int static varinfo_t
create_function_info_for (tree decl, const char *name) create_function_info_for (tree decl, const char *name)
{ {
struct function *fn = DECL_STRUCT_FUNCTION (decl); struct function *fn = DECL_STRUCT_FUNCTION (decl);
...@@ -5129,7 +5133,7 @@ create_function_info_for (tree decl, const char *name) ...@@ -5129,7 +5133,7 @@ create_function_info_for (tree decl, const char *name)
prev_vi = argvi; prev_vi = argvi;
} }
return vi->id; return vi;
} }
...@@ -6565,6 +6569,9 @@ ipa_pta_execute (void) ...@@ -6565,6 +6569,9 @@ ipa_pta_execute (void)
/* Build the constraints. */ /* Build the constraints. */
for (node = cgraph_nodes; node; node = node->next) for (node = cgraph_nodes; node; node = node->next)
{ {
struct cgraph_node *alias;
varinfo_t vi;
/* Nodes without a body are not interesting. Especially do not /* Nodes without a body are not interesting. Especially do not
visit clones at this point for now - we get duplicate decls visit clones at this point for now - we get duplicate decls
there for inline clones at least. */ there for inline clones at least. */
...@@ -6572,13 +6579,26 @@ ipa_pta_execute (void) ...@@ -6572,13 +6579,26 @@ ipa_pta_execute (void)
|| node->clone_of) || node->clone_of)
continue; continue;
create_function_info_for (node->decl, vi = create_function_info_for (node->decl,
cgraph_node_name (node)); alias_get_name (node->decl));
/* Associate the varinfo node with all aliases. */
for (alias = node->same_body; alias; alias = alias->next)
insert_vi_for_tree (alias->decl, vi);
} }
/* Create constraints for global variables and their initializers. */ /* Create constraints for global variables and their initializers. */
for (var = varpool_nodes; var; var = var->next) for (var = varpool_nodes; var; var = var->next)
get_vi_for_tree (var->decl); {
struct varpool_node *alias;
varinfo_t vi;
vi = get_vi_for_tree (var->decl);
/* Associate the varinfo node with all aliases. */
for (alias = var->extra_name; alias; alias = alias->next)
insert_vi_for_tree (alias->decl, vi);
}
if (dump_file) if (dump_file)
{ {
...@@ -6601,9 +6621,14 @@ ipa_pta_execute (void) ...@@ -6601,9 +6621,14 @@ ipa_pta_execute (void)
continue; continue;
if (dump_file) if (dump_file)
fprintf (dump_file, {
"Generating constraints for %s\n", fprintf (dump_file,
cgraph_node_name (node)); "Generating constraints for %s", cgraph_node_name (node));
if (DECL_ASSEMBLER_NAME_SET_P (node->decl))
fprintf (dump_file, " (%s)",
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl)));
fprintf (dump_file, "\n");
}
func = DECL_STRUCT_FUNCTION (node->decl); func = DECL_STRUCT_FUNCTION (node->decl);
old_func_decl = current_function_decl; old_func_decl = current_function_decl;
......
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