[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / RISCV / addimm-mulimm.ll
blobfa1ca2495872f315cbdf742e8fda251bc31579db
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ;; Test that (mul (add x, c1), c2) can be transformed to
3 ;; (add (mul x, c2), c1*c2) if profitable.
5 ; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-zba -verify-machineinstrs < %s \
6 ; RUN:   | FileCheck -check-prefix=RV32IMB %s
7 ; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-zba -verify-machineinstrs < %s \
8 ; RUN:   | FileCheck -check-prefix=RV64IMB %s
10 define i32 @add_mul_combine_accept_a1(i32 %x) {
11 ; RV32IMB-LABEL: add_mul_combine_accept_a1:
12 ; RV32IMB:       # %bb.0:
13 ; RV32IMB-NEXT:    addi a1, zero, 29
14 ; RV32IMB-NEXT:    mul a0, a0, a1
15 ; RV32IMB-NEXT:    addi a0, a0, 1073
16 ; RV32IMB-NEXT:    ret
18 ; RV64IMB-LABEL: add_mul_combine_accept_a1:
19 ; RV64IMB:       # %bb.0:
20 ; RV64IMB-NEXT:    addi a1, zero, 29
21 ; RV64IMB-NEXT:    mulw a0, a0, a1
22 ; RV64IMB-NEXT:    addiw a0, a0, 1073
23 ; RV64IMB-NEXT:    ret
24   %tmp0 = add i32 %x, 37
25   %tmp1 = mul i32 %tmp0, 29
26   ret i32 %tmp1
29 define signext i32 @add_mul_combine_accept_a2(i32 signext %x) {
30 ; RV32IMB-LABEL: add_mul_combine_accept_a2:
31 ; RV32IMB:       # %bb.0:
32 ; RV32IMB-NEXT:    addi a1, zero, 29
33 ; RV32IMB-NEXT:    mul a0, a0, a1
34 ; RV32IMB-NEXT:    addi a0, a0, 1073
35 ; RV32IMB-NEXT:    ret
37 ; RV64IMB-LABEL: add_mul_combine_accept_a2:
38 ; RV64IMB:       # %bb.0:
39 ; RV64IMB-NEXT:    addi a1, zero, 29
40 ; RV64IMB-NEXT:    mulw a0, a0, a1
41 ; RV64IMB-NEXT:    addiw a0, a0, 1073
42 ; RV64IMB-NEXT:    ret
43   %tmp0 = add i32 %x, 37
44   %tmp1 = mul i32 %tmp0, 29
45   ret i32 %tmp1
48 define i64 @add_mul_combine_accept_a3(i64 %x) {
49 ; RV32IMB-LABEL: add_mul_combine_accept_a3:
50 ; RV32IMB:       # %bb.0:
51 ; RV32IMB-NEXT:    addi a2, zero, 29
52 ; RV32IMB-NEXT:    mul a1, a1, a2
53 ; RV32IMB-NEXT:    mulhu a3, a0, a2
54 ; RV32IMB-NEXT:    add a1, a3, a1
55 ; RV32IMB-NEXT:    mul a2, a0, a2
56 ; RV32IMB-NEXT:    addi a0, a2, 1073
57 ; RV32IMB-NEXT:    sltu a2, a0, a2
58 ; RV32IMB-NEXT:    add a1, a1, a2
59 ; RV32IMB-NEXT:    ret
61 ; RV64IMB-LABEL: add_mul_combine_accept_a3:
62 ; RV64IMB:       # %bb.0:
63 ; RV64IMB-NEXT:    addi a1, zero, 29
64 ; RV64IMB-NEXT:    mul a0, a0, a1
65 ; RV64IMB-NEXT:    addi a0, a0, 1073
66 ; RV64IMB-NEXT:    ret
67   %tmp0 = add i64 %x, 37
68   %tmp1 = mul i64 %tmp0, 29
69   ret i64 %tmp1
72 define i32 @add_mul_combine_accept_b1(i32 %x) {
73 ; RV32IMB-LABEL: add_mul_combine_accept_b1:
74 ; RV32IMB:       # %bb.0:
75 ; RV32IMB-NEXT:    addi a1, zero, 23
76 ; RV32IMB-NEXT:    mul a0, a0, a1
77 ; RV32IMB-NEXT:    lui a1, 50
78 ; RV32IMB-NEXT:    addi a1, a1, 1119
79 ; RV32IMB-NEXT:    add a0, a0, a1
80 ; RV32IMB-NEXT:    ret
82 ; RV64IMB-LABEL: add_mul_combine_accept_b1:
83 ; RV64IMB:       # %bb.0:
84 ; RV64IMB-NEXT:    addi a1, zero, 23
85 ; RV64IMB-NEXT:    mulw a0, a0, a1
86 ; RV64IMB-NEXT:    lui a1, 50
87 ; RV64IMB-NEXT:    addiw a1, a1, 1119
88 ; RV64IMB-NEXT:    addw a0, a0, a1
89 ; RV64IMB-NEXT:    ret
90   %tmp0 = add i32 %x, 8953
91   %tmp1 = mul i32 %tmp0, 23
92   ret i32 %tmp1
95 define signext i32 @add_mul_combine_accept_b2(i32 signext %x) {
96 ; RV32IMB-LABEL: add_mul_combine_accept_b2:
97 ; RV32IMB:       # %bb.0:
98 ; RV32IMB-NEXT:    addi a1, zero, 23
99 ; RV32IMB-NEXT:    mul a0, a0, a1
100 ; RV32IMB-NEXT:    lui a1, 50
101 ; RV32IMB-NEXT:    addi a1, a1, 1119
102 ; RV32IMB-NEXT:    add a0, a0, a1
103 ; RV32IMB-NEXT:    ret
105 ; RV64IMB-LABEL: add_mul_combine_accept_b2:
106 ; RV64IMB:       # %bb.0:
107 ; RV64IMB-NEXT:    addi a1, zero, 23
108 ; RV64IMB-NEXT:    mulw a0, a0, a1
109 ; RV64IMB-NEXT:    lui a1, 50
110 ; RV64IMB-NEXT:    addiw a1, a1, 1119
111 ; RV64IMB-NEXT:    addw a0, a0, a1
112 ; RV64IMB-NEXT:    ret
113   %tmp0 = add i32 %x, 8953
114   %tmp1 = mul i32 %tmp0, 23
115   ret i32 %tmp1
118 define i64 @add_mul_combine_accept_b3(i64 %x) {
119 ; RV32IMB-LABEL: add_mul_combine_accept_b3:
120 ; RV32IMB:       # %bb.0:
121 ; RV32IMB-NEXT:    addi a2, zero, 23
122 ; RV32IMB-NEXT:    mul a1, a1, a2
123 ; RV32IMB-NEXT:    mulhu a3, a0, a2
124 ; RV32IMB-NEXT:    add a1, a3, a1
125 ; RV32IMB-NEXT:    mul a2, a0, a2
126 ; RV32IMB-NEXT:    lui a0, 50
127 ; RV32IMB-NEXT:    addi a0, a0, 1119
128 ; RV32IMB-NEXT:    add a0, a2, a0
129 ; RV32IMB-NEXT:    sltu a2, a0, a2
130 ; RV32IMB-NEXT:    add a1, a1, a2
131 ; RV32IMB-NEXT:    ret
133 ; RV64IMB-LABEL: add_mul_combine_accept_b3:
134 ; RV64IMB:       # %bb.0:
135 ; RV64IMB-NEXT:    addi a1, zero, 23
136 ; RV64IMB-NEXT:    mul a0, a0, a1
137 ; RV64IMB-NEXT:    lui a1, 50
138 ; RV64IMB-NEXT:    addiw a1, a1, 1119
139 ; RV64IMB-NEXT:    add a0, a0, a1
140 ; RV64IMB-NEXT:    ret
141   %tmp0 = add i64 %x, 8953
142   %tmp1 = mul i64 %tmp0, 23
143   ret i64 %tmp1
146 define i32 @add_mul_combine_reject_a1(i32 %x) {
147 ; RV32IMB-LABEL: add_mul_combine_reject_a1:
148 ; RV32IMB:       # %bb.0:
149 ; RV32IMB-NEXT:    addi a1, zero, 29
150 ; RV32IMB-NEXT:    mul a0, a0, a1
151 ; RV32IMB-NEXT:    lui a1, 14
152 ; RV32IMB-NEXT:    addi a1, a1, -185
153 ; RV32IMB-NEXT:    add a0, a0, a1
154 ; RV32IMB-NEXT:    ret
156 ; RV64IMB-LABEL: add_mul_combine_reject_a1:
157 ; RV64IMB:       # %bb.0:
158 ; RV64IMB-NEXT:    addi a1, zero, 29
159 ; RV64IMB-NEXT:    mulw a0, a0, a1
160 ; RV64IMB-NEXT:    lui a1, 14
161 ; RV64IMB-NEXT:    addiw a1, a1, -185
162 ; RV64IMB-NEXT:    addw a0, a0, a1
163 ; RV64IMB-NEXT:    ret
164   %tmp0 = add i32 %x, 1971
165   %tmp1 = mul i32 %tmp0, 29
166   ret i32 %tmp1
169 define signext i32 @add_mul_combine_reject_a2(i32 signext %x) {
170 ; RV32IMB-LABEL: add_mul_combine_reject_a2:
171 ; RV32IMB:       # %bb.0:
172 ; RV32IMB-NEXT:    addi a1, zero, 29
173 ; RV32IMB-NEXT:    mul a0, a0, a1
174 ; RV32IMB-NEXT:    lui a1, 14
175 ; RV32IMB-NEXT:    addi a1, a1, -185
176 ; RV32IMB-NEXT:    add a0, a0, a1
177 ; RV32IMB-NEXT:    ret
179 ; RV64IMB-LABEL: add_mul_combine_reject_a2:
180 ; RV64IMB:       # %bb.0:
181 ; RV64IMB-NEXT:    addi a1, zero, 29
182 ; RV64IMB-NEXT:    mulw a0, a0, a1
183 ; RV64IMB-NEXT:    lui a1, 14
184 ; RV64IMB-NEXT:    addiw a1, a1, -185
185 ; RV64IMB-NEXT:    addw a0, a0, a1
186 ; RV64IMB-NEXT:    ret
187   %tmp0 = add i32 %x, 1971
188   %tmp1 = mul i32 %tmp0, 29
189   ret i32 %tmp1
192 define i64 @add_mul_combine_reject_a3(i64 %x) {
193 ; RV32IMB-LABEL: add_mul_combine_reject_a3:
194 ; RV32IMB:       # %bb.0:
195 ; RV32IMB-NEXT:    addi a2, zero, 29
196 ; RV32IMB-NEXT:    mul a1, a1, a2
197 ; RV32IMB-NEXT:    mulhu a3, a0, a2
198 ; RV32IMB-NEXT:    add a1, a3, a1
199 ; RV32IMB-NEXT:    mul a2, a0, a2
200 ; RV32IMB-NEXT:    lui a0, 14
201 ; RV32IMB-NEXT:    addi a0, a0, -185
202 ; RV32IMB-NEXT:    add a0, a2, a0
203 ; RV32IMB-NEXT:    sltu a2, a0, a2
204 ; RV32IMB-NEXT:    add a1, a1, a2
205 ; RV32IMB-NEXT:    ret
207 ; RV64IMB-LABEL: add_mul_combine_reject_a3:
208 ; RV64IMB:       # %bb.0:
209 ; RV64IMB-NEXT:    addi a1, zero, 29
210 ; RV64IMB-NEXT:    mul a0, a0, a1
211 ; RV64IMB-NEXT:    lui a1, 14
212 ; RV64IMB-NEXT:    addiw a1, a1, -185
213 ; RV64IMB-NEXT:    add a0, a0, a1
214 ; RV64IMB-NEXT:    ret
215   %tmp0 = add i64 %x, 1971
216   %tmp1 = mul i64 %tmp0, 29
217   ret i64 %tmp1
220 define i32 @add_mul_combine_reject_c1(i32 %x) {
221 ; RV32IMB-LABEL: add_mul_combine_reject_c1:
222 ; RV32IMB:       # %bb.0:
223 ; RV32IMB-NEXT:    sh3add a1, a0, a0
224 ; RV32IMB-NEXT:    sh3add a0, a1, a0
225 ; RV32IMB-NEXT:    lui a1, 18
226 ; RV32IMB-NEXT:    addi a1, a1, -728
227 ; RV32IMB-NEXT:    add a0, a0, a1
228 ; RV32IMB-NEXT:    ret
230 ; RV64IMB-LABEL: add_mul_combine_reject_c1:
231 ; RV64IMB:       # %bb.0:
232 ; RV64IMB-NEXT:    sh3add a1, a0, a0
233 ; RV64IMB-NEXT:    sh3add a0, a1, a0
234 ; RV64IMB-NEXT:    lui a1, 18
235 ; RV64IMB-NEXT:    addiw a1, a1, -728
236 ; RV64IMB-NEXT:    addw a0, a0, a1
237 ; RV64IMB-NEXT:    ret
238   %tmp0 = add i32 %x, 1000
239   %tmp1 = mul i32 %tmp0, 73
240   ret i32 %tmp1
243 define signext i32 @add_mul_combine_reject_c2(i32 signext %x) {
244 ; RV32IMB-LABEL: add_mul_combine_reject_c2:
245 ; RV32IMB:       # %bb.0:
246 ; RV32IMB-NEXT:    sh3add a1, a0, a0
247 ; RV32IMB-NEXT:    sh3add a0, a1, a0
248 ; RV32IMB-NEXT:    lui a1, 18
249 ; RV32IMB-NEXT:    addi a1, a1, -728
250 ; RV32IMB-NEXT:    add a0, a0, a1
251 ; RV32IMB-NEXT:    ret
253 ; RV64IMB-LABEL: add_mul_combine_reject_c2:
254 ; RV64IMB:       # %bb.0:
255 ; RV64IMB-NEXT:    sh3add a1, a0, a0
256 ; RV64IMB-NEXT:    sh3add a0, a1, a0
257 ; RV64IMB-NEXT:    lui a1, 18
258 ; RV64IMB-NEXT:    addiw a1, a1, -728
259 ; RV64IMB-NEXT:    addw a0, a0, a1
260 ; RV64IMB-NEXT:    ret
261   %tmp0 = add i32 %x, 1000
262   %tmp1 = mul i32 %tmp0, 73
263   ret i32 %tmp1
266 define i64 @add_mul_combine_reject_c3(i64 %x) {
267 ; RV32IMB-LABEL: add_mul_combine_reject_c3:
268 ; RV32IMB:       # %bb.0:
269 ; RV32IMB-NEXT:    addi a2, zero, 73
270 ; RV32IMB-NEXT:    mul a1, a1, a2
271 ; RV32IMB-NEXT:    mulhu a3, a0, a2
272 ; RV32IMB-NEXT:    add a1, a3, a1
273 ; RV32IMB-NEXT:    mul a2, a0, a2
274 ; RV32IMB-NEXT:    lui a0, 18
275 ; RV32IMB-NEXT:    addi a0, a0, -728
276 ; RV32IMB-NEXT:    add a0, a2, a0
277 ; RV32IMB-NEXT:    sltu a2, a0, a2
278 ; RV32IMB-NEXT:    add a1, a1, a2
279 ; RV32IMB-NEXT:    ret
281 ; RV64IMB-LABEL: add_mul_combine_reject_c3:
282 ; RV64IMB:       # %bb.0:
283 ; RV64IMB-NEXT:    sh3add a1, a0, a0
284 ; RV64IMB-NEXT:    sh3add a0, a1, a0
285 ; RV64IMB-NEXT:    lui a1, 18
286 ; RV64IMB-NEXT:    addiw a1, a1, -728
287 ; RV64IMB-NEXT:    add a0, a0, a1
288 ; RV64IMB-NEXT:    ret
289   %tmp0 = add i64 %x, 1000
290   %tmp1 = mul i64 %tmp0, 73
291   ret i64 %tmp1
294 define i32 @add_mul_combine_reject_d1(i32 %x) {
295 ; RV32IMB-LABEL: add_mul_combine_reject_d1:
296 ; RV32IMB:       # %bb.0:
297 ; RV32IMB-NEXT:    sh1add a0, a0, a0
298 ; RV32IMB-NEXT:    slli a0, a0, 6
299 ; RV32IMB-NEXT:    lui a1, 47
300 ; RV32IMB-NEXT:    addi a1, a1, -512
301 ; RV32IMB-NEXT:    add a0, a0, a1
302 ; RV32IMB-NEXT:    ret
304 ; RV64IMB-LABEL: add_mul_combine_reject_d1:
305 ; RV64IMB:       # %bb.0:
306 ; RV64IMB-NEXT:    sh1add a0, a0, a0
307 ; RV64IMB-NEXT:    slli a0, a0, 6
308 ; RV64IMB-NEXT:    lui a1, 47
309 ; RV64IMB-NEXT:    addiw a1, a1, -512
310 ; RV64IMB-NEXT:    addw a0, a0, a1
311 ; RV64IMB-NEXT:    ret
312   %tmp0 = add i32 %x, 1000
313   %tmp1 = mul i32 %tmp0, 192
314   ret i32 %tmp1
317 define signext i32 @add_mul_combine_reject_d2(i32 signext %x) {
318 ; RV32IMB-LABEL: add_mul_combine_reject_d2:
319 ; RV32IMB:       # %bb.0:
320 ; RV32IMB-NEXT:    sh1add a0, a0, a0
321 ; RV32IMB-NEXT:    slli a0, a0, 6
322 ; RV32IMB-NEXT:    lui a1, 47
323 ; RV32IMB-NEXT:    addi a1, a1, -512
324 ; RV32IMB-NEXT:    add a0, a0, a1
325 ; RV32IMB-NEXT:    ret
327 ; RV64IMB-LABEL: add_mul_combine_reject_d2:
328 ; RV64IMB:       # %bb.0:
329 ; RV64IMB-NEXT:    sh1add a0, a0, a0
330 ; RV64IMB-NEXT:    slli a0, a0, 6
331 ; RV64IMB-NEXT:    lui a1, 47
332 ; RV64IMB-NEXT:    addiw a1, a1, -512
333 ; RV64IMB-NEXT:    addw a0, a0, a1
334 ; RV64IMB-NEXT:    ret
335   %tmp0 = add i32 %x, 1000
336   %tmp1 = mul i32 %tmp0, 192
337   ret i32 %tmp1
340 define i64 @add_mul_combine_reject_d3(i64 %x) {
341 ; RV32IMB-LABEL: add_mul_combine_reject_d3:
342 ; RV32IMB:       # %bb.0:
343 ; RV32IMB-NEXT:    addi a2, zero, 192
344 ; RV32IMB-NEXT:    mulhu a2, a0, a2
345 ; RV32IMB-NEXT:    sh1add a1, a1, a1
346 ; RV32IMB-NEXT:    slli a1, a1, 6
347 ; RV32IMB-NEXT:    add a1, a2, a1
348 ; RV32IMB-NEXT:    sh1add a0, a0, a0
349 ; RV32IMB-NEXT:    slli a2, a0, 6
350 ; RV32IMB-NEXT:    lui a0, 47
351 ; RV32IMB-NEXT:    addi a0, a0, -512
352 ; RV32IMB-NEXT:    add a0, a2, a0
353 ; RV32IMB-NEXT:    sltu a2, a0, a2
354 ; RV32IMB-NEXT:    add a1, a1, a2
355 ; RV32IMB-NEXT:    ret
357 ; RV64IMB-LABEL: add_mul_combine_reject_d3:
358 ; RV64IMB:       # %bb.0:
359 ; RV64IMB-NEXT:    sh1add a0, a0, a0
360 ; RV64IMB-NEXT:    slli a0, a0, 6
361 ; RV64IMB-NEXT:    lui a1, 47
362 ; RV64IMB-NEXT:    addiw a1, a1, -512
363 ; RV64IMB-NEXT:    add a0, a0, a1
364 ; RV64IMB-NEXT:    ret
365   %tmp0 = add i64 %x, 1000
366   %tmp1 = mul i64 %tmp0, 192
367   ret i64 %tmp1