From: marxin Date: Mon, 21 Mar 2016 10:27:53 +0000 (+0000) Subject: Retry to emit global variables in HSA (PR hsa/70234) X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=96b68b2d06eec4070737b5cd86d0947cf3a694cd;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234362 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2efe7ea31fa7..7a918672563a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-03-21 Martin Liska + + 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 PR tree-optimization/70288 diff --git a/gcc/hsa-brig.c b/gcc/hsa-brig.c index 2a301be81060..9b6c0b888e0e 100644 --- a/gcc/hsa-brig.c +++ b/gcc/hsa-brig.c @@ -643,6 +643,8 @@ emit_function_directives (hsa_function_representation *f, bool is_declaration) if (!f->m_declaration_p) 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); brig_insn_count++; } diff --git a/gcc/hsa-gen.c b/gcc/hsa-gen.c index 5939a577f3f4..72eecf9462e5 100644 --- a/gcc/hsa-gen.c +++ b/gcc/hsa-gen.c @@ -162,7 +162,7 @@ hsa_symbol::hsa_symbol () m_directive_offset (0), m_type (BRIG_TYPE_NONE), 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_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, m_directive_offset (0), m_type (type), m_segment (segment), m_linkage (linkage), m_dim (0), m_cst_value (NULL), 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) gcc_checking_assert (slot); if (*slot) { + hsa_symbol *sym = (*slot); + /* If the symbol is problematic, mark current function also as problematic. */ - if ((*slot)->m_seen_error) + if (sym->m_seen_error) 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; } else diff --git a/gcc/hsa.h b/gcc/hsa.h index 6a7c651ce9bc..1d6baaba9b51 100644 --- a/gcc/hsa.h +++ b/gcc/hsa.h @@ -110,6 +110,9 @@ struct hsa_symbol /* Symbol allocation. */ BrigAllocation m_allocation; + /* Flag used for global variables if a variable is already emitted or not. */ + bool m_emitted_to_brig; + private: /* Default constructor. */ hsa_symbol ();