[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / RISCV / addimm-mulimm.ll
blob3437305402f014325205e510ab0debd401967994
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,+zba -verify-machineinstrs < %s \
6 ; RUN:   | FileCheck -check-prefix=RV32IMB %s
7 ; RUN: llc -mtriple=riscv64 -mattr=+m,+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:    li a1, 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:    li a1, 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:    li a1, 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:    li a1, 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:    li a2, 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:    li a1, 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:    li a1, 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:    li a1, 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:    li a1, 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:    li a1, 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:    li a2, 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:    li a1, 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 a0, a0, 1971
150 ; RV32IMB-NEXT:    li a1, 29
151 ; RV32IMB-NEXT:    mul a0, a0, a1
152 ; RV32IMB-NEXT:    ret
154 ; RV64IMB-LABEL: add_mul_combine_reject_a1:
155 ; RV64IMB:       # %bb.0:
156 ; RV64IMB-NEXT:    addiw a0, a0, 1971
157 ; RV64IMB-NEXT:    li a1, 29
158 ; RV64IMB-NEXT:    mulw a0, a0, a1
159 ; RV64IMB-NEXT:    ret
160   %tmp0 = add i32 %x, 1971
161   %tmp1 = mul i32 %tmp0, 29
162   ret i32 %tmp1
165 define signext i32 @add_mul_combine_reject_a2(i32 signext %x) {
166 ; RV32IMB-LABEL: add_mul_combine_reject_a2:
167 ; RV32IMB:       # %bb.0:
168 ; RV32IMB-NEXT:    addi a0, a0, 1971
169 ; RV32IMB-NEXT:    li a1, 29
170 ; RV32IMB-NEXT:    mul a0, a0, a1
171 ; RV32IMB-NEXT:    ret
173 ; RV64IMB-LABEL: add_mul_combine_reject_a2:
174 ; RV64IMB:       # %bb.0:
175 ; RV64IMB-NEXT:    addiw a0, a0, 1971
176 ; RV64IMB-NEXT:    li a1, 29
177 ; RV64IMB-NEXT:    mulw a0, a0, a1
178 ; RV64IMB-NEXT:    ret
179   %tmp0 = add i32 %x, 1971
180   %tmp1 = mul i32 %tmp0, 29
181   ret i32 %tmp1
184 define i64 @add_mul_combine_reject_a3(i64 %x) {
185 ; RV32IMB-LABEL: add_mul_combine_reject_a3:
186 ; RV32IMB:       # %bb.0:
187 ; RV32IMB-NEXT:    li a2, 29
188 ; RV32IMB-NEXT:    mul a1, a1, a2
189 ; RV32IMB-NEXT:    mulhu a3, a0, a2
190 ; RV32IMB-NEXT:    add a1, a3, a1
191 ; RV32IMB-NEXT:    mul a2, a0, a2
192 ; RV32IMB-NEXT:    lui a0, 14
193 ; RV32IMB-NEXT:    addi a0, a0, -185
194 ; RV32IMB-NEXT:    add a0, a2, a0
195 ; RV32IMB-NEXT:    sltu a2, a0, a2
196 ; RV32IMB-NEXT:    add a1, a1, a2
197 ; RV32IMB-NEXT:    ret
199 ; RV64IMB-LABEL: add_mul_combine_reject_a3:
200 ; RV64IMB:       # %bb.0:
201 ; RV64IMB-NEXT:    addi a0, a0, 1971
202 ; RV64IMB-NEXT:    li a1, 29
203 ; RV64IMB-NEXT:    mul a0, a0, a1
204 ; RV64IMB-NEXT:    ret
205   %tmp0 = add i64 %x, 1971
206   %tmp1 = mul i64 %tmp0, 29
207   ret i64 %tmp1
210 define i32 @add_mul_combine_reject_c1(i32 %x) {
211 ; RV32IMB-LABEL: add_mul_combine_reject_c1:
212 ; RV32IMB:       # %bb.0:
213 ; RV32IMB-NEXT:    addi a0, a0, 1000
214 ; RV32IMB-NEXT:    sh3add a1, a0, a0
215 ; RV32IMB-NEXT:    sh3add a0, a1, a0
216 ; RV32IMB-NEXT:    ret
218 ; RV64IMB-LABEL: add_mul_combine_reject_c1:
219 ; RV64IMB:       # %bb.0:
220 ; RV64IMB-NEXT:    addi a0, a0, 1000
221 ; RV64IMB-NEXT:    sh3add a1, a0, a0
222 ; RV64IMB-NEXT:    sh3add a0, a1, a0
223 ; RV64IMB-NEXT:    sext.w a0, a0
224 ; RV64IMB-NEXT:    ret
225   %tmp0 = add i32 %x, 1000
226   %tmp1 = mul i32 %tmp0, 73
227   ret i32 %tmp1
230 define signext i32 @add_mul_combine_reject_c2(i32 signext %x) {
231 ; RV32IMB-LABEL: add_mul_combine_reject_c2:
232 ; RV32IMB:       # %bb.0:
233 ; RV32IMB-NEXT:    addi a0, a0, 1000
234 ; RV32IMB-NEXT:    sh3add a1, a0, a0
235 ; RV32IMB-NEXT:    sh3add a0, a1, a0
236 ; RV32IMB-NEXT:    ret
238 ; RV64IMB-LABEL: add_mul_combine_reject_c2:
239 ; RV64IMB:       # %bb.0:
240 ; RV64IMB-NEXT:    addi a0, a0, 1000
241 ; RV64IMB-NEXT:    sh3add a1, a0, a0
242 ; RV64IMB-NEXT:    sh3add a0, a1, a0
243 ; RV64IMB-NEXT:    sext.w a0, a0
244 ; RV64IMB-NEXT:    ret
245   %tmp0 = add i32 %x, 1000
246   %tmp1 = mul i32 %tmp0, 73
247   ret i32 %tmp1
250 define i64 @add_mul_combine_reject_c3(i64 %x) {
251 ; RV32IMB-LABEL: add_mul_combine_reject_c3:
252 ; RV32IMB:       # %bb.0:
253 ; RV32IMB-NEXT:    li a2, 73
254 ; RV32IMB-NEXT:    mul a1, a1, a2
255 ; RV32IMB-NEXT:    mulhu a3, a0, a2
256 ; RV32IMB-NEXT:    add a1, a3, a1
257 ; RV32IMB-NEXT:    mul a2, a0, a2
258 ; RV32IMB-NEXT:    lui a0, 18
259 ; RV32IMB-NEXT:    addi a0, a0, -728
260 ; RV32IMB-NEXT:    add a0, a2, a0
261 ; RV32IMB-NEXT:    sltu a2, a0, a2
262 ; RV32IMB-NEXT:    add a1, a1, a2
263 ; RV32IMB-NEXT:    ret
265 ; RV64IMB-LABEL: add_mul_combine_reject_c3:
266 ; RV64IMB:       # %bb.0:
267 ; RV64IMB-NEXT:    addi a0, a0, 1000
268 ; RV64IMB-NEXT:    sh3add a1, a0, a0
269 ; RV64IMB-NEXT:    sh3add a0, a1, a0
270 ; RV64IMB-NEXT:    ret
271   %tmp0 = add i64 %x, 1000
272   %tmp1 = mul i64 %tmp0, 73
273   ret i64 %tmp1
276 define i32 @add_mul_combine_reject_d1(i32 %x) {
277 ; RV32IMB-LABEL: add_mul_combine_reject_d1:
278 ; RV32IMB:       # %bb.0:
279 ; RV32IMB-NEXT:    addi a0, a0, 1000
280 ; RV32IMB-NEXT:    sh1add a0, a0, a0
281 ; RV32IMB-NEXT:    slli a0, a0, 6
282 ; RV32IMB-NEXT:    ret
284 ; RV64IMB-LABEL: add_mul_combine_reject_d1:
285 ; RV64IMB:       # %bb.0:
286 ; RV64IMB-NEXT:    addi a0, a0, 1000
287 ; RV64IMB-NEXT:    sh1add a0, a0, a0
288 ; RV64IMB-NEXT:    slliw a0, a0, 6
289 ; RV64IMB-NEXT:    ret
290   %tmp0 = add i32 %x, 1000
291   %tmp1 = mul i32 %tmp0, 192
292   ret i32 %tmp1
295 define signext i32 @add_mul_combine_reject_d2(i32 signext %x) {
296 ; RV32IMB-LABEL: add_mul_combine_reject_d2:
297 ; RV32IMB:       # %bb.0:
298 ; RV32IMB-NEXT:    addi a0, a0, 1000
299 ; RV32IMB-NEXT:    sh1add a0, a0, a0
300 ; RV32IMB-NEXT:    slli a0, a0, 6
301 ; RV32IMB-NEXT:    ret
303 ; RV64IMB-LABEL: add_mul_combine_reject_d2:
304 ; RV64IMB:       # %bb.0:
305 ; RV64IMB-NEXT:    addi a0, a0, 1000
306 ; RV64IMB-NEXT:    sh1add a0, a0, a0
307 ; RV64IMB-NEXT:    slliw a0, a0, 6
308 ; RV64IMB-NEXT:    ret
309   %tmp0 = add i32 %x, 1000
310   %tmp1 = mul i32 %tmp0, 192
311   ret i32 %tmp1
314 define i64 @add_mul_combine_reject_d3(i64 %x) {
315 ; RV32IMB-LABEL: add_mul_combine_reject_d3:
316 ; RV32IMB:       # %bb.0:
317 ; RV32IMB-NEXT:    li a2, 192
318 ; RV32IMB-NEXT:    mulhu a2, a0, a2
319 ; RV32IMB-NEXT:    sh1add a1, a1, a1
320 ; RV32IMB-NEXT:    slli a1, a1, 6
321 ; RV32IMB-NEXT:    add a1, a2, a1
322 ; RV32IMB-NEXT:    sh1add a0, a0, a0
323 ; RV32IMB-NEXT:    slli a2, a0, 6
324 ; RV32IMB-NEXT:    lui a0, 47
325 ; RV32IMB-NEXT:    addi a0, a0, -512
326 ; RV32IMB-NEXT:    add a0, a2, a0
327 ; RV32IMB-NEXT:    sltu a2, a0, a2
328 ; RV32IMB-NEXT:    add a1, a1, a2
329 ; RV32IMB-NEXT:    ret
331 ; RV64IMB-LABEL: add_mul_combine_reject_d3:
332 ; RV64IMB:       # %bb.0:
333 ; RV64IMB-NEXT:    addi a0, a0, 1000
334 ; RV64IMB-NEXT:    sh1add a0, a0, a0
335 ; RV64IMB-NEXT:    slli a0, a0, 6
336 ; RV64IMB-NEXT:    ret
337   %tmp0 = add i64 %x, 1000
338   %tmp1 = mul i64 %tmp0, 192
339   ret i64 %tmp1
342 define i32 @add_mul_combine_reject_e1(i32 %x) {
343 ; RV32IMB-LABEL: add_mul_combine_reject_e1:
344 ; RV32IMB:       # %bb.0:
345 ; RV32IMB-NEXT:    addi a0, a0, 1971
346 ; RV32IMB-NEXT:    li a1, 29
347 ; RV32IMB-NEXT:    mul a0, a0, a1
348 ; RV32IMB-NEXT:    ret
350 ; RV64IMB-LABEL: add_mul_combine_reject_e1:
351 ; RV64IMB:       # %bb.0:
352 ; RV64IMB-NEXT:    addiw a0, a0, 1971
353 ; RV64IMB-NEXT:    li a1, 29
354 ; RV64IMB-NEXT:    mulw a0, a0, a1
355 ; RV64IMB-NEXT:    ret
356   %tmp0 = mul i32 %x, 29
357   %tmp1 = add i32 %tmp0, 57159
358   ret i32 %tmp1
361 define signext i32 @add_mul_combine_reject_e2(i32 signext %x) {
362 ; RV32IMB-LABEL: add_mul_combine_reject_e2:
363 ; RV32IMB:       # %bb.0:
364 ; RV32IMB-NEXT:    addi a0, a0, 1971
365 ; RV32IMB-NEXT:    li a1, 29
366 ; RV32IMB-NEXT:    mul a0, a0, a1
367 ; RV32IMB-NEXT:    ret
369 ; RV64IMB-LABEL: add_mul_combine_reject_e2:
370 ; RV64IMB:       # %bb.0:
371 ; RV64IMB-NEXT:    addiw a0, a0, 1971
372 ; RV64IMB-NEXT:    li a1, 29
373 ; RV64IMB-NEXT:    mulw a0, a0, a1
374 ; RV64IMB-NEXT:    ret
375   %tmp0 = mul i32 %x, 29
376   %tmp1 = add i32 %tmp0, 57159
377   ret i32 %tmp1
380 define i64 @add_mul_combine_reject_e3(i64 %x) {
381 ; RV32IMB-LABEL: add_mul_combine_reject_e3:
382 ; RV32IMB:       # %bb.0:
383 ; RV32IMB-NEXT:    li a2, 29
384 ; RV32IMB-NEXT:    mul a1, a1, a2
385 ; RV32IMB-NEXT:    mulhu a3, a0, a2
386 ; RV32IMB-NEXT:    add a1, a3, a1
387 ; RV32IMB-NEXT:    mul a2, a0, a2
388 ; RV32IMB-NEXT:    lui a0, 14
389 ; RV32IMB-NEXT:    addi a0, a0, -185
390 ; RV32IMB-NEXT:    add a0, a2, a0
391 ; RV32IMB-NEXT:    sltu a2, a0, a2
392 ; RV32IMB-NEXT:    add a1, a1, a2
393 ; RV32IMB-NEXT:    ret
395 ; RV64IMB-LABEL: add_mul_combine_reject_e3:
396 ; RV64IMB:       # %bb.0:
397 ; RV64IMB-NEXT:    addi a0, a0, 1971
398 ; RV64IMB-NEXT:    li a1, 29
399 ; RV64IMB-NEXT:    mul a0, a0, a1
400 ; RV64IMB-NEXT:    ret
401   %tmp0 = mul i64 %x, 29
402   %tmp1 = add i64 %tmp0, 57159
403   ret i64 %tmp1
406 define i32 @add_mul_combine_reject_f1(i32 %x) {
407 ; RV32IMB-LABEL: add_mul_combine_reject_f1:
408 ; RV32IMB:       # %bb.0:
409 ; RV32IMB-NEXT:    addi a0, a0, 1972
410 ; RV32IMB-NEXT:    li a1, 29
411 ; RV32IMB-NEXT:    mul a0, a0, a1
412 ; RV32IMB-NEXT:    addi a0, a0, 11
413 ; RV32IMB-NEXT:    ret
415 ; RV64IMB-LABEL: add_mul_combine_reject_f1:
416 ; RV64IMB:       # %bb.0:
417 ; RV64IMB-NEXT:    addiw a0, a0, 1972
418 ; RV64IMB-NEXT:    li a1, 29
419 ; RV64IMB-NEXT:    mulw a0, a0, a1
420 ; RV64IMB-NEXT:    addiw a0, a0, 11
421 ; RV64IMB-NEXT:    ret
422   %tmp0 = mul i32 %x, 29
423   %tmp1 = add i32 %tmp0, 57199
424   ret i32 %tmp1
427 define signext i32 @add_mul_combine_reject_f2(i32 signext %x) {
428 ; RV32IMB-LABEL: add_mul_combine_reject_f2:
429 ; RV32IMB:       # %bb.0:
430 ; RV32IMB-NEXT:    addi a0, a0, 1972
431 ; RV32IMB-NEXT:    li a1, 29
432 ; RV32IMB-NEXT:    mul a0, a0, a1
433 ; RV32IMB-NEXT:    addi a0, a0, 11
434 ; RV32IMB-NEXT:    ret
436 ; RV64IMB-LABEL: add_mul_combine_reject_f2:
437 ; RV64IMB:       # %bb.0:
438 ; RV64IMB-NEXT:    addiw a0, a0, 1972
439 ; RV64IMB-NEXT:    li a1, 29
440 ; RV64IMB-NEXT:    mulw a0, a0, a1
441 ; RV64IMB-NEXT:    addiw a0, a0, 11
442 ; RV64IMB-NEXT:    ret
443   %tmp0 = mul i32 %x, 29
444   %tmp1 = add i32 %tmp0, 57199
445   ret i32 %tmp1
448 define i64 @add_mul_combine_reject_f3(i64 %x) {
449 ; RV32IMB-LABEL: add_mul_combine_reject_f3:
450 ; RV32IMB:       # %bb.0:
451 ; RV32IMB-NEXT:    li a2, 29
452 ; RV32IMB-NEXT:    mul a1, a1, a2
453 ; RV32IMB-NEXT:    mulhu a3, a0, a2
454 ; RV32IMB-NEXT:    add a1, a3, a1
455 ; RV32IMB-NEXT:    mul a2, a0, a2
456 ; RV32IMB-NEXT:    lui a0, 14
457 ; RV32IMB-NEXT:    addi a0, a0, -145
458 ; RV32IMB-NEXT:    add a0, a2, a0
459 ; RV32IMB-NEXT:    sltu a2, a0, a2
460 ; RV32IMB-NEXT:    add a1, a1, a2
461 ; RV32IMB-NEXT:    ret
463 ; RV64IMB-LABEL: add_mul_combine_reject_f3:
464 ; RV64IMB:       # %bb.0:
465 ; RV64IMB-NEXT:    addi a0, a0, 1972
466 ; RV64IMB-NEXT:    li a1, 29
467 ; RV64IMB-NEXT:    mul a0, a0, a1
468 ; RV64IMB-NEXT:    addi a0, a0, 11
469 ; RV64IMB-NEXT:    ret
470   %tmp0 = mul i64 %x, 29
471   %tmp1 = add i64 %tmp0, 57199
472   ret i64 %tmp1
475 define i32 @add_mul_combine_reject_g1(i32 %x) {
476 ; RV32IMB-LABEL: add_mul_combine_reject_g1:
477 ; RV32IMB:       # %bb.0:
478 ; RV32IMB-NEXT:    addi a0, a0, 100
479 ; RV32IMB-NEXT:    sh3add a1, a0, a0
480 ; RV32IMB-NEXT:    sh3add a0, a1, a0
481 ; RV32IMB-NEXT:    addi a0, a0, 10
482 ; RV32IMB-NEXT:    ret
484 ; RV64IMB-LABEL: add_mul_combine_reject_g1:
485 ; RV64IMB:       # %bb.0:
486 ; RV64IMB-NEXT:    addi a0, a0, 100
487 ; RV64IMB-NEXT:    sh3add a1, a0, a0
488 ; RV64IMB-NEXT:    sh3add a0, a1, a0
489 ; RV64IMB-NEXT:    addiw a0, a0, 10
490 ; RV64IMB-NEXT:    ret
491   %tmp0 = mul i32 %x, 73
492   %tmp1 = add i32 %tmp0, 7310
493   ret i32 %tmp1
496 define signext i32 @add_mul_combine_reject_g2(i32 signext %x) {
497 ; RV32IMB-LABEL: add_mul_combine_reject_g2:
498 ; RV32IMB:       # %bb.0:
499 ; RV32IMB-NEXT:    addi a0, a0, 100
500 ; RV32IMB-NEXT:    sh3add a1, a0, a0
501 ; RV32IMB-NEXT:    sh3add a0, a1, a0
502 ; RV32IMB-NEXT:    addi a0, a0, 10
503 ; RV32IMB-NEXT:    ret
505 ; RV64IMB-LABEL: add_mul_combine_reject_g2:
506 ; RV64IMB:       # %bb.0:
507 ; RV64IMB-NEXT:    addi a0, a0, 100
508 ; RV64IMB-NEXT:    sh3add a1, a0, a0
509 ; RV64IMB-NEXT:    sh3add a0, a1, a0
510 ; RV64IMB-NEXT:    addiw a0, a0, 10
511 ; RV64IMB-NEXT:    ret
512   %tmp0 = mul i32 %x, 73
513   %tmp1 = add i32 %tmp0, 7310
514   ret i32 %tmp1
517 define i64 @add_mul_combine_reject_g3(i64 %x) {
518 ; RV32IMB-LABEL: add_mul_combine_reject_g3:
519 ; RV32IMB:       # %bb.0:
520 ; RV32IMB-NEXT:    li a2, 73
521 ; RV32IMB-NEXT:    mul a1, a1, a2
522 ; RV32IMB-NEXT:    mulhu a3, a0, a2
523 ; RV32IMB-NEXT:    add a1, a3, a1
524 ; RV32IMB-NEXT:    mul a2, a0, a2
525 ; RV32IMB-NEXT:    lui a0, 2
526 ; RV32IMB-NEXT:    addi a0, a0, -882
527 ; RV32IMB-NEXT:    add a0, a2, a0
528 ; RV32IMB-NEXT:    sltu a2, a0, a2
529 ; RV32IMB-NEXT:    add a1, a1, a2
530 ; RV32IMB-NEXT:    ret
532 ; RV64IMB-LABEL: add_mul_combine_reject_g3:
533 ; RV64IMB:       # %bb.0:
534 ; RV64IMB-NEXT:    addi a0, a0, 100
535 ; RV64IMB-NEXT:    sh3add a1, a0, a0
536 ; RV64IMB-NEXT:    sh3add a0, a1, a0
537 ; RV64IMB-NEXT:    addi a0, a0, 10
538 ; RV64IMB-NEXT:    ret
539   %tmp0 = mul i64 %x, 73
540   %tmp1 = add i64 %tmp0, 7310
541   ret i64 %tmp1
544 ; This test previously infinite looped in DAG combine.
545 define i64 @add_mul_combine_infinite_loop(i64 %x) {
546 ; RV32IMB-LABEL: add_mul_combine_infinite_loop:
547 ; RV32IMB:       # %bb.0:
548 ; RV32IMB-NEXT:    li a2, 24
549 ; RV32IMB-NEXT:    mulhu a2, a0, a2
550 ; RV32IMB-NEXT:    sh1add a1, a1, a1
551 ; RV32IMB-NEXT:    sh3add a1, a1, a2
552 ; RV32IMB-NEXT:    sh1add a0, a0, a0
553 ; RV32IMB-NEXT:    slli a2, a0, 3
554 ; RV32IMB-NEXT:    addi a0, a2, 2047
555 ; RV32IMB-NEXT:    addi a0, a0, 1
556 ; RV32IMB-NEXT:    sltu a2, a0, a2
557 ; RV32IMB-NEXT:    add a1, a1, a2
558 ; RV32IMB-NEXT:    ret
560 ; RV64IMB-LABEL: add_mul_combine_infinite_loop:
561 ; RV64IMB:       # %bb.0:
562 ; RV64IMB-NEXT:    addi a0, a0, 86
563 ; RV64IMB-NEXT:    sh1add a0, a0, a0
564 ; RV64IMB-NEXT:    li a1, -16
565 ; RV64IMB-NEXT:    sh3add a0, a0, a1
566 ; RV64IMB-NEXT:    ret
567   %tmp0 = mul i64 %x, 24
568   %tmp1 = add i64 %tmp0, 2048
569   ret i64 %tmp1
572 define i32 @mul3000_add8990_a(i32 %x) {
573 ; RV32IMB-LABEL: mul3000_add8990_a:
574 ; RV32IMB:       # %bb.0:
575 ; RV32IMB-NEXT:    addi a0, a0, 3
576 ; RV32IMB-NEXT:    lui a1, 1
577 ; RV32IMB-NEXT:    addi a1, a1, -1096
578 ; RV32IMB-NEXT:    mul a0, a0, a1
579 ; RV32IMB-NEXT:    addi a0, a0, -10
580 ; RV32IMB-NEXT:    ret
582 ; RV64IMB-LABEL: mul3000_add8990_a:
583 ; RV64IMB:       # %bb.0:
584 ; RV64IMB-NEXT:    addiw a0, a0, 3
585 ; RV64IMB-NEXT:    lui a1, 1
586 ; RV64IMB-NEXT:    addiw a1, a1, -1096
587 ; RV64IMB-NEXT:    mulw a0, a0, a1
588 ; RV64IMB-NEXT:    addiw a0, a0, -10
589 ; RV64IMB-NEXT:    ret
590   %tmp0 = mul i32 %x, 3000
591   %tmp1 = add i32 %tmp0, 8990
592   ret i32 %tmp1
595 define signext i32 @mul3000_add8990_b(i32 signext %x) {
596 ; RV32IMB-LABEL: mul3000_add8990_b:
597 ; RV32IMB:       # %bb.0:
598 ; RV32IMB-NEXT:    addi a0, a0, 3
599 ; RV32IMB-NEXT:    lui a1, 1
600 ; RV32IMB-NEXT:    addi a1, a1, -1096
601 ; RV32IMB-NEXT:    mul a0, a0, a1
602 ; RV32IMB-NEXT:    addi a0, a0, -10
603 ; RV32IMB-NEXT:    ret
605 ; RV64IMB-LABEL: mul3000_add8990_b:
606 ; RV64IMB:       # %bb.0:
607 ; RV64IMB-NEXT:    addiw a0, a0, 3
608 ; RV64IMB-NEXT:    lui a1, 1
609 ; RV64IMB-NEXT:    addiw a1, a1, -1096
610 ; RV64IMB-NEXT:    mulw a0, a0, a1
611 ; RV64IMB-NEXT:    addiw a0, a0, -10
612 ; RV64IMB-NEXT:    ret
613   %tmp0 = mul i32 %x, 3000
614   %tmp1 = add i32 %tmp0, 8990
615   ret i32 %tmp1
618 define i64 @mul3000_add8990_c(i64 %x) {
619 ; RV32IMB-LABEL: mul3000_add8990_c:
620 ; RV32IMB:       # %bb.0:
621 ; RV32IMB-NEXT:    lui a2, 1
622 ; RV32IMB-NEXT:    addi a2, a2, -1096
623 ; RV32IMB-NEXT:    mul a1, a1, a2
624 ; RV32IMB-NEXT:    mulhu a3, a0, a2
625 ; RV32IMB-NEXT:    add a1, a3, a1
626 ; RV32IMB-NEXT:    mul a2, a0, a2
627 ; RV32IMB-NEXT:    lui a0, 2
628 ; RV32IMB-NEXT:    addi a0, a0, 798
629 ; RV32IMB-NEXT:    add a0, a2, a0
630 ; RV32IMB-NEXT:    sltu a2, a0, a2
631 ; RV32IMB-NEXT:    add a1, a1, a2
632 ; RV32IMB-NEXT:    ret
634 ; RV64IMB-LABEL: mul3000_add8990_c:
635 ; RV64IMB:       # %bb.0:
636 ; RV64IMB-NEXT:    addi a0, a0, 3
637 ; RV64IMB-NEXT:    lui a1, 1
638 ; RV64IMB-NEXT:    addiw a1, a1, -1096
639 ; RV64IMB-NEXT:    mul a0, a0, a1
640 ; RV64IMB-NEXT:    addi a0, a0, -10
641 ; RV64IMB-NEXT:    ret
642   %tmp0 = mul i64 %x, 3000
643   %tmp1 = add i64 %tmp0, 8990
644   ret i64 %tmp1
647 define i32 @mul3000_sub8990_a(i32 %x) {
648 ; RV32IMB-LABEL: mul3000_sub8990_a:
649 ; RV32IMB:       # %bb.0:
650 ; RV32IMB-NEXT:    addi a0, a0, -3
651 ; RV32IMB-NEXT:    lui a1, 1
652 ; RV32IMB-NEXT:    addi a1, a1, -1096
653 ; RV32IMB-NEXT:    mul a0, a0, a1
654 ; RV32IMB-NEXT:    addi a0, a0, 10
655 ; RV32IMB-NEXT:    ret
657 ; RV64IMB-LABEL: mul3000_sub8990_a:
658 ; RV64IMB:       # %bb.0:
659 ; RV64IMB-NEXT:    addiw a0, a0, -3
660 ; RV64IMB-NEXT:    lui a1, 1
661 ; RV64IMB-NEXT:    addiw a1, a1, -1096
662 ; RV64IMB-NEXT:    mulw a0, a0, a1
663 ; RV64IMB-NEXT:    addiw a0, a0, 10
664 ; RV64IMB-NEXT:    ret
665   %tmp0 = mul i32 %x, 3000
666   %tmp1 = add i32 %tmp0, -8990
667   ret i32 %tmp1
670 define signext i32 @mul3000_sub8990_b(i32 signext %x) {
671 ; RV32IMB-LABEL: mul3000_sub8990_b:
672 ; RV32IMB:       # %bb.0:
673 ; RV32IMB-NEXT:    addi a0, a0, -3
674 ; RV32IMB-NEXT:    lui a1, 1
675 ; RV32IMB-NEXT:    addi a1, a1, -1096
676 ; RV32IMB-NEXT:    mul a0, a0, a1
677 ; RV32IMB-NEXT:    addi a0, a0, 10
678 ; RV32IMB-NEXT:    ret
680 ; RV64IMB-LABEL: mul3000_sub8990_b:
681 ; RV64IMB:       # %bb.0:
682 ; RV64IMB-NEXT:    addiw a0, a0, -3
683 ; RV64IMB-NEXT:    lui a1, 1
684 ; RV64IMB-NEXT:    addiw a1, a1, -1096
685 ; RV64IMB-NEXT:    mulw a0, a0, a1
686 ; RV64IMB-NEXT:    addiw a0, a0, 10
687 ; RV64IMB-NEXT:    ret
688   %tmp0 = mul i32 %x, 3000
689   %tmp1 = add i32 %tmp0, -8990
690   ret i32 %tmp1
693 define i64 @mul3000_sub8990_c(i64 %x) {
694 ; RV32IMB-LABEL: mul3000_sub8990_c:
695 ; RV32IMB:       # %bb.0:
696 ; RV32IMB-NEXT:    lui a2, 1
697 ; RV32IMB-NEXT:    addi a2, a2, -1096
698 ; RV32IMB-NEXT:    mul a1, a1, a2
699 ; RV32IMB-NEXT:    mulhu a3, a0, a2
700 ; RV32IMB-NEXT:    add a1, a3, a1
701 ; RV32IMB-NEXT:    mul a2, a0, a2
702 ; RV32IMB-NEXT:    lui a0, 1048574
703 ; RV32IMB-NEXT:    addi a0, a0, -798
704 ; RV32IMB-NEXT:    add a0, a2, a0
705 ; RV32IMB-NEXT:    sltu a2, a0, a2
706 ; RV32IMB-NEXT:    add a1, a1, a2
707 ; RV32IMB-NEXT:    addi a1, a1, -1
708 ; RV32IMB-NEXT:    ret
710 ; RV64IMB-LABEL: mul3000_sub8990_c:
711 ; RV64IMB:       # %bb.0:
712 ; RV64IMB-NEXT:    addi a0, a0, -3
713 ; RV64IMB-NEXT:    lui a1, 1
714 ; RV64IMB-NEXT:    addiw a1, a1, -1096
715 ; RV64IMB-NEXT:    mul a0, a0, a1
716 ; RV64IMB-NEXT:    addi a0, a0, 10
717 ; RV64IMB-NEXT:    ret
718   %tmp0 = mul i64 %x, 3000
719   %tmp1 = add i64 %tmp0, -8990
720   ret i64 %tmp1
723 define i32 @mulneg3000_add8990_a(i32 %x) {
724 ; RV32IMB-LABEL: mulneg3000_add8990_a:
725 ; RV32IMB:       # %bb.0:
726 ; RV32IMB-NEXT:    addi a0, a0, -3
727 ; RV32IMB-NEXT:    lui a1, 1048575
728 ; RV32IMB-NEXT:    addi a1, a1, 1096
729 ; RV32IMB-NEXT:    mul a0, a0, a1
730 ; RV32IMB-NEXT:    addi a0, a0, -10
731 ; RV32IMB-NEXT:    ret
733 ; RV64IMB-LABEL: mulneg3000_add8990_a:
734 ; RV64IMB:       # %bb.0:
735 ; RV64IMB-NEXT:    addiw a0, a0, -3
736 ; RV64IMB-NEXT:    lui a1, 1048575
737 ; RV64IMB-NEXT:    addiw a1, a1, 1096
738 ; RV64IMB-NEXT:    mulw a0, a0, a1
739 ; RV64IMB-NEXT:    addiw a0, a0, -10
740 ; RV64IMB-NEXT:    ret
741   %tmp0 = mul i32 %x, -3000
742   %tmp1 = add i32 %tmp0, 8990
743   ret i32 %tmp1
746 define signext i32 @mulneg3000_add8990_b(i32 signext %x) {
747 ; RV32IMB-LABEL: mulneg3000_add8990_b:
748 ; RV32IMB:       # %bb.0:
749 ; RV32IMB-NEXT:    addi a0, a0, -3
750 ; RV32IMB-NEXT:    lui a1, 1048575
751 ; RV32IMB-NEXT:    addi a1, a1, 1096
752 ; RV32IMB-NEXT:    mul a0, a0, a1
753 ; RV32IMB-NEXT:    addi a0, a0, -10
754 ; RV32IMB-NEXT:    ret
756 ; RV64IMB-LABEL: mulneg3000_add8990_b:
757 ; RV64IMB:       # %bb.0:
758 ; RV64IMB-NEXT:    addiw a0, a0, -3
759 ; RV64IMB-NEXT:    lui a1, 1048575
760 ; RV64IMB-NEXT:    addiw a1, a1, 1096
761 ; RV64IMB-NEXT:    mulw a0, a0, a1
762 ; RV64IMB-NEXT:    addiw a0, a0, -10
763 ; RV64IMB-NEXT:    ret
764   %tmp0 = mul i32 %x, -3000
765   %tmp1 = add i32 %tmp0, 8990
766   ret i32 %tmp1
769 define i64 @mulneg3000_add8990_c(i64 %x) {
770 ; RV32IMB-LABEL: mulneg3000_add8990_c:
771 ; RV32IMB:       # %bb.0:
772 ; RV32IMB-NEXT:    lui a2, 1048575
773 ; RV32IMB-NEXT:    addi a2, a2, 1096
774 ; RV32IMB-NEXT:    mul a1, a1, a2
775 ; RV32IMB-NEXT:    mulhu a3, a0, a2
776 ; RV32IMB-NEXT:    sub a3, a3, a0
777 ; RV32IMB-NEXT:    add a1, a3, a1
778 ; RV32IMB-NEXT:    mul a2, a0, a2
779 ; RV32IMB-NEXT:    lui a0, 2
780 ; RV32IMB-NEXT:    addi a0, a0, 798
781 ; RV32IMB-NEXT:    add a0, a2, a0
782 ; RV32IMB-NEXT:    sltu a2, a0, a2
783 ; RV32IMB-NEXT:    add a1, a1, a2
784 ; RV32IMB-NEXT:    ret
786 ; RV64IMB-LABEL: mulneg3000_add8990_c:
787 ; RV64IMB:       # %bb.0:
788 ; RV64IMB-NEXT:    addi a0, a0, -3
789 ; RV64IMB-NEXT:    lui a1, 1048575
790 ; RV64IMB-NEXT:    addiw a1, a1, 1096
791 ; RV64IMB-NEXT:    mul a0, a0, a1
792 ; RV64IMB-NEXT:    addi a0, a0, -10
793 ; RV64IMB-NEXT:    ret
794   %tmp0 = mul i64 %x, -3000
795   %tmp1 = add i64 %tmp0, 8990
796   ret i64 %tmp1
799 define i32 @mulneg3000_sub8990_a(i32 %x) {
800 ; RV32IMB-LABEL: mulneg3000_sub8990_a:
801 ; RV32IMB:       # %bb.0:
802 ; RV32IMB-NEXT:    addi a0, a0, 3
803 ; RV32IMB-NEXT:    lui a1, 1048575
804 ; RV32IMB-NEXT:    addi a1, a1, 1096
805 ; RV32IMB-NEXT:    mul a0, a0, a1
806 ; RV32IMB-NEXT:    addi a0, a0, 10
807 ; RV32IMB-NEXT:    ret
809 ; RV64IMB-LABEL: mulneg3000_sub8990_a:
810 ; RV64IMB:       # %bb.0:
811 ; RV64IMB-NEXT:    addiw a0, a0, 3
812 ; RV64IMB-NEXT:    lui a1, 1048575
813 ; RV64IMB-NEXT:    addiw a1, a1, 1096
814 ; RV64IMB-NEXT:    mulw a0, a0, a1
815 ; RV64IMB-NEXT:    addiw a0, a0, 10
816 ; RV64IMB-NEXT:    ret
817   %tmp0 = mul i32 %x, -3000
818   %tmp1 = add i32 %tmp0, -8990
819   ret i32 %tmp1
822 define signext i32 @mulneg3000_sub8990_b(i32 signext %x) {
823 ; RV32IMB-LABEL: mulneg3000_sub8990_b:
824 ; RV32IMB:       # %bb.0:
825 ; RV32IMB-NEXT:    addi a0, a0, 3
826 ; RV32IMB-NEXT:    lui a1, 1048575
827 ; RV32IMB-NEXT:    addi a1, a1, 1096
828 ; RV32IMB-NEXT:    mul a0, a0, a1
829 ; RV32IMB-NEXT:    addi a0, a0, 10
830 ; RV32IMB-NEXT:    ret
832 ; RV64IMB-LABEL: mulneg3000_sub8990_b:
833 ; RV64IMB:       # %bb.0:
834 ; RV64IMB-NEXT:    addiw a0, a0, 3
835 ; RV64IMB-NEXT:    lui a1, 1048575
836 ; RV64IMB-NEXT:    addiw a1, a1, 1096
837 ; RV64IMB-NEXT:    mulw a0, a0, a1
838 ; RV64IMB-NEXT:    addiw a0, a0, 10
839 ; RV64IMB-NEXT:    ret
840   %tmp0 = mul i32 %x, -3000
841   %tmp1 = add i32 %tmp0, -8990
842   ret i32 %tmp1
845 define i64 @mulneg3000_sub8990_c(i64 %x) {
846 ; RV32IMB-LABEL: mulneg3000_sub8990_c:
847 ; RV32IMB:       # %bb.0:
848 ; RV32IMB-NEXT:    lui a2, 1048575
849 ; RV32IMB-NEXT:    addi a2, a2, 1096
850 ; RV32IMB-NEXT:    mul a1, a1, a2
851 ; RV32IMB-NEXT:    mulhu a3, a0, a2
852 ; RV32IMB-NEXT:    sub a3, a3, a0
853 ; RV32IMB-NEXT:    add a1, a3, a1
854 ; RV32IMB-NEXT:    mul a2, a0, a2
855 ; RV32IMB-NEXT:    lui a0, 1048574
856 ; RV32IMB-NEXT:    addi a0, a0, -798
857 ; RV32IMB-NEXT:    add a0, a2, a0
858 ; RV32IMB-NEXT:    sltu a2, a0, a2
859 ; RV32IMB-NEXT:    add a1, a1, a2
860 ; RV32IMB-NEXT:    addi a1, a1, -1
861 ; RV32IMB-NEXT:    ret
863 ; RV64IMB-LABEL: mulneg3000_sub8990_c:
864 ; RV64IMB:       # %bb.0:
865 ; RV64IMB-NEXT:    addi a0, a0, 3
866 ; RV64IMB-NEXT:    lui a1, 1048575
867 ; RV64IMB-NEXT:    addiw a1, a1, 1096
868 ; RV64IMB-NEXT:    mul a0, a0, a1
869 ; RV64IMB-NEXT:    addi a0, a0, 10
870 ; RV64IMB-NEXT:    ret
871   %tmp0 = mul i64 %x, -3000
872   %tmp1 = add i64 %tmp0, -8990
873   ret i64 %tmp1
876 ; This test case previously caused an infinite loop between transformations
877 ; performed in RISCVISelLowering;:transformAddImmMulImm and
878 ; DAGCombiner::visitMUL.
879 define i1 @pr53831(i32 %x) {
880 ; RV32IMB-LABEL: pr53831:
881 ; RV32IMB:       # %bb.0:
882 ; RV32IMB-NEXT:    li a0, 0
883 ; RV32IMB-NEXT:    ret
885 ; RV64IMB-LABEL: pr53831:
886 ; RV64IMB:       # %bb.0:
887 ; RV64IMB-NEXT:    li a0, 0
888 ; RV64IMB-NEXT:    ret
889   %tmp0 = add i32 %x, 1
890   %tmp1 = mul i32 %tmp0, 24
891   %tmp2 = add i32 %tmp1, 1
892   %tmp3 = mul i32 %x, 24
893   %tmp4 = add i32 %tmp3, 2048
894   %tmp5 = icmp eq i32 %tmp4, %tmp2
895   ret i1 %tmp5