]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/AMDGPU/scalar-store-cache-flush.mir
Vendor import of llvm release_40 branch r296202:
[FreeBSD/FreeBSD.git] / test / CodeGen / AMDGPU / scalar-store-cache-flush.mir
1 # RUN: llc -march=amdgcn -run-pass si-insert-waits %s -o - | FileCheck %s
2
3 --- |
4   define void @basic_insert_dcache_wb() {
5     ret void
6   }
7
8   define void @explicit_flush_after() {
9     ret void
10   }
11
12   define void @explicit_flush_before() {
13     ret void
14   }
15
16   define void @no_scalar_store() {
17     ret void
18   }
19
20   define void @multi_block_store() {
21   bb0:
22     br i1 undef, label %bb1, label %bb2
23
24    bb1:
25      ret void
26
27    bb2:
28     ret void
29   }
30
31   define void @one_block_store() {
32   bb0:
33     br i1 undef, label %bb1, label %bb2
34
35    bb1:
36      ret void
37
38    bb2:
39     ret void
40   }
41
42   define amdgpu_ps float @si_return() {
43     ret float undef
44   }
45
46 ...
47 ---
48 # CHECK-LABEL: name: basic_insert_dcache_wb
49 # CHECK: bb.0:
50 # CHECK-NEXT: S_STORE_DWORD
51 # CHECK-NEXT: S_DCACHE_WB
52 # CHECK-NEXT: S_ENDPGM
53
54 name: basic_insert_dcache_wb
55 tracksRegLiveness: false
56
57 body: |
58   bb.0:
59     S_STORE_DWORD_SGPR undef %sgpr2, undef %sgpr0_sgpr1, undef %m0, 0
60     S_ENDPGM
61 ...
62 ---
63 # Already has an explicitly requested flush after the last store.
64 # CHECK-LABEL: name: explicit_flush_after
65 # CHECK: bb.0:
66 # CHECK-NEXT: S_STORE_DWORD
67 # CHECK-NEXT: S_DCACHE_WB
68 # CHECK-NEXT: S_ENDPGM
69
70 name: explicit_flush_after
71 tracksRegLiveness: false
72
73 body: |
74   bb.0:
75     S_STORE_DWORD_SGPR undef %sgpr2, undef %sgpr0_sgpr1, undef %m0, 0
76     S_DCACHE_WB
77     S_ENDPGM
78 ...
79 ---
80 # Already has an explicitly requested flush before the last store.
81 # CHECK-LABEL: name: explicit_flush_before
82 # CHECK: bb.0:
83 # CHECK-NEXT: S_DCACHE_WB
84 # CHECK-NEXT: S_STORE_DWORD
85 # CHECK-NEXT: S_DCACHE_WB
86 # CHECK-NEXT: S_ENDPGM
87
88 name: explicit_flush_before
89 tracksRegLiveness: false
90
91 body: |
92   bb.0:
93     S_DCACHE_WB
94     S_STORE_DWORD_SGPR undef %sgpr2, undef %sgpr0_sgpr1, undef %m0, 0
95     S_ENDPGM
96 ...
97 ---
98 # CHECK-LABEL: no_scalar_store
99 # CHECK: bb.0
100 # CHECK-NEXT: S_ENDPGM
101 name: no_scalar_store
102 tracksRegLiveness: false
103
104 body: |
105   bb.0:
106     S_ENDPGM
107 ...
108
109 # CHECK-LABEL: name: multi_block_store
110 # CHECK: bb.0:
111 # CHECK-NEXT: S_STORE_DWORD
112 # CHECK-NEXT: S_DCACHE_WB
113 # CHECK-NEXT: S_ENDPGM
114
115 # CHECK: bb.1:
116 # CHECK-NEXT: S_STORE_DWORD
117 # CHECK-NEXT: S_DCACHE_WB
118 # CHECK-NEXT: S_ENDPGM
119
120 name: multi_block_store
121 tracksRegLiveness: false
122
123 body: |
124   bb.0:
125     S_STORE_DWORD_SGPR undef %sgpr2, undef %sgpr0_sgpr1, undef %m0, 0
126     S_ENDPGM
127
128   bb.1:
129     S_STORE_DWORD_SGPR undef %sgpr4, undef %sgpr6_sgpr7, undef %m0, 0
130     S_ENDPGM
131 ...
132 ...
133
134 # This one should be able to omit the flush in the storeless block but
135 # this isn't handled now.
136
137 # CHECK-LABEL: name: one_block_store
138 # CHECK: bb.0:
139 # CHECK-NEXT: S_DCACHE_WB
140 # CHECK-NEXT: S_ENDPGM
141
142 # CHECK: bb.1:
143 # CHECK-NEXT: S_STORE_DWORD
144 # CHECK-NEXT: S_DCACHE_WB
145 # CHECK-NEXT: S_ENDPGM
146
147 name: one_block_store
148 tracksRegLiveness: false
149
150 body: |
151   bb.0:
152     S_ENDPGM
153
154   bb.1:
155     S_STORE_DWORD_SGPR undef %sgpr4, undef %sgpr6_sgpr7, undef %m0, 0
156     S_ENDPGM
157 ...
158 ---
159 # CHECK-LABEL: name: si_return
160 # CHECK: bb.0:
161 # CHECK-NEXT: S_STORE_DWORD
162 # CHECK-NEXT: S_WAITCNT
163 # CHECK-NEXT: S_DCACHE_WB
164 # CHECK-NEXT: SI_RETURN
165
166 name: si_return
167 tracksRegLiveness: false
168
169 body: |
170   bb.0:
171     S_STORE_DWORD_SGPR undef %sgpr2, undef %sgpr0_sgpr1, undef %m0, 0
172     SI_RETURN undef %vgpr0
173 ...