* [PTX] stop special casing worker buffers
@ 2015-12-18 14:41 Nathan Sidwell
0 siblings, 0 replies; only message in thread
From: Nathan Sidwell @ 2015-12-18 14:41 UTC (permalink / raw)
To: GCC Patches
[-- Attachment #1: Type: text/plain, Size: 257 bytes --]
This patch removes the special case instructions for handling the worker
broadcast buffer. Also commonizes the emission of the reduction and broadcast
buffer variables.
This is a step towards merging the convaddr instruction into a regular mov.
nathan
[-- Attachment #2: trunk-ptx-worker.patch --]
[-- Type: text/x-patch, Size: 5251 bytes --]
2015-12-18 Nathan Sidwell <nathan@acm.org>
* config/nvptx/nvptx.c (worker_bcast_name, worker_red_name): Delete.
(nvptx_option_override): Adjust worker symbol creation.
(nvptx_gen_wcast): Wrap worker address in UNSPEC_TO_GENERIC.
(write_worker_buffer): New.
(nvptx_file_end): Call write_worker_buffer.
* config/nvptx/nvptx.md (UNSPEC_SHARED_DATA): Delete.
(worker_load<mode>, worker_store<mode>): Delete.
Index: config/nvptx/nvptx.c
===================================================================
--- config/nvptx/nvptx.c (revision 231815)
+++ config/nvptx/nvptx.c (working copy)
@@ -128,14 +128,12 @@ static GTY((cache)) hash_table<tree_hash
shared across TUs (taking the largest size). */
static unsigned worker_bcast_size;
static unsigned worker_bcast_align;
-#define worker_bcast_name "__worker_bcast"
static GTY(()) rtx worker_bcast_sym;
/* Buffer needed for worker reductions. This has to be distinct from
the worker broadcast array, as both may be live concurrently. */
static unsigned worker_red_size;
static unsigned worker_red_align;
-#define worker_red_name "__worker_red"
static GTY(()) rtx worker_red_sym;
/* Global lock variable, needed for 128bit worker & gang reductions. */
@@ -172,11 +170,11 @@ nvptx_option_override (void)
declared_libfuncs_htab
= hash_table<declared_libfunc_hasher>::create_ggc (17);
- worker_bcast_sym = gen_rtx_SYMBOL_REF (Pmode, worker_bcast_name);
+ worker_bcast_sym = gen_rtx_SYMBOL_REF (Pmode, "__worker_bcast");
SET_SYMBOL_DATA_AREA (worker_bcast_sym, DATA_AREA_SHARED);
worker_bcast_align = GET_MODE_ALIGNMENT (SImode) / BITS_PER_UNIT;
- worker_red_sym = gen_rtx_SYMBOL_REF (Pmode, worker_red_name);
+ worker_red_sym = gen_rtx_SYMBOL_REF (Pmode, "__worker_red");
SET_SYMBOL_DATA_AREA (worker_red_sym, DATA_AREA_SHARED);
worker_red_align = GET_MODE_ALIGNMENT (SImode) / BITS_PER_UNIT;
}
@@ -1382,7 +1380,6 @@ nvptx_gen_wcast (rtx reg, propagate_mask
}
addr = gen_rtx_MEM (mode, addr);
- addr = gen_rtx_UNSPEC (mode, gen_rtvec (1, addr), UNSPEC_SHARED_DATA);
if (pm == PM_read)
res = gen_rtx_SET (addr, reg);
else if (pm == PM_write)
@@ -3356,9 +3353,11 @@ nvptx_wpropagate (bool pre_p, basic_bloc
if (data.offset)
{
/* Stuff was emitted, initialize the base pointer now. */
- rtx init = gen_rtx_SET (data.base, worker_bcast_sym);
+ rtx init = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, worker_bcast_sym),
+ UNSPEC_TO_GENERIC);
+ init = gen_rtx_SET (data.base, init);
emit_insn_after (init, insn);
-
+
if (worker_bcast_size < data.offset)
worker_bcast_size = data.offset;
}
@@ -3922,6 +3921,18 @@ nvptx_file_start (void)
fputs ("// END PREAMBLE\n", asm_out_file);
}
+/* Emit a declaration for a worker-level buffer in .shared memory. */
+
+static void
+write_worker_buffer (FILE *file, rtx sym, unsigned align, unsigned size)
+{
+ const char *name = XSTR (sym, 0);
+
+ write_var_marker (file, true, false, name);
+ fprintf (file, ".shared .align %d .u8 %s[%d];\n",
+ align, name, size);
+}
+
/* Write out the function declarations we've collected and declare storage
for the broadcast buffer. */
@@ -3935,30 +3946,12 @@ nvptx_file_end (void)
fputs (func_decls.str().c_str(), asm_out_file);
if (worker_bcast_size)
- {
- /* Define the broadcast buffer. */
-
- worker_bcast_size = (worker_bcast_size + worker_bcast_align - 1)
- & ~(worker_bcast_align - 1);
-
- write_var_marker (asm_out_file, true, false, worker_bcast_name);
- fprintf (asm_out_file, ".shared .align %d .u8 %s[%d];\n",
- worker_bcast_align,
- worker_bcast_name, worker_bcast_size);
- }
+ write_worker_buffer (asm_out_file, worker_bcast_sym,
+ worker_bcast_align, worker_bcast_size);
if (worker_red_size)
- {
- /* Define the reduction buffer. */
-
- worker_red_size = ((worker_red_size + worker_red_align - 1)
- & ~(worker_red_align - 1));
-
- write_var_marker (asm_out_file, true, false, worker_red_name);
- fprintf (asm_out_file, ".shared .align %d .u8 %s[%d];\n",
- worker_red_align,
- worker_red_name, worker_red_size);
- }
+ write_worker_buffer (asm_out_file, worker_red_sym,
+ worker_red_align, worker_red_size);
}
/* Expander for the shuffle builtins. */
Index: config/nvptx/nvptx.md
===================================================================
--- config/nvptx/nvptx.md (revision 231815)
+++ config/nvptx/nvptx.md (working copy)
@@ -39,8 +39,6 @@
UNSPEC_DIM_SIZE
- UNSPEC_SHARED_DATA
-
UNSPEC_BIT_CONV
UNSPEC_SHUFFLE
@@ -1193,20 +1191,6 @@
""
"%.\\tmov.b64\\t%0, {%1,%2};")
-(define_insn "worker_load<mode>"
- [(set (match_operand:SDISDFM 0 "nvptx_register_operand" "=R")
- (unspec:SDISDFM [(match_operand:SDISDFM 1 "memory_operand" "m")]
- UNSPEC_SHARED_DATA))]
- ""
- "%.\\tld.shared%u0\\t%0, %1;")
-
-(define_insn "worker_store<mode>"
- [(set (unspec:SDISDFM [(match_operand:SDISDFM 1 "memory_operand" "=m")]
- UNSPEC_SHARED_DATA)
- (match_operand:SDISDFM 0 "nvptx_register_operand" "R"))]
- ""
- "%.\\tst.shared%u1\\t%1, %0;")
-
;; Atomic insns.
(define_expand "atomic_compare_and_swap<mode>"
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2015-12-18 14:41 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-18 14:41 [PTX] stop special casing worker buffers Nathan Sidwell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).