xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/postlegalizer-combiner-divrem.mir (revision 8871c3c562690347d75190be758312d1f92a7db4)
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-NEXT: {{  $}}
15    ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0
16    ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1
17    ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
18    ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5
19    ; CHECK-NEXT: %div:_(s32) = G_SDIV %src1, %src2
20    ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1)
21    ; CHECK-NEXT: %rem:_(s32) = G_SREM %src1, %src2
22    ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1)
23    %src1:_(s32) = COPY $vgpr0
24    %src2:_(s32) = COPY $vgpr1
25    %ptr1:_(p1) = COPY $vgpr2_vgpr3
26    %ptr2:_(p1) = COPY $vgpr4_vgpr5
27    %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
28    G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
29    %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
30    G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
31...
32---
33name: test_srem_sdiv
34tracksRegLiveness: true
35legalized: true
36body: |
37  bb.0:
38    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
39    ; CHECK-LABEL: name: test_srem_sdiv
40    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
41    ; CHECK-NEXT: {{  $}}
42    ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0
43    ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1
44    ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
45    ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5
46    ; CHECK-NEXT: %rem:_(s32) = G_SREM %src1, %src2
47    ; CHECK-NEXT: G_STORE %rem(s32), %ptr1(p1) :: (store (s32), addrspace 1)
48    ; CHECK-NEXT: %div:_(s32) = G_SDIV %src1, %src2
49    ; CHECK-NEXT: G_STORE %div(s32), %ptr2(p1) :: (store (s32), addrspace 1)
50    %src1:_(s32) = COPY $vgpr0
51    %src2:_(s32) = COPY $vgpr1
52    %ptr1:_(p1) = COPY $vgpr2_vgpr3
53    %ptr2:_(p1) = COPY $vgpr4_vgpr5
54    %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
55    G_STORE %rem:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
56    %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
57    G_STORE %div:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
58...
59---
60name: test_udiv_urem
61tracksRegLiveness: true
62legalized: true
63body: |
64  bb.0:
65    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
66    ; CHECK-LABEL: name: test_udiv_urem
67    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
68    ; CHECK-NEXT: {{  $}}
69    ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0
70    ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1
71    ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
72    ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5
73    ; CHECK-NEXT: %div:_(s32) = G_UDIV %src1, %src2
74    ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1)
75    ; CHECK-NEXT: %rem:_(s32) = G_UREM %src1, %src2
76    ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1)
77    %src1:_(s32) = COPY $vgpr0
78    %src2:_(s32) = COPY $vgpr1
79    %ptr1:_(p1) = COPY $vgpr2_vgpr3
80    %ptr2:_(p1) = COPY $vgpr4_vgpr5
81    %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32)
82    G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
83    %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32)
84    G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
85...
86---
87name: test_urem_udiv
88tracksRegLiveness: true
89legalized: true
90body: |
91  bb.0:
92    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
93    ; CHECK-LABEL: name: test_urem_udiv
94    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
95    ; CHECK-NEXT: {{  $}}
96    ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0
97    ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1
98    ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
99    ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5
100    ; CHECK-NEXT: %rem:_(s32) = G_UREM %src1, %src2
101    ; CHECK-NEXT: G_STORE %rem(s32), %ptr1(p1) :: (store (s32), addrspace 1)
102    ; CHECK-NEXT: %div:_(s32) = G_UDIV %src1, %src2
103    ; CHECK-NEXT: G_STORE %div(s32), %ptr2(p1) :: (store (s32), addrspace 1)
104    %src1:_(s32) = COPY $vgpr0
105    %src2:_(s32) = COPY $vgpr1
106    %ptr1:_(p1) = COPY $vgpr2_vgpr3
107    %ptr2:_(p1) = COPY $vgpr4_vgpr5
108    %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32)
109    G_STORE %rem:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
110    %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32)
111    G_STORE %div:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
112...
113---
114name: test_sdiv_srem_v2
115tracksRegLiveness: true
116legalized: true
117body: |
118  bb.0:
119    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
120    ; CHECK-LABEL: name: test_sdiv_srem_v2
121    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
122    ; CHECK-NEXT: {{  $}}
123    ; CHECK-NEXT: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1
124    ; CHECK-NEXT: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3
125    ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr4_vgpr5
126    ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr6_vgpr7
127    ; CHECK-NEXT: %div:_(<2 x s32>) = G_SDIV %src1, %src2
128    ; CHECK-NEXT: G_STORE %div(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1)
129    ; CHECK-NEXT: %rem:_(<2 x s32>) = G_SREM %src1, %src2
130    ; CHECK-NEXT: G_STORE %rem(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1)
131    %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1
132    %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3
133    %ptr1:_(p1) = COPY $vgpr4_vgpr5
134    %ptr2:_(p1) = COPY $vgpr6_vgpr7
135    %div:_(<2 x s32>) = G_SDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>)
136    G_STORE %div:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4)
137    %rem:_(<2 x s32>) = G_SREM %src1:_(<2 x s32>), %src2:_(<2 x s32>)
138    G_STORE %rem:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4)
139...
140---
141name: test_udiv_urem_v2
142tracksRegLiveness: true
143legalized: true
144body: |
145  bb.0:
146    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
147    ; CHECK-LABEL: name: test_udiv_urem_v2
148    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
149    ; CHECK-NEXT: {{  $}}
150    ; CHECK-NEXT: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1
151    ; CHECK-NEXT: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3
152    ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr4_vgpr5
153    ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr6_vgpr7
154    ; CHECK-NEXT: %div:_(<2 x s32>) = G_UDIV %src1, %src2
155    ; CHECK-NEXT: G_STORE %div(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1)
156    ; CHECK-NEXT: %rem:_(<2 x s32>) = G_UREM %src1, %src2
157    ; CHECK-NEXT: G_STORE %rem(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1)
158    %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1
159    %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3
160    %ptr1:_(p1) = COPY $vgpr4_vgpr5
161    %ptr2:_(p1) = COPY $vgpr6_vgpr7
162    %div:_(<2 x s32>) = G_UDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>)
163    G_STORE %div:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4)
164    %rem:_(<2 x s32>) = G_UREM %src1:_(<2 x s32>), %src2:_(<2 x s32>)
165    G_STORE %rem:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4)
166...
167---
168name: test_sdiv_srem_extra_sdiv
169tracksRegLiveness: true
170legalized: true
171body: |
172  bb.0:
173    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
174    ; CHECK-LABEL: name: test_sdiv_srem_extra_sdiv
175    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
176    ; CHECK-NEXT: {{  $}}
177    ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0
178    ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1
179    ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
180    ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5
181    ; CHECK-NEXT: %ptr3:_(p1) = COPY $vgpr6_vgpr7
182    ; CHECK-NEXT: %div:_(s32) = G_SDIV %src1, %src2
183    ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1)
184    ; CHECK-NEXT: %rem:_(s32) = G_SREM %src1, %src2
185    ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1)
186    ; CHECK-NEXT: %div2:_(s32) = G_SDIV %src1, %src2
187    ; CHECK-NEXT: G_STORE %div2(s32), %ptr3(p1) :: (store (s32), addrspace 1)
188    %src1:_(s32) = COPY $vgpr0
189    %src2:_(s32) = COPY $vgpr1
190    %ptr1:_(p1) = COPY $vgpr2_vgpr3
191    %ptr2:_(p1) = COPY $vgpr4_vgpr5
192    %ptr3:_(p1) = COPY $vgpr6_vgpr7
193    %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
194    G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
195    %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
196    G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
197    %div2:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
198    G_STORE %div2:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4)
199...
200---
201name: test_sdiv_srem_extra_srem
202tracksRegLiveness: true
203legalized: true
204body: |
205  bb.0:
206    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
207    ; CHECK-LABEL: name: test_sdiv_srem_extra_srem
208    ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7
209    ; CHECK-NEXT: {{  $}}
210    ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0
211    ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1
212    ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
213    ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5
214    ; CHECK-NEXT: %ptr3:_(p1) = COPY $vgpr6_vgpr7
215    ; CHECK-NEXT: %div:_(s32) = G_SDIV %src1, %src2
216    ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1)
217    ; CHECK-NEXT: %rem:_(s32) = G_SREM %src1, %src2
218    ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1)
219    ; CHECK-NEXT: %rem2:_(s32) = G_SREM %src1, %src2
220    ; CHECK-NEXT: G_STORE %rem2(s32), %ptr3(p1) :: (store (s32), addrspace 1)
221    %src1:_(s32) = COPY $vgpr0
222    %src2:_(s32) = COPY $vgpr1
223    %ptr1:_(p1) = COPY $vgpr2_vgpr3
224    %ptr2:_(p1) = COPY $vgpr4_vgpr5
225    %ptr3:_(p1) = COPY $vgpr6_vgpr7
226    %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32)
227    G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4)
228    %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
229    G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4)
230    %rem2:_(s32) = G_SREM %src1:_(s32), %src2:_(s32)
231    G_STORE %rem2:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4)
232...
233