1# RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs -run-pass machine-scheduler -o - %s | FileCheck -check-prefix=GCN %s
2
3# GCN-LABEL: name: cluster_add_addc
4# GCN: S_NOP 0, implicit-def $vcc
5# GCN: dead %2:vgpr_32, %3:sreg_64_xexec = V_ADD_I32_e64 %0, %1, implicit $exec
6# GCN: dead %4:vgpr_32, dead %5:sreg_64_xexec = V_ADDC_U32_e64 %6, %7, %3, implicit $exec
7name: cluster_add_addc
8registers:
9  - { id: 0, class: vgpr_32 }
10  - { id: 1, class: vgpr_32 }
11  - { id: 2, class: vgpr_32 }
12  - { id: 3, class: sreg_64_xexec }
13  - { id: 4, class: vgpr_32 }
14  - { id: 5, class: sreg_64_xexec }
15  - { id: 6, class: vgpr_32 }
16  - { id: 7, class: vgpr_32 }
17
18body: |
19  bb.0:
20    %0 = V_MOV_B32_e32 0, implicit $exec
21    %1 = V_MOV_B32_e32 0, implicit $exec
22    %2, %3 = V_ADD_I32_e64 %0, %1, implicit $exec
23    %6 = V_MOV_B32_e32 0, implicit $exec
24    %7 = V_MOV_B32_e32 0, implicit $exec
25    S_NOP 0, implicit def $vcc
26    %4, %5 = V_ADDC_U32_e64 %6, %7, %3, implicit $exec
27...
28
29# GCN-LABEL: name: interleave_add64s
30# GCN: dead %8:vgpr_32, %9:sreg_64_xexec = V_ADD_I32_e64 %0, %1, implicit $exec
31# GCN-NEXT: dead %12:vgpr_32, dead %13:sreg_64_xexec = V_ADDC_U32_e64 %4, %5, %9, implicit $exec
32# GCN-NEXT: dead %10:vgpr_32, %11:sreg_64_xexec = V_ADD_I32_e64 %2, %3, implicit $exec
33# GCN-NEXT: dead %14:vgpr_32, dead %15:sreg_64_xexec = V_ADDC_U32_e64 %6, %7, %11, implicit $exec
34name: interleave_add64s
35registers:
36  - { id: 0, class: vgpr_32 }
37  - { id: 1, class: vgpr_32 }
38  - { id: 2, class: vgpr_32 }
39  - { id: 3, class: vgpr_32 }
40  - { id: 4, class: vgpr_32 }
41  - { id: 5, class: vgpr_32 }
42  - { id: 6, class: vgpr_32 }
43  - { id: 7, class: vgpr_32 }
44  - { id: 8, class: vgpr_32 }
45  - { id: 9, class: sreg_64_xexec }
46  - { id: 10, class: vgpr_32 }
47  - { id: 11, class: sreg_64_xexec }
48  - { id: 12, class: vgpr_32 }
49  - { id: 13, class: sreg_64_xexec }
50  - { id: 14, class: vgpr_32 }
51  - { id: 15, class: sreg_64_xexec }
52
53body: |
54  bb.0:
55    %0 = V_MOV_B32_e32 0, implicit $exec
56    %1 = V_MOV_B32_e32 0, implicit $exec
57    %2 = V_MOV_B32_e32 0, implicit $exec
58    %3 = V_MOV_B32_e32 0, implicit $exec
59    %4 = V_MOV_B32_e32 0, implicit $exec
60    %5 = V_MOV_B32_e32 0, implicit $exec
61    %6 = V_MOV_B32_e32 0, implicit $exec
62    %7 = V_MOV_B32_e32 0, implicit $exec
63
64    %8, %9 = V_ADD_I32_e64 %0, %1, implicit $exec
65    %10, %11 = V_ADD_I32_e64 %2, %3, implicit $exec
66
67
68    %12, %13 = V_ADDC_U32_e64 %4, %5, %9, implicit $exec
69    %14, %15 = V_ADDC_U32_e64 %6, %7, %11, implicit $exec
70...
71
72# GCN-LABEL: name: cluster_mov_addc
73# GCN: S_NOP 0, implicit-def $vcc
74# GCN-NEXT: %2:sreg_64_xexec = S_MOV_B64 0
75# GCN-NEXT: dead %3:vgpr_32, dead %4:sreg_64_xexec = V_ADDC_U32_e64 %0, %1, %2, implicit $exec
76name: cluster_mov_addc
77registers:
78  - { id: 0, class: vgpr_32 }
79  - { id: 1, class: vgpr_32 }
80  - { id: 2, class: sreg_64_xexec }
81  - { id: 3, class: vgpr_32 }
82  - { id: 4, class: sreg_64_xexec }
83  - { id: 6, class: vgpr_32 }
84  - { id: 7, class: vgpr_32 }
85
86body: |
87  bb.0:
88    %0 = V_MOV_B32_e32 0, implicit $exec
89    %1 = V_MOV_B32_e32 0, implicit $exec
90    %2 = S_MOV_B64 0
91    S_NOP 0, implicit def $vcc
92    %3, %4 = V_ADDC_U32_e64 %0, %1, %2, implicit $exec
93...
94
95# GCN-LABEL: name: no_cluster_add_addc_diff_sgpr
96# GCN: dead %2:vgpr_32, dead %3:sreg_64_xexec = V_ADD_I32_e64 %0, %1, implicit $exec
97# GCN-NEXT: %6:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
98# GCN-NEXT: %7:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
99# GCN-NEXT: S_NOP 0, implicit-def $vcc
100# GCN-NEXT: %8:sreg_64_xexec = S_MOV_B64 0
101# GCN-NEXT: dead %4:vgpr_32, dead %5:sreg_64_xexec = V_ADDC_U32_e64 %6, %7, %8, implicit $exec
102name: no_cluster_add_addc_diff_sgpr
103registers:
104  - { id: 0, class: vgpr_32 }
105  - { id: 1, class: vgpr_32 }
106  - { id: 2, class: vgpr_32 }
107  - { id: 3, class: sreg_64_xexec }
108  - { id: 4, class: vgpr_32 }
109  - { id: 5, class: sreg_64_xexec }
110  - { id: 6, class: vgpr_32 }
111  - { id: 7, class: vgpr_32 }
112  - { id: 8, class: sreg_64_xexec }
113body: |
114  bb.0:
115    %0 = V_MOV_B32_e32 0, implicit $exec
116    %1 = V_MOV_B32_e32 0, implicit $exec
117    %8 = S_MOV_B64 0
118    %2, %3 = V_ADD_I32_e64 %0, %1, implicit $exec
119    %6 = V_MOV_B32_e32 0, implicit $exec
120    %7 = V_MOV_B32_e32 0, implicit $exec
121    S_NOP 0, implicit def $vcc
122    %4, %5 = V_ADDC_U32_e64 %6, %7, %8, implicit $exec
123...
124# GCN-LABEL: name: cluster_sub_subb
125# GCN: S_NOP 0, implicit-def $vcc
126# GCN: dead %2:vgpr_32, %3:sreg_64_xexec = V_SUB_I32_e64 %0, %1, implicit $exec
127# GCN: dead %4:vgpr_32, dead %5:sreg_64_xexec = V_SUBB_U32_e64 %6, %7, %3, implicit $exec
128name: cluster_sub_subb
129registers:
130  - { id: 0, class: vgpr_32 }
131  - { id: 1, class: vgpr_32 }
132  - { id: 2, class: vgpr_32 }
133  - { id: 3, class: sreg_64_xexec }
134  - { id: 4, class: vgpr_32 }
135  - { id: 5, class: sreg_64_xexec }
136  - { id: 6, class: vgpr_32 }
137  - { id: 7, class: vgpr_32 }
138
139body: |
140  bb.0:
141    %0 = V_MOV_B32_e32 0, implicit $exec
142    %1 = V_MOV_B32_e32 0, implicit $exec
143    %2, %3 = V_SUB_I32_e64 %0, %1, implicit $exec
144    %6 = V_MOV_B32_e32 0, implicit $exec
145    %7 = V_MOV_B32_e32 0, implicit $exec
146    S_NOP 0, implicit def $vcc
147    %4, %5 = V_SUBB_U32_e64 %6, %7, %3, implicit $exec
148...
149
150# GCN-LABEL: name: cluster_cmp_cndmask
151# GCN: S_NOP 0, implicit-def $vcc
152# GCN-NEXT: %3:sreg_64_xexec = V_CMP_EQ_I32_e64 %0, %1, implicit $exec
153# GCN-NEXT: dead %4:vgpr_32 = V_CNDMASK_B32_e64 %0, %1, %3, implicit $exec
154name: cluster_cmp_cndmask
155registers:
156  - { id: 0, class: vgpr_32 }
157  - { id: 1, class: vgpr_32 }
158  - { id: 2, class: vgpr_32 }
159  - { id: 3, class: sreg_64_xexec }
160  - { id: 4, class: vgpr_32 }
161  - { id: 5, class: sreg_64_xexec }
162  - { id: 6, class: vgpr_32 }
163  - { id: 7, class: vgpr_32 }
164
165body: |
166  bb.0:
167    %0 = V_MOV_B32_e32 0, implicit $exec
168    %1 = V_MOV_B32_e32 0, implicit $exec
169    %3 = V_CMP_EQ_I32_e64 %0, %1, implicit $exec
170    S_NOP 0, implicit def $vcc
171    %4 = V_CNDMASK_B32_e64 %0, %1, %3, implicit $exec
172...
173
174# GCN-LABEL: name: cluster_multi_use_cmp_cndmask
175# GCN: %4:sreg_64_xexec = V_CMP_EQ_I32_e64 %0, %1, implicit $exec
176# GCN-NEXT: dead %5:vgpr_32 = V_CNDMASK_B32_e64 %2, %1, %4, implicit $exec
177# GCN-NEXT: dead %6:vgpr_32 = V_CNDMASK_B32_e64 %1, %3, %4, implicit $exec
178name: cluster_multi_use_cmp_cndmask
179registers:
180  - { id: 0, class: vgpr_32 }
181  - { id: 1, class: vgpr_32 }
182  - { id: 2, class: vgpr_32 }
183  - { id: 3, class: vgpr_32 }
184  - { id: 4, class: sreg_64_xexec }
185  - { id: 5, class: vgpr_32 }
186  - { id: 6, class: vgpr_32 }
187  - { id: 7, class: vgpr_32 }
188
189body: |
190  bb.0:
191    %0 = V_MOV_B32_e32 0, implicit $exec
192    %1 = V_MOV_B32_e32 0, implicit $exec
193    %2 = V_MOV_B32_e32 0, implicit $exec
194    %3 = V_MOV_B32_e32 0, implicit $exec
195
196    %4 = V_CMP_EQ_I32_e64 %0, %1, implicit $exec
197    S_NOP 0, implicit def $vcc
198    %5 = V_CNDMASK_B32_e64 %2, %1, %4, implicit $exec
199    %6 = V_CNDMASK_B32_e64 %1, %3, %4, implicit $exec
200...
201
202# GCN-LABEL: name: cluster_multi_use_cmp_cndmask2
203# GCN: %4:sreg_64_xexec = V_CMP_EQ_I32_e64 %0, %1, implicit $exec
204# GCN-NEXT: dead %5:vgpr_32 = V_CNDMASK_B32_e64 %2, %1, %4, implicit $exec
205# GCN-NEXT: %3:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
206# GCN-NEXT: dead %6:vgpr_32 = V_CNDMASK_B32_e64 %1, %3, %4, implicit $exec
207name: cluster_multi_use_cmp_cndmask2
208registers:
209  - { id: 0, class: vgpr_32 }
210  - { id: 1, class: vgpr_32 }
211  - { id: 2, class: vgpr_32 }
212  - { id: 3, class: vgpr_32 }
213  - { id: 4, class: sreg_64_xexec }
214  - { id: 5, class: vgpr_32 }
215  - { id: 6, class: vgpr_32 }
216  - { id: 7, class: vgpr_32 }
217
218body: |
219  bb.0:
220    %0 = V_MOV_B32_e32 0, implicit $exec
221    %1 = V_MOV_B32_e32 0, implicit $exec
222    %4 = V_CMP_EQ_I32_e64 %0, %1, implicit $exec
223    %2 = V_MOV_B32_e32 0, implicit $exec
224    %5 = V_CNDMASK_B32_e64 %2, %1, %4, implicit $exec
225    %3 = V_MOV_B32_e32 0, implicit $exec
226    %6 = V_CNDMASK_B32_e64 %1, %3, %4, implicit $exec
227...
228