From 2d5543ef7a4cd976b8ed5229e1901a441b016609 Mon Sep 17 00:00:00 2001 From: marxin Date: Fri, 8 Jun 2018 12:28:20 +0000 Subject: [PATCH] Add call_summary::get method and m_initialize_when_cloning. 2018-06-08 Martin Liska * symbol-summary.h (get): New function. (call_summary::m_initialize_when_cloning): New class member. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@261316 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 ++++ gcc/symbol-summary.h | 66 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b6c6a6acdd5..70c9a1115d5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2018-06-08 Martin Liska + * symbol-summary.h (get): New function. + (call_summary::m_initialize_when_cloning): New class member. + +2018-06-08 Martin Liska + * cgraph.c (cgraph_node::remove): Do not recycle uid. * cgraph.h (symbol_table::release_symbol): Do not pass uid. (symbol_table::allocate_cgraph_symbol): Do not set uid. diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h index dda3ae5718f..4896c97a1cd 100644 --- a/gcc/symbol-summary.h +++ b/gcc/symbol-summary.h @@ -326,7 +326,8 @@ class GTY((user)) call_summary public: /* Default construction takes SYMTAB as an argument. */ call_summary (symbol_table *symtab, bool ggc = false): m_ggc (ggc), - m_map (13, ggc), m_released (false), m_symtab (symtab) + m_initialize_when_cloning (false), m_map (13, ggc), m_released (false), + m_symtab (symtab) { m_symtab_removal_hook = symtab->add_edge_removal_hook @@ -374,7 +375,13 @@ public: If a summary for an edge does not exist, it will be created. */ T* get_create (cgraph_edge *edge) { - return get_create (hashable_uid (edge)); + return get (hashable_uid (edge), true); + } + + /* Getter for summary callgraph edge pointer. */ + T* get (cgraph_edge *edge) + { + return get (hashable_uid (edge), false); } /* Return number of elements handled by data structure. */ @@ -400,19 +407,14 @@ protected: /* Indication if we use ggc summary. */ bool m_ggc; + /* Initialize summary for an edge that is cloned. */ + bool m_initialize_when_cloning; + private: typedef int_hash map_hash; /* Getter for summary callgraph ID. */ - T* get_create (int uid) - { - bool existed; - T **v = &m_map.get_or_insert (uid, &existed); - if (!existed) - *v = allocate_new (); - - return *v; - } + T *get (int uid, bool lazy_insert); /* Get a hashable uid of EDGE. */ int hashable_uid (cgraph_edge *edge) @@ -439,6 +441,28 @@ private: }; template +T* +call_summary::get (int uid, bool lazy_insert) +{ + gcc_checking_assert (uid > 0); + + if (lazy_insert) + { + bool existed; + T **v = &m_map.get_or_insert (uid, &existed); + if (!existed) + *v = allocate_new (); + + return *v; + } + else + { + T **v = m_map.get (uid); + return v == NULL ? NULL : *v; + } +} + +template void call_summary::release () { @@ -492,15 +516,25 @@ call_summary::symtab_duplication (cgraph_edge *edge1, cgraph_edge *edge2, void *data) { call_summary *summary = (call_summary *) (data); - T **v = summary->m_map.get (summary->hashable_uid (edge1)); + T *edge1_summary = NULL; - if (v) + if (summary->m_initialize_when_cloning) + edge1_summary = summary->get_create (edge1); + else + { + T **v = summary->m_map.get (summary->hashable_uid (edge1)); + if (v) + { + /* This load is necessary, because we insert a new value! */ + edge1_summary = *v; + } + } + + if (edge1_summary) { - /* This load is necessary, because we insert a new value! */ - T *data = *v; T *duplicate = summary->allocate_new (); summary->m_map.put (summary->hashable_uid (edge2), duplicate); - summary->duplicate (edge1, edge2, data, duplicate); + summary->duplicate (edge1, edge2, edge1_summary, duplicate); } } -- 2.11.4.GIT