[10/14] Add call_summary::get method and m_initialize_when_cloning.

Message ID 449d18e11a2bbcdd47cf49436270dac431e90001.1526551813.git.mliska@suse.cz
State New
Headers show
Series
  • Finish transition of {symbol,call}_summary.
Related show

Commit Message

Martin Liška April 23, 2018, 7:30 a.m.
gcc/ChangeLog:

2018-04-24  Martin Liska  <mliska@suse.cz>

	* symbol-summary.h (get): New function.
	(call_summary::m_initialize_when_cloning): New class member.
---
 gcc/symbol-summary.h | 66 +++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 50 insertions(+), 16 deletions(-)

Comments

Jan Hubicka June 7, 2018, 12:21 p.m. | #1
> 

> gcc/ChangeLog:

> 

> 2018-04-24  Martin Liska  <mliska@suse.cz>

> 

> 	* symbol-summary.h (get): New function.

> 	(call_summary::m_initialize_when_cloning): New class member.

> ---

>  gcc/symbol-summary.h | 66 +++++++++++++++++++++++++++++++++++++++-------------

>  1 file changed, 50 insertions(+), 16 deletions(-)

> 


> 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 <T *>

>  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 <int, 0, -1> 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)

> @@ -438,6 +440,28 @@ private:

>        gt_pointer_operator, void *);

>  };

>  

> +template <typename T>

> +T*

> +call_summary<T *>::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;

> +    }

> +}


I bit fail to see why you commonize get/get_create when the common
path contains single gcc_checking_assert?

Honza
> +

>  template <typename T>

>  void

>  call_summary<T *>::release ()

> @@ -492,15 +516,25 @@ call_summary<T *>::symtab_duplication (cgraph_edge *edge1,

>  				       cgraph_edge *edge2, void *data)

>  {

>    call_summary *summary = (call_summary <T *> *) (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);

>      }

>  }

>

Patch

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 <T *>
 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 <int, 0, -1> 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)
@@ -438,6 +440,28 @@  private:
       gt_pointer_operator, void *);
 };
 
+template <typename T>
+T*
+call_summary<T *>::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 <typename T>
 void
 call_summary<T *>::release ()
@@ -492,15 +516,25 @@  call_summary<T *>::symtab_duplication (cgraph_edge *edge1,
 				       cgraph_edge *edge2, void *data)
 {
   call_summary *summary = (call_summary <T *> *) (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);
     }
 }