Hi,

the HSA does not allow atomic instructions operating on the private
segment because they are quite pointless.  In the long term, we should
put addressable local variables in the global memory somewhere (I'm
going to look at the nvidia stack effort soon).  But for now we need
to fail in the compiler, because otherwise there is testcase in the
libgomp testsuite that complains about the finalizer errors in the
output of the execute test.  Bootstrapped and tested, I'll commit it
to trunk shortly.

Thanks,

Martin

2016-02-17  Martin Jambor  <mjam...@suse.cz>

        * hsa-gen.c (gen_hsa_ternary_atomic_for_builtin): Fail in presence of
        atomic operations in private segment.
---
 gcc/hsa-gen.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/gcc/hsa-gen.c b/gcc/hsa-gen.c
index 28e8b6f..717e755 100644
--- a/gcc/hsa-gen.c
+++ b/gcc/hsa-gen.c
@@ -4557,8 +4557,13 @@ gen_hsa_ternary_atomic_for_builtin (bool ret_orig,
 
   hsa_op_address *addr;
   addr = get_address_from_value (gimple_call_arg (stmt, 0), hbb);
-  /* TODO: Warn if addr has private segment, because the finalizer will not
-     accept that (and it does not make much sense).  */
+  if (addr->m_symbol && addr->m_symbol->m_segment == BRIG_SEGMENT_PRIVATE)
+    {
+      HSA_SORRY_AT (gimple_location (stmt),
+                   "HSA does not implement atomic operations in private "
+                   "segment");
+      return;
+    }
   hsa_op_base *op = hsa_reg_or_immed_for_gimple_op (gimple_call_arg (stmt, 1),
                                                    hbb);
 
-- 
2.7.1

Reply via email to