Patchwork [trans-mem,3/3] Allow for the original of a tm_clone pair to be optimized away.

login
register
mail settings
Submitter Richard Henderson
Date Oct. 28, 2011, 11:30 p.m.
Message ID <1319844656-1558-3-git-send-email-rth@redhat.com>
Download mbox | patch
Permalink /patch/122515/
State New
Headers show

Comments

Richard Henderson - Oct. 28, 2011, 11:30 p.m.
* trans-mem.c (finish_tm_clone_pairs_1): Never create cgraph_nodes
        here; allow them to vanish out from under.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/transactional-memory@180637 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog.tm |    3 +++
 gcc/varasm.c     |    6 +++---
 2 files changed, 6 insertions(+), 3 deletions(-)

Patch

diff --git a/gcc/ChangeLog.tm b/gcc/ChangeLog.tm
index dfdf9ee..49ad060 100644
--- a/gcc/ChangeLog.tm
+++ b/gcc/ChangeLog.tm
@@ -1,5 +1,8 @@ 
 2011-10-28  Richard Henderson  <rth@redhat.com>
 
+	* trans-mem.c (finish_tm_clone_pairs_1): Never create cgraph_nodes
+	here; allow them to vanish out from under.
+
 	* trans-mem.c (ipa_tm_mayenterirr_function): Recurse for aliases.
 	(ipa_tm_mark_needed_node): Split out of callback_mark_needed.
 	(ipa_tm_create_version_alias): Rename from callback_mark_needed.
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 65bef8a..9771c80 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -5910,7 +5910,7 @@  finish_tm_clone_pairs_1 (void **slot, void *info ATTRIBUTE_UNUSED)
   tree src = map->base.from;
   tree dst = map->to;
   struct cgraph_node *src_n = cgraph_get_node (src);
-  struct cgraph_node *dst_n = cgraph_get_create_node (dst);
+  struct cgraph_node *dst_n = cgraph_get_node (dst);
 
   /* The function ipa_tm_create_version() marks the clone as needed if
      the original function was needed.  But we also mark the clone as
@@ -5918,12 +5918,12 @@  finish_tm_clone_pairs_1 (void **slot, void *info ATTRIBUTE_UNUSED)
      TM_GETTMCLONE.  If neither of these are true, we didn't generate
      a clone, and we didn't call it indirectly... no sense keeping it
      in the clone table.  */
-  if (!dst_n->needed)
+  if (!dst_n || !dst_n->needed)
     return 1;
 
   /* This covers the case where we have optimized the original
      function away, and only access the transactional clone.  */
-  if (!src_n->needed)
+  if (!src_n || !src_n->needed)
     return 1;
 
   if (!*switched)