diff options
author | Tom de Vries <tdevries@suse.de> | 2022-03-07 14:23:03 +0100 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2022-03-10 12:19:47 +0100 |
commit | 3ebcc053a4bd32973762b671b444730baf558805 (patch) | |
tree | 1705486c2f180351e33c058f0e8f7730fc24decd /gcc/config | |
parent | 248bbcb2c3212bcb9f2a485b591dd37371133402 (diff) | |
download | gcc-3ebcc053a4bd32973762b671b444730baf558805.zip gcc-3ebcc053a4bd32973762b671b444730baf558805.tar.gz gcc-3ebcc053a4bd32973762b671b444730baf558805.tar.bz2 |
[nvptx] Use bit-bucket operand for atom insns
For an atomic fetch operation that doesn't use the result:
...
__atomic_fetch_add (p64, v64, MEMMODEL_RELAXED);
...
we currently emit:
...
atom.add.u64 %r26, [%r25], %r27;
...
Detect the REG_UNUSED reg-note for %r26, and emit instead:
...
atom.add.u64 _, [%r25], %r27;
...
Likewise for all atom insns.
Tested on nvptx.
gcc/ChangeLog:
2022-03-07 Tom de Vries <tdevries@suse.de>
PR target/104815
* config/nvptx/nvptx.cc (nvptx_print_operand): Handle 'x' operand
modifier.
* config/nvptx/nvptx.md: Use %x0 destination operand in atom insns.
gcc/testsuite/ChangeLog:
2022-03-07 Tom de Vries <tdevries@suse.de>
PR target/104815
* gcc.target/nvptx/atomic-bit-bucket-dest.c: New test.
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/nvptx/nvptx.cc | 11 | ||||
-rw-r--r-- | gcc/config/nvptx/nvptx.md | 10 |
2 files changed, 15 insertions, 6 deletions
diff --git a/gcc/config/nvptx/nvptx.cc b/gcc/config/nvptx/nvptx.cc index 6ca99a6..14911bd 100644 --- a/gcc/config/nvptx/nvptx.cc +++ b/gcc/config/nvptx/nvptx.cc @@ -2835,7 +2835,8 @@ nvptx_mem_maybe_shared_p (const_rtx x) S -- print a shuffle kind specified by CONST_INT t -- print a type opcode suffix, promoting QImode to 32 bits T -- print a type size in bits - u -- print a type opcode suffix without promotions. */ + u -- print a type opcode suffix without promotions. + x -- print a destination operand that may also be a bit bucket. */ static void nvptx_print_operand (FILE *file, rtx x, int code) @@ -2863,6 +2864,14 @@ nvptx_print_operand (FILE *file, rtx x, int code) switch (code) { + case 'x': + if (current_output_insn != NULL + && find_reg_note (current_output_insn, REG_UNUSED, x) != NULL_RTX) + { + fputs ("_", file); + return; + } + goto common; case 'B': if (SYMBOL_REF_P (XEXP (x, 0))) switch (SYMBOL_DATA_AREA (XEXP (x, 0))) diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md index 8079763..1cbf197 100644 --- a/gcc/config/nvptx/nvptx.md +++ b/gcc/config/nvptx/nvptx.md @@ -2050,7 +2050,7 @@ "" { const char *t - = "%.\\tatom%A1.cas.b%T0\\t%0, %1, %2, %3;"; + = "%.\\tatom%A1.cas.b%T0\\t%x0, %1, %2, %3;"; return nvptx_output_atomic_insn (t, operands, 1, 4); } [(set_attr "atomic" "true")]) @@ -2076,7 +2076,7 @@ return ""; } const char *t - = "%.\tatom%A1.exch.b%T0\t%0, %1, %2;"; + = "%.\tatom%A1.exch.b%T0\t%x0, %1, %2;"; return nvptx_output_atomic_insn (t, operands, 1, 3); } [(set_attr "atomic" "true")]) @@ -2166,7 +2166,7 @@ return ""; } const char *t - = "%.\\tatom%A1.add%t0\\t%0, %1, %2;"; + = "%.\\tatom%A1.add%t0\\t%x0, %1, %2;"; return nvptx_output_atomic_insn (t, operands, 1, 3); } [(set_attr "atomic" "true")]) @@ -2196,7 +2196,7 @@ return ""; } const char *t - = "%.\\tatom%A1.add%t0\\t%0, %1, %2;"; + = "%.\\tatom%A1.add%t0\\t%x0, %1, %2;"; return nvptx_output_atomic_insn (t, operands, 1, 3); } [(set_attr "atomic" "true")]) @@ -2226,7 +2226,7 @@ return ""; } const char *t - = "%.\\tatom%A1.<logic>.b%T0\\t%0, %1, %2;"; + = "%.\\tatom%A1.<logic>.b%T0\\t%x0, %1, %2;"; return nvptx_output_atomic_insn (t, operands, 1, 3); } |