OSDN Git Service

PR middle-end/53008
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 May 2012 17:14:25 +0000 (17:14 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 May 2012 17:14:25 +0000 (17:14 +0000)
        * trans-mem.c (ipa_tm_create_version_alias): Output new_node if
        accessed indirectly.
        (ipa_tm_create_version): Same.

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

gcc/ChangeLog
gcc/testsuite/gcc.dg/tm/pr53008.c [new file with mode: 0644]
gcc/trans-mem.c

index ce680f0..f8570fd 100644 (file)
@@ -1,3 +1,10 @@
+2012-05-25  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR middle-end/53008
+       * trans-mem.c (ipa_tm_create_version_alias): Output new_node if
+       accessed indirectly.
+       (ipa_tm_create_version): Same.
+
 2012-05-25  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/53474
diff --git a/gcc/testsuite/gcc.dg/tm/pr53008.c b/gcc/testsuite/gcc.dg/tm/pr53008.c
new file mode 100644 (file)
index 0000000..1374d76
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm -O" } */
+
+void __attribute__((transaction_safe)) (*fn)(void);
+
+static void __attribute__((transaction_safe))
+foo(void)
+{
+}
+
+void set_fn(void)
+{
+  fn = foo;
+}
index 8887b9a..aa4d7c0 100644 (file)
@@ -4328,7 +4328,8 @@ ipa_tm_create_version_alias (struct cgraph_node *node, void *data)
 
   record_tm_clone_pair (old_decl, new_decl);
 
-  if (info->old_node->symbol.force_output)
+  if (info->old_node->symbol.force_output
+      || ipa_ref_list_first_referring (&info->old_node->symbol.ref_list))
     ipa_tm_mark_force_output_node (new_node);
   return false;
 }
@@ -4381,7 +4382,8 @@ ipa_tm_create_version (struct cgraph_node *old_node)
   record_tm_clone_pair (old_decl, new_decl);
 
   cgraph_call_function_insertion_hooks (new_node);
-  if (old_node->symbol.force_output)
+  if (old_node->symbol.force_output
+      || ipa_ref_list_first_referring (&old_node->symbol.ref_list))
     ipa_tm_mark_force_output_node (new_node);
 
   /* Do the same thing, but for any aliases of the original node.  */