[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / merge-m0.mir
blob2c2979b03cb9c36bae63dbe1a74e21c58e797767
1 # RUN: llc -march=amdgcn -amdgpu-enable-merge-m0 -verify-machineinstrs -run-pass si-fix-sgpr-copies %s -o - | FileCheck -check-prefix=GCN %s
3 # GCN-LABEL: name: merge-m0-many-init
4 # GCN:    bb.0.entry:
5 # GCN:      SI_INIT_M0 -1
6 # GCN-NEXT: IMPLICIT_DEF
7 # GCN-NEXT: IMPLICIT_DEF
8 # GCN-NEXT: DS_WRITE_B32
9 # GCN-NEXT: DS_WRITE_B32
10 # GCN-NEXT: SI_INIT_M0 65536
11 # GCN-NEXT: DS_WRITE_B32
12 # GCN-NEXT: DS_WRITE_B32
13 # GCN-NEXT: SI_INIT_M0 -1
14 # GCN-NEXT: DS_WRITE_B32
15 # GCN-NEXT: SI_INIT_M0 65536
16 # GCN-NEXT: DS_WRITE_B32
18 # GCN:    bb.1:
19 # GCN:      SI_INIT_M0 -1
20 # GCN-NEXT: DS_WRITE_B32
21 # GCN-NEXT: DS_WRITE_B32
23 # GCN:    bb.2:
24 # GCN:      SI_INIT_M0 65536
25 # GCN-NEXT: DS_WRITE_B32
27 # GCN:    bb.3:
28 # GCN:      SI_INIT_M0 3
30 # GCN:    bb.4:
31 # GCN-NOT:  SI_INIT_M0
32 # GCN:      DS_WRITE_B32
33 # GCN-NEXT: SI_INIT_M0 4
34 # GCN-NEXT: DS_WRITE_B32
36 # GCN:    bb.5:
37 # GCN-NOT: SI_INIT_M0
38 # GCN:     DS_WRITE_B32
39 # GCN-NEXT: SI_INIT_M0 4
40 # GCN-NEXT: DS_WRITE_B32
42 # GCN:    bb.6:
43 # GCN:      SI_INIT_M0 -1,
44 # GCN-NEXT: DS_WRITE_B32
45 # GCN:      SI_INIT_M0 %2
46 # GCN-NEXT: DS_WRITE_B32
47 # GCN-NEXT: SI_INIT_M0 %2
48 # GCN-NEXT: DS_WRITE_B32
49 # GCN-NEXT: SI_INIT_M0 -1
50 # GCN-NEXT: DS_WRITE_B32
51 ---
52 name: merge-m0-many-init
53 registers:
54   - { id: 0, class: vgpr_32 }
55   - { id: 1, class: vgpr_32 }
56   - { id: 2, class: sreg_32_xm0 }
57 body:             |
58   bb.0.entry:
59     successors: %bb.1, %bb.2
61     %0 = IMPLICIT_DEF
62     %1 = IMPLICIT_DEF
63     SI_INIT_M0 -1, implicit-def $m0
64     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
65     SI_INIT_M0 -1, implicit-def $m0
66     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
67     SI_INIT_M0 65536, implicit-def $m0
68     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
69     SI_INIT_M0 65536, implicit-def $m0
70     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
71     SI_INIT_M0 -1, implicit-def $m0
72     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
73     SI_INIT_M0 65536, implicit-def $m0
74     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
75     S_CBRANCH_VCCZ %bb.1, implicit undef $vcc
76     S_BRANCH %bb.2
78   bb.1:
79     successors: %bb.2
80     SI_INIT_M0 -1, implicit-def $m0
81     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
82     SI_INIT_M0 -1, implicit-def $m0
83     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
84     S_BRANCH %bb.2
86   bb.2:
87     successors: %bb.3
88     SI_INIT_M0 65536, implicit-def $m0
89     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
90     S_BRANCH %bb.3
92   bb.3:
93     successors: %bb.4, %bb.5
94     S_CBRANCH_VCCZ %bb.4, implicit undef $vcc
95     S_BRANCH %bb.5
97   bb.4:
98     successors: %bb.6
99     SI_INIT_M0 3, implicit-def $m0
100     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
101     SI_INIT_M0 4, implicit-def $m0
102     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
103     S_BRANCH %bb.6
105   bb.5:
106     successors: %bb.6
107     SI_INIT_M0 3, implicit-def $m0
108     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
109     SI_INIT_M0 4, implicit-def $m0
110     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
111     S_BRANCH %bb.6
113   bb.6:
114     successors: %bb.0.entry, %bb.6
115     SI_INIT_M0 -1, implicit-def $m0
116     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
117     %2 = IMPLICIT_DEF
118     SI_INIT_M0 %2, implicit-def $m0
119     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
120     SI_INIT_M0 %2, implicit-def $m0
121     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
122     SI_INIT_M0 -1, implicit-def $m0
123     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
124     S_CBRANCH_VCCZ %bb.6, implicit undef $vcc
125     S_BRANCH %bb.0.entry
129 # GCN-LABEL: name: merge-m0-dont-hoist-past-init-with-different-initializer
130 # GCN:    bb.0.entry:
131 # GCN:      SI_INIT_M0 65536
132 # GCN-NEXT: IMPLICIT_DEF
133 # GCN-NEXT: IMPLICIT_DEF
134 # GCN-NEXT: DS_WRITE_B32
136 # GCN:    bb.1:
137 # GCN-NOT:  SI_INIT_M0 65536
138 # GCN-NOT:  SI_INIT_M0 -1
140 # GCN:    bb.2:
141 # GCN:      SI_INIT_M0 -1
143 # GCN:    bb.3:
144 # GCN:      SI_INIT_M0 -1
146 name: merge-m0-dont-hoist-past-init-with-different-initializer
147 registers:
148   - { id: 0, class: vgpr_32 }
149   - { id: 1, class: vgpr_32 }
150 body:             |
151   bb.0.entry:
152     successors: %bb.1
154     %0 = IMPLICIT_DEF
155     %1 = IMPLICIT_DEF
156     SI_INIT_M0 65536, implicit-def $m0
157     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
158     S_BRANCH %bb.1
160   bb.1:
161     successors: %bb.2, %bb.3
163     SI_INIT_M0 65536, implicit-def $m0
164     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
165     S_CBRANCH_VCCZ %bb.2, implicit undef $vcc
166     S_BRANCH %bb.3
168   bb.2:
169     successors: %bb.4
171     SI_INIT_M0 -1, implicit-def $m0
172     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
173     S_BRANCH %bb.4
175   bb.3:
176     successors: %bb.4
178     SI_INIT_M0 -1, implicit-def $m0
179     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
180     S_BRANCH %bb.4
182   bb.4:
183     S_ENDPGM 0
186 # GCN-LABEL: name: merge-m0-after-prologue
187 # GCN:    bb.0.entry:
188 # GCN-NOT:  SI_INIT_M0
189 # GCN:      S_OR_B64
190 # GCN-NEXT: SI_INIT_M0
192 # GCN:     bb.1:
193 # GCN-NOT:   SI_INIT_M0 -1
195 # GCN:     bb.2:
196 # GCN-NOT:   SI_INIT_MO -1
198 name: merge-m0-after-prologue
199 registers:
200   - { id: 0, class: vgpr_32 }
201   - { id: 1, class: vgpr_32 }
202 body:             |
203   bb.0.entry:
204     successors: %bb.1, %bb.2
205     liveins: $sgpr0_sgpr1
207     $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc
208     %0 = IMPLICIT_DEF
209     %1 = IMPLICIT_DEF
210     S_CBRANCH_VCCZ %bb.1, implicit undef $vcc
211     S_BRANCH %bb.2
213   bb.1:
214     successors: %bb.3
216     SI_INIT_M0 -1, implicit-def $m0
217     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
218     S_BRANCH %bb.3
220   bb.2:
221     successors: %bb.3
223     SI_INIT_M0 -1, implicit-def $m0
224     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
225     S_BRANCH %bb.3
227   bb.3:
228     S_ENDPGM 0
231 # GCN-LABEL: name: move-m0-avoid-hazard
232 # GCN: $m0 = S_MOV_B32 -1
233 # GCN-NEXT: $vgpr0 = V_MOV_B32_e32 0, implicit $exec
234 # GCN-NEXT: DS_GWS_INIT $vgpr0, 0, 1, implicit $m0, implicit $exec
236 name: move-m0-avoid-hazard
237 body:             |
238   bb.0:
239     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
240     $m0 = S_MOV_B32 -1
241     DS_GWS_INIT $vgpr0, 0, 1, implicit $m0, implicit $exec
244 # GCN-LABEL: name: move-m0-with-prologue
245 # GCN $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc
246 # GCN: $m0 = S_MOV_B32 -1
247 # GCN-NEXT: $vgpr0 = V_MOV_B32_e32 0, implicit $exec
248 # GCN-NEXT: DS_GWS_INIT $vgpr0, 0, 1, implicit $m0, implicit $exec
250 name: move-m0-with-prologue
251 body:             |
252   bb.0:
253     liveins: $sgpr0_sgpr1
255     $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc
256     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
257     $m0 = S_MOV_B32 -1
258     DS_GWS_INIT $vgpr0, 0, 1, implicit $m0, implicit $exec
261 # GCN-LABEL: name: move-m0-different-initializer
262 # GCN: SI_INIT_M0 -1
263 # GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
264 # GCN: SI_INIT_M0 65536
265 # GCN-NEXT: S_NOP
267 name: move-m0-different-initializer
268 registers:
269   - { id: 0, class: vgpr_32 }
270   - { id: 1, class: vgpr_32 }
271 body:             |
272   bb.0:
273     %0 = IMPLICIT_DEF
274     %1 = IMPLICIT_DEF
275     SI_INIT_M0 -1, implicit-def $m0
276     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
277     S_NOP 0
278     SI_INIT_M0 65536, implicit-def $m0
279     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec
282 # GCN-LABEL: name: move-m0-schedule-boundary
283 # GCN: S_SETREG
284 # GCN-NEXT: SI_INIT_M0 -1
286 name: move-m0-schedule-boundary
287 registers:
288   - { id: 0, class: vgpr_32 }
289   - { id: 1, class: vgpr_32 }
290 body:             |
291   bb.0:
292     %0 = IMPLICIT_DEF
293     %1 = IMPLICIT_DEF
294     S_SETREG_IMM32_B32 0, 1
295     SI_INIT_M0 -1, implicit-def $m0
296     DS_WRITE_B32 %0, %1, 0, 0, implicit $m0, implicit $exec