summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-21 10:27:53 +0000
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-21 10:27:53 +0000
commit96b68b2d06eec4070737b5cd86d0947cf3a694cd (patch)
tree62ac1ef2ac57152f7ea38a44ad87544d217af2ae
parent93505d2263b79f3e5967ae1fec082cf0843e610a (diff)
downloadgcc-96b68b2d06eec4070737b5cd86d0947cf3a694cd.tar.gz
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/hsa-brig.c2
-rw-r--r--gcc/hsa-gen.c23
-rw-r--r--gcc/hsa.h3
4 files changed, 34 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2efe7ea31fa..7a918672563 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+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>
PR tree-optimization/70288
diff --git a/gcc/hsa-brig.c b/gcc/hsa-brig.c
index 2a301be8106..9b6c0b888e0 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 5939a577f3f..72eecf9462e 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 6a7c651ce9b..1d6baaba9b5 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 ();