Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / addimm-mulimm.ll
bloba18526718461ef1bf777130bd6ffc510b2ea2432
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:    sh1add a1, a0, a0
14 ; RV32IMB-NEXT:    slli a0, a0, 5
15 ; RV32IMB-NEXT:    sub a0, a0, a1
16 ; RV32IMB-NEXT:    addi a0, a0, 1073
17 ; RV32IMB-NEXT:    ret
19 ; RV64IMB-LABEL: add_mul_combine_accept_a1:
20 ; RV64IMB:       # %bb.0:
21 ; RV64IMB-NEXT:    sh1add a1, a0, a0
22 ; RV64IMB-NEXT:    slli a0, a0, 5
23 ; RV64IMB-NEXT:    subw a0, a0, a1
24 ; RV64IMB-NEXT:    addiw a0, a0, 1073
25 ; RV64IMB-NEXT:    ret
26   %tmp0 = add i32 %x, 37
27   %tmp1 = mul i32 %tmp0, 29
28   ret i32 %tmp1
31 define signext i32 @add_mul_combine_accept_a2(i32 signext %x) {
32 ; RV32IMB-LABEL: add_mul_combine_accept_a2:
33 ; RV32IMB:       # %bb.0:
34 ; RV32IMB-NEXT:    sh1add a1, a0, a0
35 ; RV32IMB-NEXT:    slli a0, a0, 5
36 ; RV32IMB-NEXT:    sub a0, a0, a1
37 ; RV32IMB-NEXT:    addi a0, a0, 1073
38 ; RV32IMB-NEXT:    ret
40 ; RV64IMB-LABEL: add_mul_combine_accept_a2:
41 ; RV64IMB:       # %bb.0:
42 ; RV64IMB-NEXT:    sh1add a1, a0, a0
43 ; RV64IMB-NEXT:    slli a0, a0, 5
44 ; RV64IMB-NEXT:    subw a0, a0, a1
45 ; RV64IMB-NEXT:    addiw a0, a0, 1073
46 ; RV64IMB-NEXT:    ret
47   %tmp0 = add i32 %x, 37
48   %tmp1 = mul i32 %tmp0, 29
49   ret i32 %tmp1
52 define i64 @add_mul_combine_accept_a3(i64 %x) {
53 ; RV32IMB-LABEL: add_mul_combine_accept_a3:
54 ; RV32IMB:       # %bb.0:
55 ; RV32IMB-NEXT:    li a2, 29
56 ; RV32IMB-NEXT:    mulhu a2, a0, a2
57 ; RV32IMB-NEXT:    sh1add a3, a1, a1
58 ; RV32IMB-NEXT:    slli a1, a1, 5
59 ; RV32IMB-NEXT:    sub a1, a1, a3
60 ; RV32IMB-NEXT:    add a1, a2, a1
61 ; RV32IMB-NEXT:    sh1add a2, a0, a0
62 ; RV32IMB-NEXT:    slli a0, a0, 5
63 ; RV32IMB-NEXT:    sub a2, a0, a2
64 ; RV32IMB-NEXT:    addi a0, a2, 1073
65 ; RV32IMB-NEXT:    sltu a2, a0, a2
66 ; RV32IMB-NEXT:    add a1, a1, a2
67 ; RV32IMB-NEXT:    ret
69 ; RV64IMB-LABEL: add_mul_combine_accept_a3:
70 ; RV64IMB:       # %bb.0:
71 ; RV64IMB-NEXT:    sh1add a1, a0, a0
72 ; RV64IMB-NEXT:    slli a0, a0, 5
73 ; RV64IMB-NEXT:    sub a0, a0, a1
74 ; RV64IMB-NEXT:    addi a0, a0, 1073
75 ; RV64IMB-NEXT:    ret
76   %tmp0 = add i64 %x, 37
77   %tmp1 = mul i64 %tmp0, 29
78   ret i64 %tmp1
81 define i32 @add_mul_combine_accept_b1(i32 %x) {
82 ; RV32IMB-LABEL: add_mul_combine_accept_b1:
83 ; RV32IMB:       # %bb.0:
84 ; RV32IMB-NEXT:    sh3add a1, a0, a0
85 ; RV32IMB-NEXT:    slli a0, a0, 5
86 ; RV32IMB-NEXT:    sub a0, a0, a1
87 ; RV32IMB-NEXT:    lui a1, 50
88 ; RV32IMB-NEXT:    addi a1, a1, 1119
89 ; RV32IMB-NEXT:    add a0, a0, a1
90 ; RV32IMB-NEXT:    ret
92 ; RV64IMB-LABEL: add_mul_combine_accept_b1:
93 ; RV64IMB:       # %bb.0:
94 ; RV64IMB-NEXT:    sh3add a1, a0, a0
95 ; RV64IMB-NEXT:    slli a0, a0, 5
96 ; RV64IMB-NEXT:    subw a0, a0, a1
97 ; RV64IMB-NEXT:    lui a1, 50
98 ; RV64IMB-NEXT:    addi a1, a1, 1119
99 ; RV64IMB-NEXT:    addw a0, a0, a1
100 ; RV64IMB-NEXT:    ret
101   %tmp0 = add i32 %x, 8953
102   %tmp1 = mul i32 %tmp0, 23
103   ret i32 %tmp1
106 define signext i32 @add_mul_combine_accept_b2(i32 signext %x) {
107 ; RV32IMB-LABEL: add_mul_combine_accept_b2:
108 ; RV32IMB:       # %bb.0:
109 ; RV32IMB-NEXT:    sh3add a1, a0, a0
110 ; RV32IMB-NEXT:    slli a0, a0, 5
111 ; RV32IMB-NEXT:    sub a0, a0, a1
112 ; RV32IMB-NEXT:    lui a1, 50
113 ; RV32IMB-NEXT:    addi a1, a1, 1119
114 ; RV32IMB-NEXT:    add a0, a0, a1
115 ; RV32IMB-NEXT:    ret
117 ; RV64IMB-LABEL: add_mul_combine_accept_b2:
118 ; RV64IMB:       # %bb.0:
119 ; RV64IMB-NEXT:    sh3add a1, a0, a0
120 ; RV64IMB-NEXT:    slli a0, a0, 5
121 ; RV64IMB-NEXT:    subw a0, a0, a1
122 ; RV64IMB-NEXT:    lui a1, 50
123 ; RV64IMB-NEXT:    addi a1, a1, 1119
124 ; RV64IMB-NEXT:    addw a0, a0, a1
125 ; RV64IMB-NEXT:    ret
126   %tmp0 = add i32 %x, 8953
127   %tmp1 = mul i32 %tmp0, 23
128   ret i32 %tmp1
131 define i64 @add_mul_combine_accept_b3(i64 %x) {
132 ; RV32IMB-LABEL: add_mul_combine_accept_b3:
133 ; RV32IMB:       # %bb.0:
134 ; RV32IMB-NEXT:    li a2, 23
135 ; RV32IMB-NEXT:    mulhu a2, a0, a2
136 ; RV32IMB-NEXT:    sh3add a3, a1, a1
137 ; RV32IMB-NEXT:    slli a1, a1, 5
138 ; RV32IMB-NEXT:    sub a1, a1, a3
139 ; RV32IMB-NEXT:    add a1, a2, a1
140 ; RV32IMB-NEXT:    sh3add a2, a0, a0
141 ; RV32IMB-NEXT:    slli a0, a0, 5
142 ; RV32IMB-NEXT:    sub a2, a0, a2
143 ; RV32IMB-NEXT:    lui a0, 50
144 ; RV32IMB-NEXT:    addi a0, a0, 1119
145 ; RV32IMB-NEXT:    add a0, a2, a0
146 ; RV32IMB-NEXT:    sltu a2, a0, a2
147 ; RV32IMB-NEXT:    add a1, a1, a2
148 ; RV32IMB-NEXT:    ret
150 ; RV64IMB-LABEL: add_mul_combine_accept_b3:
151 ; RV64IMB:       # %bb.0:
152 ; RV64IMB-NEXT:    sh3add a1, a0, a0
153 ; RV64IMB-NEXT:    slli a0, a0, 5
154 ; RV64IMB-NEXT:    sub a0, a0, a1
155 ; RV64IMB-NEXT:    lui a1, 50
156 ; RV64IMB-NEXT:    addiw a1, a1, 1119
157 ; RV64IMB-NEXT:    add a0, a0, a1
158 ; RV64IMB-NEXT:    ret
159   %tmp0 = add i64 %x, 8953
160   %tmp1 = mul i64 %tmp0, 23
161   ret i64 %tmp1
164 define i32 @add_mul_combine_reject_a1(i32 %x) {
165 ; RV32IMB-LABEL: add_mul_combine_reject_a1:
166 ; RV32IMB:       # %bb.0:
167 ; RV32IMB-NEXT:    addi a0, a0, 1971
168 ; RV32IMB-NEXT:    sh1add a1, a0, a0
169 ; RV32IMB-NEXT:    slli a0, a0, 5
170 ; RV32IMB-NEXT:    sub a0, a0, a1
171 ; RV32IMB-NEXT:    ret
173 ; RV64IMB-LABEL: add_mul_combine_reject_a1:
174 ; RV64IMB:       # %bb.0:
175 ; RV64IMB-NEXT:    addi a0, a0, 1971
176 ; RV64IMB-NEXT:    sh1add a1, a0, a0
177 ; RV64IMB-NEXT:    slli a0, a0, 5
178 ; RV64IMB-NEXT:    subw a0, a0, a1
179 ; RV64IMB-NEXT:    ret
180   %tmp0 = add i32 %x, 1971
181   %tmp1 = mul i32 %tmp0, 29
182   ret i32 %tmp1
185 define signext i32 @add_mul_combine_reject_a2(i32 signext %x) {
186 ; RV32IMB-LABEL: add_mul_combine_reject_a2:
187 ; RV32IMB:       # %bb.0:
188 ; RV32IMB-NEXT:    addi a0, a0, 1971
189 ; RV32IMB-NEXT:    sh1add a1, a0, a0
190 ; RV32IMB-NEXT:    slli a0, a0, 5
191 ; RV32IMB-NEXT:    sub a0, a0, a1
192 ; RV32IMB-NEXT:    ret
194 ; RV64IMB-LABEL: add_mul_combine_reject_a2:
195 ; RV64IMB:       # %bb.0:
196 ; RV64IMB-NEXT:    addi a0, a0, 1971
197 ; RV64IMB-NEXT:    sh1add a1, a0, a0
198 ; RV64IMB-NEXT:    slli a0, a0, 5
199 ; RV64IMB-NEXT:    subw a0, a0, a1
200 ; RV64IMB-NEXT:    ret
201   %tmp0 = add i32 %x, 1971
202   %tmp1 = mul i32 %tmp0, 29
203   ret i32 %tmp1
206 define i64 @add_mul_combine_reject_a3(i64 %x) {
207 ; RV32IMB-LABEL: add_mul_combine_reject_a3:
208 ; RV32IMB:       # %bb.0:
209 ; RV32IMB-NEXT:    li a2, 29
210 ; RV32IMB-NEXT:    mulhu a2, a0, a2
211 ; RV32IMB-NEXT:    sh1add a3, a1, a1
212 ; RV32IMB-NEXT:    slli a1, a1, 5
213 ; RV32IMB-NEXT:    sub a1, a1, a3
214 ; RV32IMB-NEXT:    add a1, a2, a1
215 ; RV32IMB-NEXT:    sh1add a2, a0, a0
216 ; RV32IMB-NEXT:    slli a0, a0, 5
217 ; RV32IMB-NEXT:    sub a2, a0, a2
218 ; RV32IMB-NEXT:    lui a0, 14
219 ; RV32IMB-NEXT:    addi a0, a0, -185
220 ; RV32IMB-NEXT:    add a0, a2, a0
221 ; RV32IMB-NEXT:    sltu a2, a0, a2
222 ; RV32IMB-NEXT:    add a1, a1, a2
223 ; RV32IMB-NEXT:    ret
225 ; RV64IMB-LABEL: add_mul_combine_reject_a3:
226 ; RV64IMB:       # %bb.0:
227 ; RV64IMB-NEXT:    addi a0, a0, 1971
228 ; RV64IMB-NEXT:    sh1add a1, a0, a0
229 ; RV64IMB-NEXT:    slli a0, a0, 5
230 ; RV64IMB-NEXT:    sub a0, a0, a1
231 ; RV64IMB-NEXT:    ret
232   %tmp0 = add i64 %x, 1971
233   %tmp1 = mul i64 %tmp0, 29
234   ret i64 %tmp1
237 define i32 @add_mul_combine_reject_c1(i32 %x) {
238 ; RV32IMB-LABEL: add_mul_combine_reject_c1:
239 ; RV32IMB:       # %bb.0:
240 ; RV32IMB-NEXT:    addi a0, a0, 1000
241 ; RV32IMB-NEXT:    sh3add a1, a0, a0
242 ; RV32IMB-NEXT:    sh3add a0, a1, a0
243 ; RV32IMB-NEXT:    ret
245 ; RV64IMB-LABEL: add_mul_combine_reject_c1:
246 ; RV64IMB:       # %bb.0:
247 ; RV64IMB-NEXT:    addi a0, a0, 1000
248 ; RV64IMB-NEXT:    sh3add a1, a0, a0
249 ; RV64IMB-NEXT:    sh3add a0, a1, a0
250 ; RV64IMB-NEXT:    sext.w a0, a0
251 ; RV64IMB-NEXT:    ret
252   %tmp0 = add i32 %x, 1000
253   %tmp1 = mul i32 %tmp0, 73
254   ret i32 %tmp1
257 define signext i32 @add_mul_combine_reject_c2(i32 signext %x) {
258 ; RV32IMB-LABEL: add_mul_combine_reject_c2:
259 ; RV32IMB:       # %bb.0:
260 ; RV32IMB-NEXT:    addi a0, a0, 1000
261 ; RV32IMB-NEXT:    sh3add a1, a0, a0
262 ; RV32IMB-NEXT:    sh3add a0, a1, a0
263 ; RV32IMB-NEXT:    ret
265 ; RV64IMB-LABEL: add_mul_combine_reject_c2:
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:    sext.w a0, a0
271 ; RV64IMB-NEXT:    ret
272   %tmp0 = add i32 %x, 1000
273   %tmp1 = mul i32 %tmp0, 73
274   ret i32 %tmp1
277 define i64 @add_mul_combine_reject_c3(i64 %x) {
278 ; RV32IMB-LABEL: add_mul_combine_reject_c3:
279 ; RV32IMB:       # %bb.0:
280 ; RV32IMB-NEXT:    li a2, 73
281 ; RV32IMB-NEXT:    mulhu a2, a0, a2
282 ; RV32IMB-NEXT:    sh3add a3, a1, a1
283 ; RV32IMB-NEXT:    sh3add a1, a3, a1
284 ; RV32IMB-NEXT:    add a1, a2, a1
285 ; RV32IMB-NEXT:    sh3add a2, a0, a0
286 ; RV32IMB-NEXT:    sh3add a2, a2, a0
287 ; RV32IMB-NEXT:    lui a0, 18
288 ; RV32IMB-NEXT:    addi a0, a0, -728
289 ; RV32IMB-NEXT:    add a0, a2, a0
290 ; RV32IMB-NEXT:    sltu a2, a0, a2
291 ; RV32IMB-NEXT:    add a1, a1, a2
292 ; RV32IMB-NEXT:    ret
294 ; RV64IMB-LABEL: add_mul_combine_reject_c3:
295 ; RV64IMB:       # %bb.0:
296 ; RV64IMB-NEXT:    addi a0, a0, 1000
297 ; RV64IMB-NEXT:    sh3add a1, a0, a0
298 ; RV64IMB-NEXT:    sh3add a0, a1, a0
299 ; RV64IMB-NEXT:    ret
300   %tmp0 = add i64 %x, 1000
301   %tmp1 = mul i64 %tmp0, 73
302   ret i64 %tmp1
305 define i32 @add_mul_combine_reject_d1(i32 %x) {
306 ; RV32IMB-LABEL: add_mul_combine_reject_d1:
307 ; RV32IMB:       # %bb.0:
308 ; RV32IMB-NEXT:    addi a0, a0, 1000
309 ; RV32IMB-NEXT:    sh1add a0, a0, a0
310 ; RV32IMB-NEXT:    slli a0, a0, 6
311 ; RV32IMB-NEXT:    ret
313 ; RV64IMB-LABEL: add_mul_combine_reject_d1:
314 ; RV64IMB:       # %bb.0:
315 ; RV64IMB-NEXT:    addi a0, a0, 1000
316 ; RV64IMB-NEXT:    sh1add a0, a0, a0
317 ; RV64IMB-NEXT:    slliw a0, a0, 6
318 ; RV64IMB-NEXT:    ret
319   %tmp0 = add i32 %x, 1000
320   %tmp1 = mul i32 %tmp0, 192
321   ret i32 %tmp1
324 define signext i32 @add_mul_combine_reject_d2(i32 signext %x) {
325 ; RV32IMB-LABEL: add_mul_combine_reject_d2:
326 ; RV32IMB:       # %bb.0:
327 ; RV32IMB-NEXT:    addi a0, a0, 1000
328 ; RV32IMB-NEXT:    sh1add a0, a0, a0
329 ; RV32IMB-NEXT:    slli a0, a0, 6
330 ; RV32IMB-NEXT:    ret
332 ; RV64IMB-LABEL: add_mul_combine_reject_d2:
333 ; RV64IMB:       # %bb.0:
334 ; RV64IMB-NEXT:    addi a0, a0, 1000
335 ; RV64IMB-NEXT:    sh1add a0, a0, a0
336 ; RV64IMB-NEXT:    slliw a0, a0, 6
337 ; RV64IMB-NEXT:    ret
338   %tmp0 = add i32 %x, 1000
339   %tmp1 = mul i32 %tmp0, 192
340   ret i32 %tmp1
343 define i64 @add_mul_combine_reject_d3(i64 %x) {
344 ; RV32IMB-LABEL: add_mul_combine_reject_d3:
345 ; RV32IMB:       # %bb.0:
346 ; RV32IMB-NEXT:    li a2, 192
347 ; RV32IMB-NEXT:    mulhu a2, a0, a2
348 ; RV32IMB-NEXT:    sh1add a1, a1, a1
349 ; RV32IMB-NEXT:    slli a1, a1, 6
350 ; RV32IMB-NEXT:    add a1, a2, a1
351 ; RV32IMB-NEXT:    sh1add a0, a0, a0
352 ; RV32IMB-NEXT:    slli a2, a0, 6
353 ; RV32IMB-NEXT:    lui a0, 47
354 ; RV32IMB-NEXT:    addi a0, a0, -512
355 ; RV32IMB-NEXT:    add a0, a2, a0
356 ; RV32IMB-NEXT:    sltu a2, a0, a2
357 ; RV32IMB-NEXT:    add a1, a1, a2
358 ; RV32IMB-NEXT:    ret
360 ; RV64IMB-LABEL: add_mul_combine_reject_d3:
361 ; RV64IMB:       # %bb.0:
362 ; RV64IMB-NEXT:    addi a0, a0, 1000
363 ; RV64IMB-NEXT:    sh1add a0, a0, a0
364 ; RV64IMB-NEXT:    slli a0, a0, 6
365 ; RV64IMB-NEXT:    ret
366   %tmp0 = add i64 %x, 1000
367   %tmp1 = mul i64 %tmp0, 192
368   ret i64 %tmp1
371 define i32 @add_mul_combine_reject_e1(i32 %x) {
372 ; RV32IMB-LABEL: add_mul_combine_reject_e1:
373 ; RV32IMB:       # %bb.0:
374 ; RV32IMB-NEXT:    addi a0, a0, 1971
375 ; RV32IMB-NEXT:    sh1add a1, a0, a0
376 ; RV32IMB-NEXT:    slli a0, a0, 5
377 ; RV32IMB-NEXT:    sub a0, a0, a1
378 ; RV32IMB-NEXT:    ret
380 ; RV64IMB-LABEL: add_mul_combine_reject_e1:
381 ; RV64IMB:       # %bb.0:
382 ; RV64IMB-NEXT:    addi a0, a0, 1971
383 ; RV64IMB-NEXT:    sh1add a1, a0, a0
384 ; RV64IMB-NEXT:    slli a0, a0, 5
385 ; RV64IMB-NEXT:    subw a0, a0, a1
386 ; RV64IMB-NEXT:    ret
387   %tmp0 = mul i32 %x, 29
388   %tmp1 = add i32 %tmp0, 57159
389   ret i32 %tmp1
392 define signext i32 @add_mul_combine_reject_e2(i32 signext %x) {
393 ; RV32IMB-LABEL: add_mul_combine_reject_e2:
394 ; RV32IMB:       # %bb.0:
395 ; RV32IMB-NEXT:    addi a0, a0, 1971
396 ; RV32IMB-NEXT:    sh1add a1, a0, a0
397 ; RV32IMB-NEXT:    slli a0, a0, 5
398 ; RV32IMB-NEXT:    sub a0, a0, a1
399 ; RV32IMB-NEXT:    ret
401 ; RV64IMB-LABEL: add_mul_combine_reject_e2:
402 ; RV64IMB:       # %bb.0:
403 ; RV64IMB-NEXT:    addi a0, a0, 1971
404 ; RV64IMB-NEXT:    sh1add a1, a0, a0
405 ; RV64IMB-NEXT:    slli a0, a0, 5
406 ; RV64IMB-NEXT:    subw a0, a0, a1
407 ; RV64IMB-NEXT:    ret
408   %tmp0 = mul i32 %x, 29
409   %tmp1 = add i32 %tmp0, 57159
410   ret i32 %tmp1
413 define i64 @add_mul_combine_reject_e3(i64 %x) {
414 ; RV32IMB-LABEL: add_mul_combine_reject_e3:
415 ; RV32IMB:       # %bb.0:
416 ; RV32IMB-NEXT:    li a2, 29
417 ; RV32IMB-NEXT:    mulhu a2, a0, a2
418 ; RV32IMB-NEXT:    sh1add a3, a1, a1
419 ; RV32IMB-NEXT:    slli a1, a1, 5
420 ; RV32IMB-NEXT:    sub a1, a1, a3
421 ; RV32IMB-NEXT:    add a1, a2, a1
422 ; RV32IMB-NEXT:    sh1add a2, a0, a0
423 ; RV32IMB-NEXT:    slli a0, a0, 5
424 ; RV32IMB-NEXT:    sub a2, a0, a2
425 ; RV32IMB-NEXT:    lui a0, 14
426 ; RV32IMB-NEXT:    addi a0, a0, -185
427 ; RV32IMB-NEXT:    add a0, a2, a0
428 ; RV32IMB-NEXT:    sltu a2, a0, a2
429 ; RV32IMB-NEXT:    add a1, a1, a2
430 ; RV32IMB-NEXT:    ret
432 ; RV64IMB-LABEL: add_mul_combine_reject_e3:
433 ; RV64IMB:       # %bb.0:
434 ; RV64IMB-NEXT:    addi a0, a0, 1971
435 ; RV64IMB-NEXT:    sh1add a1, a0, a0
436 ; RV64IMB-NEXT:    slli a0, a0, 5
437 ; RV64IMB-NEXT:    sub a0, a0, a1
438 ; RV64IMB-NEXT:    ret
439   %tmp0 = mul i64 %x, 29
440   %tmp1 = add i64 %tmp0, 57159
441   ret i64 %tmp1
444 define i32 @add_mul_combine_reject_f1(i32 %x) {
445 ; RV32IMB-LABEL: add_mul_combine_reject_f1:
446 ; RV32IMB:       # %bb.0:
447 ; RV32IMB-NEXT:    addi a0, a0, 1972
448 ; RV32IMB-NEXT:    sh1add a1, a0, a0
449 ; RV32IMB-NEXT:    slli a0, a0, 5
450 ; RV32IMB-NEXT:    sub a0, a0, a1
451 ; RV32IMB-NEXT:    addi a0, a0, 11
452 ; RV32IMB-NEXT:    ret
454 ; RV64IMB-LABEL: add_mul_combine_reject_f1:
455 ; RV64IMB:       # %bb.0:
456 ; RV64IMB-NEXT:    addi a0, a0, 1972
457 ; RV64IMB-NEXT:    sh1add a1, a0, a0
458 ; RV64IMB-NEXT:    slli a0, a0, 5
459 ; RV64IMB-NEXT:    subw a0, a0, a1
460 ; RV64IMB-NEXT:    addiw a0, a0, 11
461 ; RV64IMB-NEXT:    ret
462   %tmp0 = mul i32 %x, 29
463   %tmp1 = add i32 %tmp0, 57199
464   ret i32 %tmp1
467 define signext i32 @add_mul_combine_reject_f2(i32 signext %x) {
468 ; RV32IMB-LABEL: add_mul_combine_reject_f2:
469 ; RV32IMB:       # %bb.0:
470 ; RV32IMB-NEXT:    addi a0, a0, 1972
471 ; RV32IMB-NEXT:    sh1add a1, a0, a0
472 ; RV32IMB-NEXT:    slli a0, a0, 5
473 ; RV32IMB-NEXT:    sub a0, a0, a1
474 ; RV32IMB-NEXT:    addi a0, a0, 11
475 ; RV32IMB-NEXT:    ret
477 ; RV64IMB-LABEL: add_mul_combine_reject_f2:
478 ; RV64IMB:       # %bb.0:
479 ; RV64IMB-NEXT:    addi a0, a0, 1972
480 ; RV64IMB-NEXT:    sh1add a1, a0, a0
481 ; RV64IMB-NEXT:    slli a0, a0, 5
482 ; RV64IMB-NEXT:    subw a0, a0, a1
483 ; RV64IMB-NEXT:    addiw a0, a0, 11
484 ; RV64IMB-NEXT:    ret
485   %tmp0 = mul i32 %x, 29
486   %tmp1 = add i32 %tmp0, 57199
487   ret i32 %tmp1
490 define i64 @add_mul_combine_reject_f3(i64 %x) {
491 ; RV32IMB-LABEL: add_mul_combine_reject_f3:
492 ; RV32IMB:       # %bb.0:
493 ; RV32IMB-NEXT:    li a2, 29
494 ; RV32IMB-NEXT:    mulhu a2, a0, a2
495 ; RV32IMB-NEXT:    sh1add a3, a1, a1
496 ; RV32IMB-NEXT:    slli a1, a1, 5
497 ; RV32IMB-NEXT:    sub a1, a1, a3
498 ; RV32IMB-NEXT:    add a1, a2, a1
499 ; RV32IMB-NEXT:    sh1add a2, a0, a0
500 ; RV32IMB-NEXT:    slli a0, a0, 5
501 ; RV32IMB-NEXT:    sub a2, a0, a2
502 ; RV32IMB-NEXT:    lui a0, 14
503 ; RV32IMB-NEXT:    addi a0, a0, -145
504 ; RV32IMB-NEXT:    add a0, a2, a0
505 ; RV32IMB-NEXT:    sltu a2, a0, a2
506 ; RV32IMB-NEXT:    add a1, a1, a2
507 ; RV32IMB-NEXT:    ret
509 ; RV64IMB-LABEL: add_mul_combine_reject_f3:
510 ; RV64IMB:       # %bb.0:
511 ; RV64IMB-NEXT:    addi a0, a0, 1972
512 ; RV64IMB-NEXT:    sh1add a1, a0, a0
513 ; RV64IMB-NEXT:    slli a0, a0, 5
514 ; RV64IMB-NEXT:    sub a0, a0, a1
515 ; RV64IMB-NEXT:    addi a0, a0, 11
516 ; RV64IMB-NEXT:    ret
517   %tmp0 = mul i64 %x, 29
518   %tmp1 = add i64 %tmp0, 57199
519   ret i64 %tmp1
522 define i32 @add_mul_combine_reject_g1(i32 %x) {
523 ; RV32IMB-LABEL: add_mul_combine_reject_g1:
524 ; RV32IMB:       # %bb.0:
525 ; RV32IMB-NEXT:    addi a0, a0, 100
526 ; RV32IMB-NEXT:    sh3add a1, a0, a0
527 ; RV32IMB-NEXT:    sh3add a0, a1, a0
528 ; RV32IMB-NEXT:    addi a0, a0, 10
529 ; RV32IMB-NEXT:    ret
531 ; RV64IMB-LABEL: add_mul_combine_reject_g1:
532 ; RV64IMB:       # %bb.0:
533 ; RV64IMB-NEXT:    addi a0, a0, 100
534 ; RV64IMB-NEXT:    sh3add a1, a0, a0
535 ; RV64IMB-NEXT:    sh3add a0, a1, a0
536 ; RV64IMB-NEXT:    addiw a0, a0, 10
537 ; RV64IMB-NEXT:    ret
538   %tmp0 = mul i32 %x, 73
539   %tmp1 = add i32 %tmp0, 7310
540   ret i32 %tmp1
543 define signext i32 @add_mul_combine_reject_g2(i32 signext %x) {
544 ; RV32IMB-LABEL: add_mul_combine_reject_g2:
545 ; RV32IMB:       # %bb.0:
546 ; RV32IMB-NEXT:    addi a0, a0, 100
547 ; RV32IMB-NEXT:    sh3add a1, a0, a0
548 ; RV32IMB-NEXT:    sh3add a0, a1, a0
549 ; RV32IMB-NEXT:    addi a0, a0, 10
550 ; RV32IMB-NEXT:    ret
552 ; RV64IMB-LABEL: add_mul_combine_reject_g2:
553 ; RV64IMB:       # %bb.0:
554 ; RV64IMB-NEXT:    addi a0, a0, 100
555 ; RV64IMB-NEXT:    sh3add a1, a0, a0
556 ; RV64IMB-NEXT:    sh3add a0, a1, a0
557 ; RV64IMB-NEXT:    addiw a0, a0, 10
558 ; RV64IMB-NEXT:    ret
559   %tmp0 = mul i32 %x, 73
560   %tmp1 = add i32 %tmp0, 7310
561   ret i32 %tmp1
564 define i64 @add_mul_combine_reject_g3(i64 %x) {
565 ; RV32IMB-LABEL: add_mul_combine_reject_g3:
566 ; RV32IMB:       # %bb.0:
567 ; RV32IMB-NEXT:    li a2, 73
568 ; RV32IMB-NEXT:    mulhu a2, a0, a2
569 ; RV32IMB-NEXT:    sh3add a3, a1, a1
570 ; RV32IMB-NEXT:    sh3add a1, a3, a1
571 ; RV32IMB-NEXT:    add a1, a2, a1
572 ; RV32IMB-NEXT:    sh3add a2, a0, a0
573 ; RV32IMB-NEXT:    sh3add a2, a2, a0
574 ; RV32IMB-NEXT:    lui a0, 2
575 ; RV32IMB-NEXT:    addi a0, a0, -882
576 ; RV32IMB-NEXT:    add a0, a2, a0
577 ; RV32IMB-NEXT:    sltu a2, a0, a2
578 ; RV32IMB-NEXT:    add a1, a1, a2
579 ; RV32IMB-NEXT:    ret
581 ; RV64IMB-LABEL: add_mul_combine_reject_g3:
582 ; RV64IMB:       # %bb.0:
583 ; RV64IMB-NEXT:    addi a0, a0, 100
584 ; RV64IMB-NEXT:    sh3add a1, a0, a0
585 ; RV64IMB-NEXT:    sh3add a0, a1, a0
586 ; RV64IMB-NEXT:    addi a0, a0, 10
587 ; RV64IMB-NEXT:    ret
588   %tmp0 = mul i64 %x, 73
589   %tmp1 = add i64 %tmp0, 7310
590   ret i64 %tmp1
593 ; This test previously infinite looped in DAG combine.
594 define i64 @add_mul_combine_infinite_loop(i64 %x) {
595 ; RV32IMB-LABEL: add_mul_combine_infinite_loop:
596 ; RV32IMB:       # %bb.0:
597 ; RV32IMB-NEXT:    li a2, 24
598 ; RV32IMB-NEXT:    mulhu a2, a0, a2
599 ; RV32IMB-NEXT:    sh1add a1, a1, a1
600 ; RV32IMB-NEXT:    sh3add a1, a1, a2
601 ; RV32IMB-NEXT:    sh1add a0, a0, a0
602 ; RV32IMB-NEXT:    slli a2, a0, 3
603 ; RV32IMB-NEXT:    li a3, 1
604 ; RV32IMB-NEXT:    slli a3, a3, 11
605 ; RV32IMB-NEXT:    sh3add a0, a0, a3
606 ; RV32IMB-NEXT:    sltu a2, a0, a2
607 ; RV32IMB-NEXT:    add a1, a1, a2
608 ; RV32IMB-NEXT:    ret
610 ; RV64IMB-LABEL: add_mul_combine_infinite_loop:
611 ; RV64IMB:       # %bb.0:
612 ; RV64IMB-NEXT:    addi a0, a0, 86
613 ; RV64IMB-NEXT:    sh1add a0, a0, a0
614 ; RV64IMB-NEXT:    slli a0, a0, 3
615 ; RV64IMB-NEXT:    addi a0, a0, -16
616 ; RV64IMB-NEXT:    ret
617   %tmp0 = mul i64 %x, 24
618   %tmp1 = add i64 %tmp0, 2048
619   ret i64 %tmp1
622 define i32 @mul3000_add8990_a(i32 %x) {
623 ; RV32IMB-LABEL: mul3000_add8990_a:
624 ; RV32IMB:       # %bb.0:
625 ; RV32IMB-NEXT:    addi a0, a0, 3
626 ; RV32IMB-NEXT:    lui a1, 1
627 ; RV32IMB-NEXT:    addi a1, a1, -1096
628 ; RV32IMB-NEXT:    mul a0, a0, a1
629 ; RV32IMB-NEXT:    addi a0, a0, -10
630 ; RV32IMB-NEXT:    ret
632 ; RV64IMB-LABEL: mul3000_add8990_a:
633 ; RV64IMB:       # %bb.0:
634 ; RV64IMB-NEXT:    addi a0, a0, 3
635 ; RV64IMB-NEXT:    lui a1, 1
636 ; RV64IMB-NEXT:    addi a1, a1, -1096
637 ; RV64IMB-NEXT:    mul a0, a0, a1
638 ; RV64IMB-NEXT:    addiw a0, a0, -10
639 ; RV64IMB-NEXT:    ret
640   %tmp0 = mul i32 %x, 3000
641   %tmp1 = add i32 %tmp0, 8990
642   ret i32 %tmp1
645 define signext i32 @mul3000_add8990_b(i32 signext %x) {
646 ; RV32IMB-LABEL: mul3000_add8990_b:
647 ; RV32IMB:       # %bb.0:
648 ; RV32IMB-NEXT:    addi a0, a0, 3
649 ; RV32IMB-NEXT:    lui a1, 1
650 ; RV32IMB-NEXT:    addi a1, a1, -1096
651 ; RV32IMB-NEXT:    mul a0, a0, a1
652 ; RV32IMB-NEXT:    addi a0, a0, -10
653 ; RV32IMB-NEXT:    ret
655 ; RV64IMB-LABEL: mul3000_add8990_b:
656 ; RV64IMB:       # %bb.0:
657 ; RV64IMB-NEXT:    addi a0, a0, 3
658 ; RV64IMB-NEXT:    lui a1, 1
659 ; RV64IMB-NEXT:    addi a1, a1, -1096
660 ; RV64IMB-NEXT:    mul a0, a0, a1
661 ; RV64IMB-NEXT:    addiw a0, a0, -10
662 ; RV64IMB-NEXT:    ret
663   %tmp0 = mul i32 %x, 3000
664   %tmp1 = add i32 %tmp0, 8990
665   ret i32 %tmp1
668 define i64 @mul3000_add8990_c(i64 %x) {
669 ; RV32IMB-LABEL: mul3000_add8990_c:
670 ; RV32IMB:       # %bb.0:
671 ; RV32IMB-NEXT:    lui a2, 1
672 ; RV32IMB-NEXT:    addi a2, a2, -1096
673 ; RV32IMB-NEXT:    mul a1, a1, a2
674 ; RV32IMB-NEXT:    mulhu a3, a0, a2
675 ; RV32IMB-NEXT:    add a1, a3, a1
676 ; RV32IMB-NEXT:    mul a2, a0, a2
677 ; RV32IMB-NEXT:    lui a0, 2
678 ; RV32IMB-NEXT:    addi a0, a0, 798
679 ; RV32IMB-NEXT:    add a0, a2, a0
680 ; RV32IMB-NEXT:    sltu a2, a0, a2
681 ; RV32IMB-NEXT:    add a1, a1, a2
682 ; RV32IMB-NEXT:    ret
684 ; RV64IMB-LABEL: mul3000_add8990_c:
685 ; RV64IMB:       # %bb.0:
686 ; RV64IMB-NEXT:    addi a0, a0, 3
687 ; RV64IMB-NEXT:    lui a1, 1
688 ; RV64IMB-NEXT:    addiw a1, a1, -1096
689 ; RV64IMB-NEXT:    mul a0, a0, a1
690 ; RV64IMB-NEXT:    addi a0, a0, -10
691 ; RV64IMB-NEXT:    ret
692   %tmp0 = mul i64 %x, 3000
693   %tmp1 = add i64 %tmp0, 8990
694   ret i64 %tmp1
697 define i32 @mul3000_sub8990_a(i32 %x) {
698 ; RV32IMB-LABEL: mul3000_sub8990_a:
699 ; RV32IMB:       # %bb.0:
700 ; RV32IMB-NEXT:    addi a0, a0, -3
701 ; RV32IMB-NEXT:    lui a1, 1
702 ; RV32IMB-NEXT:    addi a1, a1, -1096
703 ; RV32IMB-NEXT:    mul a0, a0, a1
704 ; RV32IMB-NEXT:    addi a0, a0, 10
705 ; RV32IMB-NEXT:    ret
707 ; RV64IMB-LABEL: mul3000_sub8990_a:
708 ; RV64IMB:       # %bb.0:
709 ; RV64IMB-NEXT:    addi a0, a0, -3
710 ; RV64IMB-NEXT:    lui a1, 1
711 ; RV64IMB-NEXT:    addi a1, a1, -1096
712 ; RV64IMB-NEXT:    mul a0, a0, a1
713 ; RV64IMB-NEXT:    addiw a0, a0, 10
714 ; RV64IMB-NEXT:    ret
715   %tmp0 = mul i32 %x, 3000
716   %tmp1 = add i32 %tmp0, -8990
717   ret i32 %tmp1
720 define signext i32 @mul3000_sub8990_b(i32 signext %x) {
721 ; RV32IMB-LABEL: mul3000_sub8990_b:
722 ; RV32IMB:       # %bb.0:
723 ; RV32IMB-NEXT:    addi a0, a0, -3
724 ; RV32IMB-NEXT:    lui a1, 1
725 ; RV32IMB-NEXT:    addi a1, a1, -1096
726 ; RV32IMB-NEXT:    mul a0, a0, a1
727 ; RV32IMB-NEXT:    addi a0, a0, 10
728 ; RV32IMB-NEXT:    ret
730 ; RV64IMB-LABEL: mul3000_sub8990_b:
731 ; RV64IMB:       # %bb.0:
732 ; RV64IMB-NEXT:    addi a0, a0, -3
733 ; RV64IMB-NEXT:    lui a1, 1
734 ; RV64IMB-NEXT:    addi a1, a1, -1096
735 ; RV64IMB-NEXT:    mul a0, a0, a1
736 ; RV64IMB-NEXT:    addiw a0, a0, 10
737 ; RV64IMB-NEXT:    ret
738   %tmp0 = mul i32 %x, 3000
739   %tmp1 = add i32 %tmp0, -8990
740   ret i32 %tmp1
743 define i64 @mul3000_sub8990_c(i64 %x) {
744 ; RV32IMB-LABEL: mul3000_sub8990_c:
745 ; RV32IMB:       # %bb.0:
746 ; RV32IMB-NEXT:    lui a2, 1
747 ; RV32IMB-NEXT:    addi a2, a2, -1096
748 ; RV32IMB-NEXT:    mul a1, a1, a2
749 ; RV32IMB-NEXT:    mulhu a3, a0, a2
750 ; RV32IMB-NEXT:    add a1, a3, a1
751 ; RV32IMB-NEXT:    mul a2, a0, a2
752 ; RV32IMB-NEXT:    lui a0, 1048574
753 ; RV32IMB-NEXT:    addi a0, a0, -798
754 ; RV32IMB-NEXT:    add a0, a2, a0
755 ; RV32IMB-NEXT:    sltu a2, a0, a2
756 ; RV32IMB-NEXT:    add a1, a1, a2
757 ; RV32IMB-NEXT:    addi a1, a1, -1
758 ; RV32IMB-NEXT:    ret
760 ; RV64IMB-LABEL: mul3000_sub8990_c:
761 ; RV64IMB:       # %bb.0:
762 ; RV64IMB-NEXT:    addi a0, a0, -3
763 ; RV64IMB-NEXT:    lui a1, 1
764 ; RV64IMB-NEXT:    addiw a1, a1, -1096
765 ; RV64IMB-NEXT:    mul a0, a0, a1
766 ; RV64IMB-NEXT:    addi a0, a0, 10
767 ; RV64IMB-NEXT:    ret
768   %tmp0 = mul i64 %x, 3000
769   %tmp1 = add i64 %tmp0, -8990
770   ret i64 %tmp1
773 define i32 @mulneg3000_add8990_a(i32 %x) {
774 ; RV32IMB-LABEL: mulneg3000_add8990_a:
775 ; RV32IMB:       # %bb.0:
776 ; RV32IMB-NEXT:    addi a0, a0, -3
777 ; RV32IMB-NEXT:    lui a1, 1048575
778 ; RV32IMB-NEXT:    addi a1, a1, 1096
779 ; RV32IMB-NEXT:    mul a0, a0, a1
780 ; RV32IMB-NEXT:    addi a0, a0, -10
781 ; RV32IMB-NEXT:    ret
783 ; RV64IMB-LABEL: mulneg3000_add8990_a:
784 ; RV64IMB:       # %bb.0:
785 ; RV64IMB-NEXT:    addi a0, a0, -3
786 ; RV64IMB-NEXT:    lui a1, 1048575
787 ; RV64IMB-NEXT:    addi a1, a1, 1096
788 ; RV64IMB-NEXT:    mul a0, a0, a1
789 ; RV64IMB-NEXT:    addiw a0, a0, -10
790 ; RV64IMB-NEXT:    ret
791   %tmp0 = mul i32 %x, -3000
792   %tmp1 = add i32 %tmp0, 8990
793   ret i32 %tmp1
796 define signext i32 @mulneg3000_add8990_b(i32 signext %x) {
797 ; RV32IMB-LABEL: mulneg3000_add8990_b:
798 ; RV32IMB:       # %bb.0:
799 ; RV32IMB-NEXT:    addi a0, a0, -3
800 ; RV32IMB-NEXT:    lui a1, 1048575
801 ; RV32IMB-NEXT:    addi a1, a1, 1096
802 ; RV32IMB-NEXT:    mul a0, a0, a1
803 ; RV32IMB-NEXT:    addi a0, a0, -10
804 ; RV32IMB-NEXT:    ret
806 ; RV64IMB-LABEL: mulneg3000_add8990_b:
807 ; RV64IMB:       # %bb.0:
808 ; RV64IMB-NEXT:    addi a0, a0, -3
809 ; RV64IMB-NEXT:    lui a1, 1048575
810 ; RV64IMB-NEXT:    addi a1, a1, 1096
811 ; RV64IMB-NEXT:    mul a0, a0, a1
812 ; RV64IMB-NEXT:    addiw a0, a0, -10
813 ; RV64IMB-NEXT:    ret
814   %tmp0 = mul i32 %x, -3000
815   %tmp1 = add i32 %tmp0, 8990
816   ret i32 %tmp1
819 define i64 @mulneg3000_add8990_c(i64 %x) {
820 ; RV32IMB-LABEL: mulneg3000_add8990_c:
821 ; RV32IMB:       # %bb.0:
822 ; RV32IMB-NEXT:    lui a2, 1048575
823 ; RV32IMB-NEXT:    addi a2, a2, 1096
824 ; RV32IMB-NEXT:    mul a1, a1, a2
825 ; RV32IMB-NEXT:    mulhu a3, a0, a2
826 ; RV32IMB-NEXT:    sub a3, a3, a0
827 ; RV32IMB-NEXT:    add a1, a3, a1
828 ; RV32IMB-NEXT:    mul a2, a0, a2
829 ; RV32IMB-NEXT:    lui a0, 2
830 ; RV32IMB-NEXT:    addi a0, a0, 798
831 ; RV32IMB-NEXT:    add a0, a2, a0
832 ; RV32IMB-NEXT:    sltu a2, a0, a2
833 ; RV32IMB-NEXT:    add a1, a1, a2
834 ; RV32IMB-NEXT:    ret
836 ; RV64IMB-LABEL: mulneg3000_add8990_c:
837 ; RV64IMB:       # %bb.0:
838 ; RV64IMB-NEXT:    addi a0, a0, -3
839 ; RV64IMB-NEXT:    lui a1, 1048575
840 ; RV64IMB-NEXT:    addiw a1, a1, 1096
841 ; RV64IMB-NEXT:    mul a0, a0, a1
842 ; RV64IMB-NEXT:    addi a0, a0, -10
843 ; RV64IMB-NEXT:    ret
844   %tmp0 = mul i64 %x, -3000
845   %tmp1 = add i64 %tmp0, 8990
846   ret i64 %tmp1
849 define i32 @mulneg3000_sub8990_a(i32 %x) {
850 ; RV32IMB-LABEL: mulneg3000_sub8990_a:
851 ; RV32IMB:       # %bb.0:
852 ; RV32IMB-NEXT:    addi a0, a0, 3
853 ; RV32IMB-NEXT:    lui a1, 1048575
854 ; RV32IMB-NEXT:    addi a1, a1, 1096
855 ; RV32IMB-NEXT:    mul a0, a0, a1
856 ; RV32IMB-NEXT:    addi a0, a0, 10
857 ; RV32IMB-NEXT:    ret
859 ; RV64IMB-LABEL: mulneg3000_sub8990_a:
860 ; RV64IMB:       # %bb.0:
861 ; RV64IMB-NEXT:    addi a0, a0, 3
862 ; RV64IMB-NEXT:    lui a1, 1048575
863 ; RV64IMB-NEXT:    addi a1, a1, 1096
864 ; RV64IMB-NEXT:    mul a0, a0, a1
865 ; RV64IMB-NEXT:    addiw a0, a0, 10
866 ; RV64IMB-NEXT:    ret
867   %tmp0 = mul i32 %x, -3000
868   %tmp1 = add i32 %tmp0, -8990
869   ret i32 %tmp1
872 define signext i32 @mulneg3000_sub8990_b(i32 signext %x) {
873 ; RV32IMB-LABEL: mulneg3000_sub8990_b:
874 ; RV32IMB:       # %bb.0:
875 ; RV32IMB-NEXT:    addi a0, a0, 3
876 ; RV32IMB-NEXT:    lui a1, 1048575
877 ; RV32IMB-NEXT:    addi a1, a1, 1096
878 ; RV32IMB-NEXT:    mul a0, a0, a1
879 ; RV32IMB-NEXT:    addi a0, a0, 10
880 ; RV32IMB-NEXT:    ret
882 ; RV64IMB-LABEL: mulneg3000_sub8990_b:
883 ; RV64IMB:       # %bb.0:
884 ; RV64IMB-NEXT:    addi a0, a0, 3
885 ; RV64IMB-NEXT:    lui a1, 1048575
886 ; RV64IMB-NEXT:    addi a1, a1, 1096
887 ; RV64IMB-NEXT:    mul a0, a0, a1
888 ; RV64IMB-NEXT:    addiw a0, a0, 10
889 ; RV64IMB-NEXT:    ret
890   %tmp0 = mul i32 %x, -3000
891   %tmp1 = add i32 %tmp0, -8990
892   ret i32 %tmp1
895 define i64 @mulneg3000_sub8990_c(i64 %x) {
896 ; RV32IMB-LABEL: mulneg3000_sub8990_c:
897 ; RV32IMB:       # %bb.0:
898 ; RV32IMB-NEXT:    lui a2, 1048575
899 ; RV32IMB-NEXT:    addi a2, a2, 1096
900 ; RV32IMB-NEXT:    mul a1, a1, a2
901 ; RV32IMB-NEXT:    mulhu a3, a0, a2
902 ; RV32IMB-NEXT:    sub a3, a3, a0
903 ; RV32IMB-NEXT:    add a1, a3, a1
904 ; RV32IMB-NEXT:    mul a2, a0, a2
905 ; RV32IMB-NEXT:    lui a0, 1048574
906 ; RV32IMB-NEXT:    addi a0, a0, -798
907 ; RV32IMB-NEXT:    add a0, a2, a0
908 ; RV32IMB-NEXT:    sltu a2, a0, a2
909 ; RV32IMB-NEXT:    add a1, a1, a2
910 ; RV32IMB-NEXT:    addi a1, a1, -1
911 ; RV32IMB-NEXT:    ret
913 ; RV64IMB-LABEL: mulneg3000_sub8990_c:
914 ; RV64IMB:       # %bb.0:
915 ; RV64IMB-NEXT:    addi a0, a0, 3
916 ; RV64IMB-NEXT:    lui a1, 1048575
917 ; RV64IMB-NEXT:    addiw a1, a1, 1096
918 ; RV64IMB-NEXT:    mul a0, a0, a1
919 ; RV64IMB-NEXT:    addi a0, a0, 10
920 ; RV64IMB-NEXT:    ret
921   %tmp0 = mul i64 %x, -3000
922   %tmp1 = add i64 %tmp0, -8990
923   ret i64 %tmp1
926 ; This test case previously caused an infinite loop between transformations
927 ; performed in RISCVISelLowering;:transformAddImmMulImm and
928 ; DAGCombiner::visitMUL.
929 define i1 @pr53831(i32 %x) {
930 ; RV32IMB-LABEL: pr53831:
931 ; RV32IMB:       # %bb.0:
932 ; RV32IMB-NEXT:    li a0, 0
933 ; RV32IMB-NEXT:    ret
935 ; RV64IMB-LABEL: pr53831:
936 ; RV64IMB:       # %bb.0:
937 ; RV64IMB-NEXT:    li a0, 0
938 ; RV64IMB-NEXT:    ret
939   %tmp0 = add i32 %x, 1
940   %tmp1 = mul i32 %tmp0, 24
941   %tmp2 = add i32 %tmp1, 1
942   %tmp3 = mul i32 %x, 24
943   %tmp4 = add i32 %tmp3, 2048
944   %tmp5 = icmp eq i32 %tmp4, %tmp2
945   ret i1 %tmp5
948 define i64 @sh2add_uw(i64 signext %0, i32 signext %1) {
949 ; RV32IMB-LABEL: sh2add_uw:
950 ; RV32IMB:       # %bb.0: # %entry
951 ; RV32IMB-NEXT:    srli a3, a2, 27
952 ; RV32IMB-NEXT:    slli a2, a2, 5
953 ; RV32IMB-NEXT:    srli a4, a0, 29
954 ; RV32IMB-NEXT:    sh3add a1, a1, a4
955 ; RV32IMB-NEXT:    sh3add a0, a0, a2
956 ; RV32IMB-NEXT:    sltu a2, a0, a2
957 ; RV32IMB-NEXT:    add a1, a3, a1
958 ; RV32IMB-NEXT:    add a1, a1, a2
959 ; RV32IMB-NEXT:    ret
961 ; RV64IMB-LABEL: sh2add_uw:
962 ; RV64IMB:       # %bb.0: # %entry
963 ; RV64IMB-NEXT:    sh2add.uw a0, a1, a0
964 ; RV64IMB-NEXT:    slli a0, a0, 3
965 ; RV64IMB-NEXT:    ret
966 entry:
967   %2 = zext i32 %1 to i64
968   %3 = shl i64 %2, 5
969   %4 = shl i64 %0, 3
970   %5 = add i64 %3, %4
971   ret i64 %5