1# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -run-pass=none %s -o - | FileCheck --check-prefix=GCN %s
2
3--- |
4  ; ModuleID = '<stdin>'
5  source_filename = "<stdin>"
6  target datalayout = "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"
7  target triple = "amdgcn-amd-amdhsa"
8
9  define void @syncscopes(i32 %agent, i32 addrspace(4)* %agent_out, i32 %workgroup, i32 addrspace(4)* %workgroup_out, i32 %wavefront, i32 addrspace(4)* %wavefront_out) #0 {
10  entry:
11    store atomic i32 %agent, i32 addrspace(4)* %agent_out syncscope("agent") seq_cst, align 4, !nontemporal !0
12    store atomic i32 %workgroup, i32 addrspace(4)* %workgroup_out syncscope("workgroup") seq_cst, align 4, !nontemporal !0
13    store atomic i32 %wavefront, i32 addrspace(4)* %wavefront_out syncscope("wavefront") seq_cst, align 4, !nontemporal !0
14    ret void
15  }
16
17  ; Function Attrs: convergent nounwind
18  declare { i1, i64 } @llvm.amdgcn.if(i1) #1
19
20  ; Function Attrs: convergent nounwind
21  declare { i1, i64 } @llvm.amdgcn.else(i64) #1
22
23  ; Function Attrs: convergent nounwind readnone
24  declare i64 @llvm.amdgcn.break(i64) #2
25
26  ; Function Attrs: convergent nounwind readnone
27  declare i64 @llvm.amdgcn.if.break(i1, i64) #2
28
29  ; Function Attrs: convergent nounwind readnone
30  declare i64 @llvm.amdgcn.else.break(i64, i64) #2
31
32  ; Function Attrs: convergent nounwind
33  declare i1 @llvm.amdgcn.loop(i64) #1
34
35  ; Function Attrs: convergent nounwind
36  declare void @llvm.amdgcn.end.cf(i64) #1
37
38  attributes #0 = { "target-cpu"="gfx803" }
39  attributes #1 = { convergent nounwind }
40  attributes #2 = { convergent nounwind readnone }
41
42  !0 = !{i32 1}
43
44# GCN-LABEL: name: syncscopes
45# GCN: FLAT_STORE_DWORD killed $vgpr0_vgpr1, killed $vgpr2, 0, -1, 0, 0, implicit $exec, implicit $flat_scr :: (volatile non-temporal store syncscope("agent") seq_cst 4 into %ir.agent_out, addrspace 4)
46# GCN: FLAT_STORE_DWORD killed $vgpr0_vgpr1, killed $vgpr2, 0, -1, 0, 0, implicit $exec, implicit $flat_scr :: (volatile non-temporal store syncscope("workgroup") seq_cst 4 into %ir.workgroup_out, addrspace 4)
47# GCN: FLAT_STORE_DWORD killed $vgpr0_vgpr1, killed $vgpr2, 0, -1, 0, 0, implicit $exec, implicit $flat_scr :: (volatile non-temporal store syncscope("wavefront") seq_cst 4 into %ir.wavefront_out, addrspace 4)
48...
49---
50name:            syncscopes
51alignment:       1
52exposesReturnsTwice: false
53legalized:       false
54regBankSelected: false
55selected:        false
56tracksRegLiveness: true
57liveins:
58  - { reg: '$sgpr4_sgpr5' }
59frameInfo:
60  isFrameAddressTaken: false
61  isReturnAddressTaken: false
62  hasStackMap:     false
63  hasPatchPoint:   false
64  stackSize:       0
65  offsetAdjustment: 0
66  maxAlignment:    0
67  adjustsStack:    false
68  hasCalls:        false
69  hasOpaqueSPAdjustment: false
70  hasVAStart:      false
71  hasMustTailInVarArgFunc: false
72body:             |
73  bb.0.entry:
74    liveins: $sgpr4_sgpr5
75
76    S_WAITCNT 0
77    $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM $sgpr4_sgpr5, 8, 0, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(4)* undef`)
78    $sgpr6 = S_LOAD_DWORD_IMM $sgpr4_sgpr5, 0, 0, 0 :: (non-temporal dereferenceable invariant load 4 from `i32 addrspace(4)* undef`)
79    $sgpr2_sgpr3 = S_LOAD_DWORDX2_IMM $sgpr4_sgpr5, 24, 0, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(4)* undef`)
80    $sgpr7 = S_LOAD_DWORD_IMM $sgpr4_sgpr5, 16, 0, 0 :: (non-temporal dereferenceable invariant load 4 from `i32 addrspace(4)* undef`)
81    $sgpr8 = S_LOAD_DWORD_IMM $sgpr4_sgpr5, 32, 0, 0 :: (non-temporal dereferenceable invariant load 4 from `i32 addrspace(4)* undef`)
82    S_WAITCNT 127
83    $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $sgpr0_sgpr1
84    $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed $sgpr4_sgpr5, 40, 0, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(4)* undef`)
85    $vgpr1 = V_MOV_B32_e32 killed $sgpr1, implicit $exec, implicit killed $sgpr0_sgpr1, implicit $sgpr0_sgpr1, implicit $exec
86    $vgpr2 = V_MOV_B32_e32 killed $sgpr6, implicit $exec, implicit $exec
87    FLAT_STORE_DWORD killed $vgpr0_vgpr1, killed $vgpr2, 0, -1, 0, 0, implicit $exec, implicit $flat_scr :: (volatile non-temporal store syncscope("agent") seq_cst 4 into %ir.agent_out)
88    S_WAITCNT 112
89    $vgpr0 = V_MOV_B32_e32 $sgpr2, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $sgpr2_sgpr3
90    $vgpr1 = V_MOV_B32_e32 killed $sgpr3, implicit $exec, implicit killed $sgpr2_sgpr3, implicit $sgpr2_sgpr3, implicit $exec
91    $vgpr2 = V_MOV_B32_e32 killed $sgpr7, implicit $exec, implicit $exec
92    FLAT_STORE_DWORD killed $vgpr0_vgpr1, killed $vgpr2, 0, -1, 0, 0, implicit $exec, implicit $flat_scr :: (volatile non-temporal store syncscope("workgroup") seq_cst 4 into %ir.workgroup_out)
93    S_WAITCNT 112
94    $vgpr0 = V_MOV_B32_e32 $sgpr4, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $sgpr4_sgpr5
95    $vgpr1 = V_MOV_B32_e32 killed $sgpr5, implicit $exec, implicit killed $sgpr4_sgpr5, implicit $sgpr4_sgpr5, implicit $exec
96    $vgpr2 = V_MOV_B32_e32 killed $sgpr8, implicit $exec, implicit $exec
97    FLAT_STORE_DWORD killed $vgpr0_vgpr1, killed $vgpr2, 0, -1, 0, 0, implicit $exec, implicit $flat_scr :: (volatile non-temporal store syncscope("wavefront") seq_cst 4 into %ir.wavefront_out)
98    S_ENDPGM 0
99
100...
101