blob: af71086e542fde588741bada85eae27262a721dd [file] [log] [blame]
Marek Olsak79c05872016-11-25 17:37:09 +00001# 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
54name: basic_insert_dcache_wb
55tracksRegLiveness: false
56
57body: |
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
70name: explicit_flush_after
71tracksRegLiveness: false
72
73body: |
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
88name: explicit_flush_before
89tracksRegLiveness: false
90
91body: |
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
101name: no_scalar_store
102tracksRegLiveness: false
103
104body: |
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
120name: multi_block_store
121tracksRegLiveness: false
122
123body: |
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
147name: one_block_store
148tracksRegLiveness: false
149
150body: |
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
166name: si_return
167tracksRegLiveness: false
168
169body: |
170 bb.0:
171 S_STORE_DWORD_SGPR undef %sgpr2, undef %sgpr0_sgpr1, undef %m0, 0
172 SI_RETURN undef %vgpr0
173...