1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs -o - %s | FileCheck %s
3
4# Post-legalizer should not generate divrem instruction.
5---
6name: test_sdiv_srem
7tracksRegLiveness: true
8legalized: true
9body: |
10  bb.0:
11    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
12    ; CHECK-LABEL: name: test_sdiv_srem
13    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
14    ; CHECK: %src1:_(s32) = COPY $vgpr0
15    ; CHECK: %src2:_(s32) = COPY $vgpr1
16    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
17    ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5
18    ; CHECK: %div:_(s32) = G_SDIV %src1, %src2
19    ; CHECK: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1)
20    ; CHECK: %rem:_(s32) = G_SREM %src1, %src2
21    ; CHECK: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1)
22    %src1:_(s32) = COPY $vgpr0
23    %src2:_(s32) = COPY $vgpr1
24    %ptr1:_(p1) = COPY $vgpr2_vgpr3
25    %ptr2:_(p1) = COPY $vgpr4_vgpr5
26    %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
27    G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
28    %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
29    G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
30...
31---
32name: test_srem_sdiv
33tracksRegLiveness: true
34legalized: true
35body: |
36  bb.0:
37    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
38    ; CHECK-LABEL: name: test_srem_sdiv
39    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
40    ; CHECK: %src1:_(s32) = COPY $vgpr0
41    ; CHECK: %src2:_(s32) = COPY $vgpr1
42    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
43    ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5
44    ; CHECK: %rem:_(s32) = G_SREM %src1, %src2
45    ; CHECK: G_STORE %rem(s32), %ptr1(p1) :: (store (s32), addrspace 1)
46    ; CHECK: %div:_(s32) = G_SDIV %src1, %src2
47    ; CHECK: G_STORE %div(s32), %ptr2(p1) :: (store (s32), addrspace 1)
48    %src1:_(s32) = COPY $vgpr0
49    %src2:_(s32) = COPY $vgpr1
50    %ptr1:_(p1) = COPY $vgpr2_vgpr3
51    %ptr2:_(p1) = COPY $vgpr4_vgpr5
52    %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
53    G_STORE %rem:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
54    %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
55    G_STORE %div:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
56...
57---
58name: test_udiv_urem
59tracksRegLiveness: true
60legalized: true
61body: |
62  bb.0:
63    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
64    ; CHECK-LABEL: name: test_udiv_urem
65    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
66    ; CHECK: %src1:_(s32) = COPY $vgpr0
67    ; CHECK: %src2:_(s32) = COPY $vgpr1
68    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
69    ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5
70    ; CHECK: %div:_(s32) = G_UDIV %src1, %src2
71    ; CHECK: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1)
72    ; CHECK: %rem:_(s32) = G_UREM %src1, %src2
73    ; CHECK: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1)
74    %src1:_(s32) = COPY $vgpr0
75    %src2:_(s32) = COPY $vgpr1
76    %ptr1:_(p1) = COPY $vgpr2_vgpr3
77    %ptr2:_(p1) = COPY $vgpr4_vgpr5
78    %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32)
79    G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
80    %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32)
81    G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
82...
83---
84name: test_urem_udiv
85tracksRegLiveness: true
86legalized: true
87body: |
88  bb.0:
89    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
90    ; CHECK-LABEL: name: test_urem_udiv
91    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
92    ; CHECK: %src1:_(s32) = COPY $vgpr0
93    ; CHECK: %src2:_(s32) = COPY $vgpr1
94    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
95    ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5
96    ; CHECK: %rem:_(s32) = G_UREM %src1, %src2
97    ; CHECK: G_STORE %rem(s32), %ptr1(p1) :: (store (s32), addrspace 1)
98    ; CHECK: %div:_(s32) = G_UDIV %src1, %src2
99    ; CHECK: G_STORE %div(s32), %ptr2(p1) :: (store (s32), addrspace 1)
100    %src1:_(s32) = COPY $vgpr0
101    %src2:_(s32) = COPY $vgpr1
102    %ptr1:_(p1) = COPY $vgpr2_vgpr3
103    %ptr2:_(p1) = COPY $vgpr4_vgpr5
104    %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32)
105    G_STORE %rem:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
106    %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32)
107    G_STORE %div:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
108...
109---
110name: test_sdiv_srem_v2
111tracksRegLiveness: true
112legalized: true
113body: |
114  bb.0:
115    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
116    ; CHECK-LABEL: name: test_sdiv_srem_v2
117    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
118    ; CHECK: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1
119    ; CHECK: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3
120    ; CHECK: %ptr1:_(p1) = COPY $vgpr4_vgpr5
121    ; CHECK: %ptr2:_(p1) = COPY $vgpr6_vgpr7
122    ; CHECK: %div:_(<2 x s32>) = G_SDIV %src1, %src2
123    ; CHECK: G_STORE %div(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1)
124    ; CHECK: %rem:_(<2 x s32>) = G_SREM %src1, %src2
125    ; CHECK: G_STORE %rem(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1)
126    %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1
127    %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3
128    %ptr1:_(p1) = COPY $vgpr4_vgpr5
129    %ptr2:_(p1) = COPY $vgpr6_vgpr7
130    %div:_(<2 x s32>) = G_SDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>)
131    G_STORE %div:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4)
132    %rem:_(<2 x s32>) = G_SREM %src1:_(<2 x s32>), %src2:_(<2 x s32>)
133    G_STORE %rem:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4)
134...
135---
136name: test_udiv_urem_v2
137tracksRegLiveness: true
138legalized: true
139body: |
140  bb.0:
141    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
142    ; CHECK-LABEL: name: test_udiv_urem_v2
143    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
144    ; CHECK: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1
145    ; CHECK: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3
146    ; CHECK: %ptr1:_(p1) = COPY $vgpr4_vgpr5
147    ; CHECK: %ptr2:_(p1) = COPY $vgpr6_vgpr7
148    ; CHECK: %div:_(<2 x s32>) = G_UDIV %src1, %src2
149    ; CHECK: G_STORE %div(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1)
150    ; CHECK: %rem:_(<2 x s32>) = G_UREM %src1, %src2
151    ; CHECK: G_STORE %rem(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1)
152    %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1
153    %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3
154    %ptr1:_(p1) = COPY $vgpr4_vgpr5
155    %ptr2:_(p1) = COPY $vgpr6_vgpr7
156    %div:_(<2 x s32>) = G_UDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>)
157    G_STORE %div:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4)
158    %rem:_(<2 x s32>) = G_UREM %src1:_(<2 x s32>), %src2:_(<2 x s32>)
159    G_STORE %rem:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4)
160...
161---
162name: test_sdiv_srem_extra_sdiv
163tracksRegLiveness: true
164legalized: true
165body: |
166  bb.0:
167    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
168    ; CHECK-LABEL: name: test_sdiv_srem_extra_sdiv
169    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
170    ; CHECK: %src1:_(s32) = COPY $vgpr0
171    ; CHECK: %src2:_(s32) = COPY $vgpr1
172    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
173    ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5
174    ; CHECK: %ptr3:_(p1) = COPY $vgpr6_vgpr7
175    ; CHECK: %div:_(s32) = G_SDIV %src1, %src2
176    ; CHECK: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1)
177    ; CHECK: %rem:_(s32) = G_SREM %src1, %src2
178    ; CHECK: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1)
179    ; CHECK: %div2:_(s32) = G_SDIV %src1, %src2
180    ; CHECK: G_STORE %div2(s32), %ptr3(p1) :: (store (s32), addrspace 1)
181    %src1:_(s32) = COPY $vgpr0
182    %src2:_(s32) = COPY $vgpr1
183    %ptr1:_(p1) = COPY $vgpr2_vgpr3
184    %ptr2:_(p1) = COPY $vgpr4_vgpr5
185    %ptr3:_(p1) = COPY $vgpr6_vgpr7
186    %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
187    G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
188    %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
189    G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
190    %div2:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
191    G_STORE %div2:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4)
192...
193---
194name: test_sdiv_srem_extra_srem
195tracksRegLiveness: true
196legalized: true
197body: |
198  bb.0:
199    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
200    ; CHECK-LABEL: name: test_sdiv_srem_extra_srem
201    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
202    ; CHECK: %src1:_(s32) = COPY $vgpr0
203    ; CHECK: %src2:_(s32) = COPY $vgpr1
204    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
205    ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5
206    ; CHECK: %ptr3:_(p1) = COPY $vgpr6_vgpr7
207    ; CHECK: %div:_(s32) = G_SDIV %src1, %src2
208    ; CHECK: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1)
209    ; CHECK: %rem:_(s32) = G_SREM %src1, %src2
210    ; CHECK: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1)
211    ; CHECK: %rem2:_(s32) = G_SREM %src1, %src2
212    ; CHECK: G_STORE %rem2(s32), %ptr3(p1) :: (store (s32), addrspace 1)
213    %src1:_(s32) = COPY $vgpr0
214    %src2:_(s32) = COPY $vgpr1
215    %ptr1:_(p1) = COPY $vgpr2_vgpr3
216    %ptr2:_(p1) = COPY $vgpr4_vgpr5
217    %ptr3:_(p1) = COPY $vgpr6_vgpr7
218    %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
219    G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
220    %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
221    G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
222    %rem2:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
223    G_STORE %rem2:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4)
224...
225