[hsa] Atomic assess memory model fixes

2016-01-29  Martin Jambor  <mjambor@suse.cz>

	* hsa-gen.c (get_memory_order_name): Mask with MEMMODEL_BASE_MASK.
	Use short lowercase names.
	(get_memory_order): Mask with MEMMODEL_BASE_MASK.  Support
	MEMMODEL_CONSUME with acquire semantics and MEMMODEL_SEQ_CST with
	acq_rel one.  Protect warning agains segfaults if
	get_memory_order_name returns NULL.
	(gen_hsa_ternary_atomic_for_builtin): Support with MEMMODEL_SEQ_CST
	with release semantics.  Do not warn if get_memory_order already did.
	(gen_hsa_insns_for_call): Support with MEMMODEL_SEQ_CST with acquire
	semantics.  Fix check for relaxed or acquire semantics.  Do not warn
	if get_memory_order already did.

From-SVN: r233000
This commit is contained in:
Martin Jambor 2016-01-29 23:53:28 +01:00 committed by Martin Jambor
parent 3a5d2ba4fc
commit fe621379bc
2 changed files with 54 additions and 19 deletions

View File

@ -1,3 +1,17 @@
2016-01-29 Martin Jambor <mjambor@suse.cz>
* hsa-gen.c (get_memory_order_name): Mask with MEMMODEL_BASE_MASK.
Use short lowercase names.
(get_memory_order): Mask with MEMMODEL_BASE_MASK. Support
MEMMODEL_CONSUME with acquire semantics and MEMMODEL_SEQ_CST with
acq_rel one. Protect warning agains segfaults if
get_memory_order_name returns NULL.
(gen_hsa_ternary_atomic_for_builtin): Support with MEMMODEL_SEQ_CST
with release semantics. Do not warn if get_memory_order already did.
(gen_hsa_insns_for_call): Support with MEMMODEL_SEQ_CST with acquire
semantics. Fix check for relaxed or acquire semantics. Do not warn
if get_memory_order already did.
2016-01-29 Sebastian Pop <s.pop@samsung.com>
* doc/install.texi: Document that isl-0.16 is supported.

View File

@ -4415,20 +4415,20 @@ get_address_from_value (tree val, hsa_bb *hbb)
static const char *
get_memory_order_name (unsigned memmodel)
{
switch (memmodel)
switch (memmodel & MEMMODEL_BASE_MASK)
{
case MEMMODEL_RELAXED:
return "__ATOMIC_RELAXED";
return "relaxed";
case MEMMODEL_CONSUME:
return "__ATOMIC_CONSUME";
return "consume";
case MEMMODEL_ACQUIRE:
return "__ATOMIC_ACQUIRE";
return "acquire";
case MEMMODEL_RELEASE:
return "__ATOMIC_RELEASE";
return "release";
case MEMMODEL_ACQ_REL:
return "__ATOMIC_ACQ_REL";
return "acq_rel";
case MEMMODEL_SEQ_CST:
return "__ATOMIC_SEQ_CST";
return "seq_cst";
default:
return NULL;
}
@ -4440,21 +4440,31 @@ get_memory_order_name (unsigned memmodel)
static BrigMemoryOrder
get_memory_order (unsigned memmodel, location_t location)
{
switch (memmodel)
switch (memmodel & MEMMODEL_BASE_MASK)
{
case MEMMODEL_RELAXED:
return BRIG_MEMORY_ORDER_RELAXED;
case MEMMODEL_CONSUME:
/* HSA does not have an equivalent, but we can use the slightly stronger
ACQUIRE. */
case MEMMODEL_ACQUIRE:
return BRIG_MEMORY_ORDER_SC_ACQUIRE;
case MEMMODEL_RELEASE:
return BRIG_MEMORY_ORDER_SC_RELEASE;
case MEMMODEL_ACQ_REL:
case MEMMODEL_SEQ_CST:
/* Callers implementing a simple load or store need to remove the release
or acquire part respectively. */
return BRIG_MEMORY_ORDER_SC_ACQUIRE_RELEASE;
default:
HSA_SORRY_ATV (location,
"support for HSA does not implement memory model: %s",
get_memory_order_name (memmodel));
return BRIG_MEMORY_ORDER_NONE;
{
const char *mmname = get_memory_order_name (memmodel);
HSA_SORRY_ATV (location,
"support for HSA does not implement the specified "
" memory model%s %s",
mmname ? ": " : "", mmname ? mmname : "");
return BRIG_MEMORY_ORDER_NONE;
}
}
}
@ -4523,13 +4533,20 @@ gen_hsa_ternary_atomic_for_builtin (bool ret_orig,
nops = 2;
}
if (acode == BRIG_ATOMIC_ST && memorder != BRIG_MEMORY_ORDER_RELAXED
&& memorder != BRIG_MEMORY_ORDER_SC_RELEASE)
if (acode == BRIG_ATOMIC_ST)
{
HSA_SORRY_ATV (gimple_location (stmt),
"support for HSA does not implement memory model for "
"ATOMIC_ST: %s", get_memory_order_name (mmodel));
return;
if (memorder == BRIG_MEMORY_ORDER_SC_ACQUIRE_RELEASE)
memorder = BRIG_MEMORY_ORDER_SC_RELEASE;
if (memorder != BRIG_MEMORY_ORDER_RELAXED
&& memorder != BRIG_MEMORY_ORDER_SC_RELEASE
&& memorder != BRIG_MEMORY_ORDER_NONE)
{
HSA_SORRY_ATV (gimple_location (stmt),
"support for HSA does not implement memory model for "
"ATOMIC_ST: %s", get_memory_order_name (mmodel));
return;
}
}
hsa_insn_atomic *atominsn = new hsa_insn_atomic (nops, opcode, acode, mtype,
@ -4872,8 +4889,12 @@ gen_hsa_insns_for_call (gimple *stmt, hsa_bb *hbb)
BrigMemoryOrder memorder = get_memory_order (mmodel,
gimple_location (stmt));
if (memorder == BRIG_MEMORY_ORDER_SC_ACQUIRE_RELEASE)
memorder = BRIG_MEMORY_ORDER_SC_ACQUIRE;
if (memorder != BRIG_MEMORY_ORDER_RELAXED
&& memorder != BRIG_MEMORY_ORDER_SC_RELEASE)
&& memorder != BRIG_MEMORY_ORDER_SC_ACQUIRE
&& memorder != BRIG_MEMORY_ORDER_NONE)
{
HSA_SORRY_ATV (gimple_location (stmt),
"support for HSA does not implement "