OSDN Git Service

2010-05-04 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 May 2010 13:12:02 +0000 (13:12 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 May 2010 13:12:02 +0000 (13:12 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159026 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr43879-1_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr43879-1_1.C [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index b8c4c18..c7d8620 100644 (file)
@@ -1,3 +1,12 @@
+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>
 
        * config/sh/sh.c (sh_small_register_classes_for_mode_p): Remove
index 4c7f13d..60ec841 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        PR c++/43953
diff --git a/gcc/testsuite/g++.dg/torture/pr43879-1_0.C b/gcc/testsuite/g++.dg/torture/pr43879-1_0.C
new file mode 100644 (file)
index 0000000..710f6ad
--- /dev/null
@@ -0,0 +1,11 @@
+struct A {
+    int *i;
+    A();
+    ~A();
+};
+
+static int x = 0;
+
+A::A() : i(&x) {}
+A::~A() {}
+
diff --git a/gcc/testsuite/g++.dg/torture/pr43879-1_1.C b/gcc/testsuite/g++.dg/torture/pr43879-1_1.C
new file mode 100644 (file)
index 0000000..0c94338
--- /dev/null
@@ -0,0 +1,48 @@
+/* { 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();
+}
+
index 89b5c9c..f688d9b 100644 (file)
@@ -2759,10 +2759,14 @@ lookup_vi_for_tree (tree t)
 static const char *
 alias_get_name (tree decl)
 {
-  const char *res = get_name (decl);
+  const char *res;
   char *temp;
   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)
     return res;
 
@@ -4956,7 +4960,7 @@ count_num_arguments (tree decl, bool *is_varargs)
 /* Creation function node for DECL, using NAME, and return the index
    of the variable we've created for the function.  */
 
-static unsigned int
+static varinfo_t
 create_function_info_for (tree decl, const char *name)
 {
   struct function *fn = DECL_STRUCT_FUNCTION (decl);
@@ -5129,7 +5133,7 @@ create_function_info_for (tree decl, const char *name)
       prev_vi = argvi;
     }
 
-  return vi->id;
+  return vi;
 }
 
 
@@ -6565,6 +6569,9 @@ ipa_pta_execute (void)
   /* Build the constraints.  */
   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
          visit clones at this point for now - we get duplicate decls
         there for inline clones at least.  */
@@ -6572,13 +6579,26 @@ ipa_pta_execute (void)
          || node->clone_of)
        continue;
 
-      create_function_info_for (node->decl,
-                               cgraph_node_name (node));
+      vi = create_function_info_for (node->decl,
+                                    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.  */
   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)
     {
@@ -6601,9 +6621,14 @@ ipa_pta_execute (void)
        continue;
 
       if (dump_file)
-       fprintf (dump_file,
-                "Generating constraints for %s\n",
-                cgraph_node_name (node));
+       {
+         fprintf (dump_file,
+                  "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);
       old_func_decl = current_function_decl;