diff options
author | Tom de Vries <tom@codesourcery.com> | 2018-04-09 13:22:00 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2018-04-09 13:22:00 +0000 |
commit | f04fd9038ee58325748fea2f085d43eddcdb37ad (patch) | |
tree | 6ae3600e367946c582673b0bde38678b21a36855 /gcc | |
parent | 6abce7391ae63fd2808aa471aa9dd2679eb00496 (diff) | |
download | gcc-f04fd9038ee58325748fea2f085d43eddcdb37ad.zip gcc-f04fd9038ee58325748fea2f085d43eddcdb37ad.tar.gz gcc-f04fd9038ee58325748fea2f085d43eddcdb37ad.tar.bz2 |
[nvptx] Add memory_barrier insn
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/nvptx/nvptx.md | 22 |
2 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eef1fe4..165b968 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md index 4f4453d..68bba36 100644 --- a/gcc/config/nvptx/nvptx.md +++ b/gcc/config/nvptx/nvptx.md @@ -55,6 +55,7 @@ UNSPECV_CAS UNSPECV_XCHG UNSPECV_BARSYNC + UNSPECV_MEMBAR UNSPECV_DIM_POS UNSPECV_FORK @@ -1459,6 +1460,27 @@ "\\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)] "" |