[nvptx] Add memory_barrier insn
authorTom de Vries <tom@codesourcery.com>
Mon, 9 Apr 2018 13:22:00 +0000 (13:22 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 9 Apr 2018 13:22:00 +0000 (13:22 +0000)
2018-04-09  Tom de Vries  <tom@codesourcery.com>

PR target/84041
* config/nvptx/nvptx.md (define_c_enum "unspecv"): Add UNSPECV_MEMBAR.
(define_expand "*memory_barrier"): New define_expand.
(define_insn "memory_barrier"): New insn.

From-SVN: r259233

gcc/ChangeLog
gcc/config/nvptx/nvptx.md

index eef1fe43d621805450ce15696ddd09a1b7b9e8fb..165b968b0626777fcc08d3bb6328fd0635de8748 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-09  Tom de Vries  <tom@codesourcery.com>
+
+       PR target/84041
+       * config/nvptx/nvptx.md (define_c_enum "unspecv"): Add UNSPECV_MEMBAR.
+       (define_expand "*memory_barrier"): New define_expand.
+       (define_insn "memory_barrier"): New insn.
+
 2018-04-09  Andrey Belevantsev  <abel@ispras.ru>
 
        PR rtl-optimization/80463
index 4f4453da693c081d708439615bf58bb86ba5e1e4..68bba369a1237f3f65c75d2544e72ecc86065bc4 100644 (file)
@@ -55,6 +55,7 @@
    UNSPECV_CAS
    UNSPECV_XCHG
    UNSPECV_BARSYNC
+   UNSPECV_MEMBAR
    UNSPECV_DIM_POS
 
    UNSPECV_FORK
   "\\tbar.sync\\t%0;"
   [(set_attr "predicable" "false")])
 
+(define_expand "memory_barrier"
+  [(set (match_dup 0)
+       (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR))]
+  ""
+{
+  operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
+  MEM_VOLATILE_P (operands[0]) = 1;
+})
+
+;; Ptx defines the memory barriers membar.cta, membar.gl and membar.sys
+;; (corresponding to cuda functions threadfence_block, threadfence and
+;; threadfence_system).  For the insn memory_barrier we use membar.sys.  This
+;; may be overconservative, but before using membar.gl instead we'll need to
+;; explain in detail why it's safe to use.  For now, use membar.sys.
+(define_insn "*memory_barrier"
+  [(set (match_operand:BLK 0 "" "")
+       (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR))]
+  ""
+  "\\tmembar.sys;"
+  [(set_attr "predicable" "false")])
+
 (define_insn "nvptx_nounroll"
   [(unspec_volatile [(const_int 0)] UNSPECV_NOUNROLL)]
   ""