Commit 0148358a by Martin Liska Committed by Martin Liska

Add {symbol,call}_summary::get method and use it in HSA.

2018-06-08  Martin Liska  <mliska@suse.cz>

	* hsa-common.h (enum hsa_function_kind): Rename HSA_NONE to
	HSA_INVALID.
	(hsa_function_summary::hsa_function_summary): Use the new enum
	value.
	(hsa_gpu_implementation_p): Use hsa_summaries::get.
	* hsa-gen.c (hsa_get_host_function): Likewise.
	(get_brig_function_name): Likewise.
	* ipa-hsa.c (process_hsa_functions): Likewise.
	(ipa_hsa_write_summary): Likewise.
	* symbol-summary.h (symtab_duplication): Use ::get function/
	(get): New function.

From-SVN: r261310
parent 99353fcf
2018-06-08 Martin Liska <mliska@suse.cz> 2018-06-08 Martin Liska <mliska@suse.cz>
* hsa-common.h (enum hsa_function_kind): Rename HSA_NONE to
HSA_INVALID.
(hsa_function_summary::hsa_function_summary): Use the new enum
value.
(hsa_gpu_implementation_p): Use hsa_summaries::get.
* hsa-gen.c (hsa_get_host_function): Likewise.
(get_brig_function_name): Likewise.
* ipa-hsa.c (process_hsa_functions): Likewise.
(ipa_hsa_write_summary): Likewise.
* symbol-summary.h (symtab_duplication): Use ::get function/
(get): New function.
2018-06-08 Martin Liska <mliska@suse.cz>
* config/i386/i386.c (ix86_can_inline_p): Use get_create instead * config/i386/i386.c (ix86_can_inline_p): Use get_create instead
of get. of get.
* hsa-common.c (hsa_summary_t::link_functions): Likewise. * hsa-common.c (hsa_summary_t::link_functions): Likewise.
......
...@@ -1208,7 +1208,7 @@ public: ...@@ -1208,7 +1208,7 @@ public:
enum hsa_function_kind enum hsa_function_kind
{ {
HSA_NONE, HSA_INVALID,
HSA_KERNEL, HSA_KERNEL,
HSA_FUNCTION HSA_FUNCTION
}; };
...@@ -1234,7 +1234,7 @@ struct hsa_function_summary ...@@ -1234,7 +1234,7 @@ struct hsa_function_summary
}; };
inline inline
hsa_function_summary::hsa_function_summary (): m_kind (HSA_NONE), hsa_function_summary::hsa_function_summary (): m_kind (HSA_INVALID),
m_bound_function (NULL), m_gpu_implementation_p (false) m_bound_function (NULL), m_gpu_implementation_p (false)
{ {
} }
...@@ -1244,7 +1244,10 @@ class hsa_summary_t: public function_summary <hsa_function_summary *> ...@@ -1244,7 +1244,10 @@ class hsa_summary_t: public function_summary <hsa_function_summary *>
{ {
public: public:
hsa_summary_t (symbol_table *table): hsa_summary_t (symbol_table *table):
function_summary<hsa_function_summary *> (table) { } function_summary<hsa_function_summary *> (table)
{
disable_insertion_hook ();
}
/* Couple GPU and HOST as gpu-specific and host-specific implementation of /* Couple GPU and HOST as gpu-specific and host-specific implementation of
the same function. KIND determines whether GPU is a host-invokable kernel the same function. KIND determines whether GPU is a host-invokable kernel
...@@ -1407,10 +1410,8 @@ hsa_gpu_implementation_p (tree decl) ...@@ -1407,10 +1410,8 @@ hsa_gpu_implementation_p (tree decl)
if (hsa_summaries == NULL) if (hsa_summaries == NULL)
return false; return false;
hsa_function_summary *s hsa_function_summary *s = hsa_summaries->get (cgraph_node::get_create (decl));
= hsa_summaries->get_create (cgraph_node::get_create (decl)); return s != NULL && s->m_gpu_implementation_p;
return s->m_gpu_implementation_p;
} }
#endif /* HSA_H */ #endif /* HSA_H */
...@@ -961,9 +961,7 @@ get_symbol_for_decl (tree decl) ...@@ -961,9 +961,7 @@ get_symbol_for_decl (tree decl)
tree tree
hsa_get_host_function (tree decl) hsa_get_host_function (tree decl)
{ {
hsa_function_summary *s hsa_function_summary *s = hsa_summaries->get (cgraph_node::get_create (decl));
= hsa_summaries->get_create (cgraph_node::get_create (decl));
gcc_assert (s->m_kind != HSA_NONE);
gcc_assert (s->m_gpu_implementation_p); gcc_assert (s->m_gpu_implementation_p);
return s->m_bound_function ? s->m_bound_function->decl : NULL; return s->m_bound_function ? s->m_bound_function->decl : NULL;
...@@ -976,9 +974,8 @@ get_brig_function_name (tree decl) ...@@ -976,9 +974,8 @@ get_brig_function_name (tree decl)
{ {
tree d = decl; tree d = decl;
hsa_function_summary *s hsa_function_summary *s = hsa_summaries->get (cgraph_node::get_create (d));
= hsa_summaries->get_create (cgraph_node::get_create (d)); if (s != NULL
if (s->m_kind != HSA_NONE
&& s->m_gpu_implementation_p && s->m_gpu_implementation_p
&& s->m_bound_function) && s->m_bound_function)
d = s->m_bound_function->decl; d = s->m_bound_function->decl;
......
...@@ -76,13 +76,13 @@ process_hsa_functions (void) ...@@ -76,13 +76,13 @@ process_hsa_functions (void)
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
{ {
hsa_function_summary *s = hsa_summaries->get_create (node); hsa_function_summary *s = hsa_summaries->get (node);
/* A linked function is skipped. */ /* A linked function is skipped. */
if (s->m_bound_function != NULL) if (s != NULL && s->m_bound_function != NULL)
continue; continue;
if (s->m_kind != HSA_NONE) if (s != NULL)
{ {
if (!check_warn_node_versionable (node)) if (!check_warn_node_versionable (node))
continue; continue;
...@@ -130,11 +130,11 @@ process_hsa_functions (void) ...@@ -130,11 +130,11 @@ process_hsa_functions (void)
while (e) while (e)
{ {
hsa_function_summary *src = hsa_summaries->get_create (node); hsa_function_summary *src = hsa_summaries->get (node);
if (src->m_kind != HSA_NONE && src->m_gpu_implementation_p) if (src != NULL && src->m_gpu_implementation_p)
{ {
hsa_function_summary *dst = hsa_summaries->get_create (e->callee); hsa_function_summary *dst = hsa_summaries->get (e->callee);
if (dst->m_kind != HSA_NONE && !dst->m_gpu_implementation_p) if (dst != NULL && !dst->m_gpu_implementation_p)
{ {
e->redirect_callee (dst->m_bound_function); e->redirect_callee (dst->m_bound_function);
if (dump_file) if (dump_file)
...@@ -174,9 +174,9 @@ ipa_hsa_write_summary (void) ...@@ -174,9 +174,9 @@ ipa_hsa_write_summary (void)
lsei_next_function_in_partition (&lsei)) lsei_next_function_in_partition (&lsei))
{ {
node = lsei_cgraph_node (lsei); node = lsei_cgraph_node (lsei);
hsa_function_summary *s = hsa_summaries->get_create (node); hsa_function_summary *s = hsa_summaries->get (node);
if (s->m_kind != HSA_NONE) if (s != NULL)
count++; count++;
} }
...@@ -187,9 +187,9 @@ ipa_hsa_write_summary (void) ...@@ -187,9 +187,9 @@ ipa_hsa_write_summary (void)
lsei_next_function_in_partition (&lsei)) lsei_next_function_in_partition (&lsei))
{ {
node = lsei_cgraph_node (lsei); node = lsei_cgraph_node (lsei);
hsa_function_summary *s = hsa_summaries->get_create (node); hsa_function_summary *s = hsa_summaries->get (node);
if (s->m_kind != HSA_NONE) if (s != NULL)
{ {
encoder = ob->decl_state->symtab_node_encoder; encoder = ob->decl_state->symtab_node_encoder;
int node_ref = lto_symtab_encoder_encode (encoder, node); int node_ref = lto_symtab_encoder_encode (encoder, node);
......
...@@ -90,8 +90,13 @@ public: ...@@ -90,8 +90,13 @@ public:
does not exist it will be created. */ does not exist it will be created. */
T* get_create (cgraph_node *node) T* get_create (cgraph_node *node)
{ {
gcc_checking_assert (node->summary_uid); return get (node->summary_uid, true);
return get_create (node->summary_uid); }
/* Getter for summary callgraph node pointer. */
T* get (cgraph_node *node)
{
return get (node->summary_uid, false);
} }
/* Return number of elements handled by data structure. */ /* Return number of elements handled by data structure. */
...@@ -136,7 +141,7 @@ private: ...@@ -136,7 +141,7 @@ private:
typedef int_hash <int, 0, -1> map_hash; typedef int_hash <int, 0, -1> map_hash;
/* Getter for summary callgraph ID. */ /* Getter for summary callgraph ID. */
T* get_create (int uid); T *get (int uid, bool lazy_insert);
/* Indicates if insertion hook is enabled. */ /* Indicates if insertion hook is enabled. */
bool m_insertion_enabled; bool m_insertion_enabled;
...@@ -245,30 +250,37 @@ function_summary<T *>::symtab_duplication (cgraph_node *node, ...@@ -245,30 +250,37 @@ function_summary<T *>::symtab_duplication (cgraph_node *node,
cgraph_node *node2, void *data) cgraph_node *node2, void *data)
{ {
function_summary *summary = (function_summary <T *> *) (data); function_summary *summary = (function_summary <T *> *) (data);
T **v = summary->m_map.get (node->summary_uid); T *v = summary->get (node);
gcc_checking_assert (node2->summary_uid > 0);
if (v) if (v)
{ {
/* This load is necessary, because we insert a new value! */ /* This load is necessary, because we insert a new value! */
T *data = *v;
T *duplicate = summary->allocate_new (); T *duplicate = summary->allocate_new ();
summary->m_map.put (node2->summary_uid, duplicate); summary->m_map.put (node2->summary_uid, duplicate);
summary->duplicate (node, node2, data, duplicate); summary->duplicate (node, node2, v, duplicate);
} }
} }
template <typename T> template <typename T>
T* T*
function_summary<T *>::get_create (int uid) function_summary<T *>::get (int uid, bool lazy_insert)
{ {
bool existed; gcc_checking_assert (uid > 0);
T **v = &m_map.get_or_insert (uid, &existed);
if (!existed)
*v = allocate_new ();
return *v; 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> template <typename T>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment