Commit c1db25ac by Martin Liska Committed by Martin Liska

Retry to emit global variables in HSA (PR hsa/70234)

	PR hsa/70234
	* hsa-brig.c (emit_function_directives): Mark unemitted
	global variables for emission.
	* hsa-gen.c (hsa_symbol::hsa_symbol): Initialize a new flag.
	(get_symbol_for_decl): Likewise.
	* hsa.h (struct hsa_symbol): New flag.

From-SVN: r234362
parent 56bbfaf6
2016-03-21 Martin Liska <mliska@suse.cz>
PR hsa/70234
* hsa-brig.c (emit_function_directives): Mark unemitted
global variables for emission.
* hsa-gen.c (hsa_symbol::hsa_symbol): Initialize a new flag.
(get_symbol_for_decl): Likewise.
* hsa.h (struct hsa_symbol): New flag.
2016-03-21 Richard Biener <rguenther@suse.de> 2016-03-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/70288 PR tree-optimization/70288
......
...@@ -643,6 +643,8 @@ emit_function_directives (hsa_function_representation *f, bool is_declaration) ...@@ -643,6 +643,8 @@ emit_function_directives (hsa_function_representation *f, bool is_declaration)
if (!f->m_declaration_p) if (!f->m_declaration_p)
for (int i = 0; f->m_global_symbols.iterate (i, &sym); i++) for (int i = 0; f->m_global_symbols.iterate (i, &sym); i++)
{ {
gcc_assert (!sym->m_emitted_to_brig);
sym->m_emitted_to_brig = true;
emit_directive_variable (sym); emit_directive_variable (sym);
brig_insn_count++; brig_insn_count++;
} }
......
...@@ -162,7 +162,7 @@ hsa_symbol::hsa_symbol () ...@@ -162,7 +162,7 @@ hsa_symbol::hsa_symbol ()
m_directive_offset (0), m_type (BRIG_TYPE_NONE), m_directive_offset (0), m_type (BRIG_TYPE_NONE),
m_segment (BRIG_SEGMENT_NONE), m_linkage (BRIG_LINKAGE_NONE), m_dim (0), m_segment (BRIG_SEGMENT_NONE), m_linkage (BRIG_LINKAGE_NONE), m_dim (0),
m_cst_value (NULL), m_global_scope_p (false), m_seen_error (false), m_cst_value (NULL), m_global_scope_p (false), m_seen_error (false),
m_allocation (BRIG_ALLOCATION_AUTOMATIC) m_allocation (BRIG_ALLOCATION_AUTOMATIC), m_emitted_to_brig (false)
{ {
} }
...@@ -174,7 +174,7 @@ hsa_symbol::hsa_symbol (BrigType16_t type, BrigSegment8_t segment, ...@@ -174,7 +174,7 @@ hsa_symbol::hsa_symbol (BrigType16_t type, BrigSegment8_t segment,
m_directive_offset (0), m_type (type), m_segment (segment), m_directive_offset (0), m_type (type), m_segment (segment),
m_linkage (linkage), m_dim (0), m_cst_value (NULL), m_linkage (linkage), m_dim (0), m_cst_value (NULL),
m_global_scope_p (global_scope_p), m_seen_error (false), m_global_scope_p (global_scope_p), m_seen_error (false),
m_allocation (allocation) m_allocation (allocation), m_emitted_to_brig (false)
{ {
} }
...@@ -880,11 +880,28 @@ get_symbol_for_decl (tree decl) ...@@ -880,11 +880,28 @@ get_symbol_for_decl (tree decl)
gcc_checking_assert (slot); gcc_checking_assert (slot);
if (*slot) if (*slot)
{ {
hsa_symbol *sym = (*slot);
/* If the symbol is problematic, mark current function also as /* If the symbol is problematic, mark current function also as
problematic. */ problematic. */
if ((*slot)->m_seen_error) if (sym->m_seen_error)
hsa_fail_cfun (); hsa_fail_cfun ();
/* PR hsa/70234: If a global variable was marked to be emitted,
but HSAIL generation of a function using the variable fails,
we should retry to emit the variable in context of a different
function.
Iterate elements whether a symbol is already in m_global_symbols
of not. */
if (is_in_global_vars && !sym->m_emitted_to_brig)
{
for (unsigned i = 0; i < hsa_cfun->m_global_symbols.length (); i++)
if (hsa_cfun->m_global_symbols[i] == sym)
return *slot;
hsa_cfun->m_global_symbols.safe_push (sym);
}
return *slot; return *slot;
} }
else else
......
...@@ -110,6 +110,9 @@ struct hsa_symbol ...@@ -110,6 +110,9 @@ struct hsa_symbol
/* Symbol allocation. */ /* Symbol allocation. */
BrigAllocation m_allocation; BrigAllocation m_allocation;
/* Flag used for global variables if a variable is already emitted or not. */
bool m_emitted_to_brig;
private: private:
/* Default constructor. */ /* Default constructor. */
hsa_symbol (); hsa_symbol ();
......
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