[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / RISCV / shlimm-addimm.ll
blob48764515b82700747f3b2b932caeda12f4a05a5c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
3 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
4 ; RUN:   | FileCheck -check-prefix=RV32I %s
5 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
6 ; RUN:   | FileCheck -check-prefix=RV64I %s
8 ;; Test that (add (shl x, c0), c1) can be transformed to
9 ;; (add (shl (add x, c1>>c0), c0), c1-(c1>>c0<<c0)) or
10 ;; (shl (add x, c1>>c0), c0) if profitable.
12 define i32 @shl5_add1184_a(i32 %x) {
13 ; RV32I-LABEL: shl5_add1184_a:
14 ; RV32I:       # %bb.0:
15 ; RV32I-NEXT:    slli a0, a0, 5
16 ; RV32I-NEXT:    addi a0, a0, 1184
17 ; RV32I-NEXT:    ret
19 ; RV64I-LABEL: shl5_add1184_a:
20 ; RV64I:       # %bb.0:
21 ; RV64I-NEXT:    slliw a0, a0, 5
22 ; RV64I-NEXT:    addiw a0, a0, 1184
23 ; RV64I-NEXT:    ret
24   %tmp0 = shl i32 %x, 5
25   %tmp1 = add i32 %tmp0, 1184
26   ret i32 %tmp1
29 define signext i32 @shl5_add1184_b(i32 signext %x) {
30 ; RV32I-LABEL: shl5_add1184_b:
31 ; RV32I:       # %bb.0:
32 ; RV32I-NEXT:    slli a0, a0, 5
33 ; RV32I-NEXT:    addi a0, a0, 1184
34 ; RV32I-NEXT:    ret
36 ; RV64I-LABEL: shl5_add1184_b:
37 ; RV64I:       # %bb.0:
38 ; RV64I-NEXT:    slliw a0, a0, 5
39 ; RV64I-NEXT:    addiw a0, a0, 1184
40 ; RV64I-NEXT:    ret
41   %tmp0 = shl i32 %x, 5
42   %tmp1 = add i32 %tmp0, 1184
43   ret i32 %tmp1
46 define i64 @shl5_add1184_c(i64 %x) {
47 ; RV32I-LABEL: shl5_add1184_c:
48 ; RV32I:       # %bb.0:
49 ; RV32I-NEXT:    srli a2, a0, 27
50 ; RV32I-NEXT:    slli a1, a1, 5
51 ; RV32I-NEXT:    or a1, a1, a2
52 ; RV32I-NEXT:    slli a2, a0, 5
53 ; RV32I-NEXT:    addi a0, a2, 1184
54 ; RV32I-NEXT:    sltu a2, a0, a2
55 ; RV32I-NEXT:    add a1, a1, a2
56 ; RV32I-NEXT:    ret
58 ; RV64I-LABEL: shl5_add1184_c:
59 ; RV64I:       # %bb.0:
60 ; RV64I-NEXT:    slli a0, a0, 5
61 ; RV64I-NEXT:    addi a0, a0, 1184
62 ; RV64I-NEXT:    ret
63   %tmp0 = shl i64 %x, 5
64   %tmp1 = add i64 %tmp0, 1184
65   ret i64 %tmp1
68 define i32 @shl5_add101024_a(i32 %x) {
69 ; RV32I-LABEL: shl5_add101024_a:
70 ; RV32I:       # %bb.0:
71 ; RV32I-NEXT:    slli a0, a0, 5
72 ; RV32I-NEXT:    lui a1, 25
73 ; RV32I-NEXT:    addi a1, a1, -1376
74 ; RV32I-NEXT:    add a0, a0, a1
75 ; RV32I-NEXT:    ret
77 ; RV64I-LABEL: shl5_add101024_a:
78 ; RV64I:       # %bb.0:
79 ; RV64I-NEXT:    slliw a0, a0, 5
80 ; RV64I-NEXT:    lui a1, 25
81 ; RV64I-NEXT:    addiw a1, a1, -1376
82 ; RV64I-NEXT:    addw a0, a0, a1
83 ; RV64I-NEXT:    ret
84   %tmp0 = shl i32 %x, 5
85   %tmp1 = add i32 %tmp0, 101024
86   ret i32 %tmp1
89 define signext i32 @shl5_add101024_b(i32 signext %x) {
90 ; RV32I-LABEL: shl5_add101024_b:
91 ; RV32I:       # %bb.0:
92 ; RV32I-NEXT:    slli a0, a0, 5
93 ; RV32I-NEXT:    lui a1, 25
94 ; RV32I-NEXT:    addi a1, a1, -1376
95 ; RV32I-NEXT:    add a0, a0, a1
96 ; RV32I-NEXT:    ret
98 ; RV64I-LABEL: shl5_add101024_b:
99 ; RV64I:       # %bb.0:
100 ; RV64I-NEXT:    slliw a0, a0, 5
101 ; RV64I-NEXT:    lui a1, 25
102 ; RV64I-NEXT:    addiw a1, a1, -1376
103 ; RV64I-NEXT:    addw a0, a0, a1
104 ; RV64I-NEXT:    ret
105   %tmp0 = shl i32 %x, 5
106   %tmp1 = add i32 %tmp0, 101024
107   ret i32 %tmp1
110 define i64 @shl5_add101024_c(i64 %x) {
111 ; RV32I-LABEL: shl5_add101024_c:
112 ; RV32I:       # %bb.0:
113 ; RV32I-NEXT:    srli a2, a0, 27
114 ; RV32I-NEXT:    slli a1, a1, 5
115 ; RV32I-NEXT:    or a1, a1, a2
116 ; RV32I-NEXT:    slli a2, a0, 5
117 ; RV32I-NEXT:    lui a0, 25
118 ; RV32I-NEXT:    addi a0, a0, -1376
119 ; RV32I-NEXT:    add a0, a2, a0
120 ; RV32I-NEXT:    sltu a2, a0, a2
121 ; RV32I-NEXT:    add a1, a1, a2
122 ; RV32I-NEXT:    ret
124 ; RV64I-LABEL: shl5_add101024_c:
125 ; RV64I:       # %bb.0:
126 ; RV64I-NEXT:    slli a0, a0, 5
127 ; RV64I-NEXT:    lui a1, 25
128 ; RV64I-NEXT:    addiw a1, a1, -1376
129 ; RV64I-NEXT:    add a0, a0, a1
130 ; RV64I-NEXT:    ret
131   %tmp0 = shl i64 %x, 5
132   %tmp1 = add i64 %tmp0, 101024
133   ret i64 %tmp1
136 define i32 @shl5_add47968_a(i32 %x) {
137 ; RV32I-LABEL: shl5_add47968_a:
138 ; RV32I:       # %bb.0:
139 ; RV32I-NEXT:    slli a0, a0, 5
140 ; RV32I-NEXT:    lui a1, 12
141 ; RV32I-NEXT:    addi a1, a1, -1184
142 ; RV32I-NEXT:    add a0, a0, a1
143 ; RV32I-NEXT:    ret
145 ; RV64I-LABEL: shl5_add47968_a:
146 ; RV64I:       # %bb.0:
147 ; RV64I-NEXT:    slliw a0, a0, 5
148 ; RV64I-NEXT:    lui a1, 12
149 ; RV64I-NEXT:    addiw a1, a1, -1184
150 ; RV64I-NEXT:    addw a0, a0, a1
151 ; RV64I-NEXT:    ret
152   %tmp0 = shl i32 %x, 5
153   %tmp1 = add i32 %tmp0, 47968
154   ret i32 %tmp1
157 define signext i32 @shl5_add47968_b(i32 signext %x) {
158 ; RV32I-LABEL: shl5_add47968_b:
159 ; RV32I:       # %bb.0:
160 ; RV32I-NEXT:    slli a0, a0, 5
161 ; RV32I-NEXT:    lui a1, 12
162 ; RV32I-NEXT:    addi a1, a1, -1184
163 ; RV32I-NEXT:    add a0, a0, a1
164 ; RV32I-NEXT:    ret
166 ; RV64I-LABEL: shl5_add47968_b:
167 ; RV64I:       # %bb.0:
168 ; RV64I-NEXT:    slliw a0, a0, 5
169 ; RV64I-NEXT:    lui a1, 12
170 ; RV64I-NEXT:    addiw a1, a1, -1184
171 ; RV64I-NEXT:    addw a0, a0, a1
172 ; RV64I-NEXT:    ret
173   %tmp0 = shl i32 %x, 5
174   %tmp1 = add i32 %tmp0, 47968
175   ret i32 %tmp1
178 define i64 @shl5_add47968_c(i64 %x) {
179 ; RV32I-LABEL: shl5_add47968_c:
180 ; RV32I:       # %bb.0:
181 ; RV32I-NEXT:    srli a2, a0, 27
182 ; RV32I-NEXT:    slli a1, a1, 5
183 ; RV32I-NEXT:    or a1, a1, a2
184 ; RV32I-NEXT:    slli a2, a0, 5
185 ; RV32I-NEXT:    lui a0, 12
186 ; RV32I-NEXT:    addi a0, a0, -1184
187 ; RV32I-NEXT:    add a0, a2, a0
188 ; RV32I-NEXT:    sltu a2, a0, a2
189 ; RV32I-NEXT:    add a1, a1, a2
190 ; RV32I-NEXT:    ret
192 ; RV64I-LABEL: shl5_add47968_c:
193 ; RV64I:       # %bb.0:
194 ; RV64I-NEXT:    slli a0, a0, 5
195 ; RV64I-NEXT:    lui a1, 12
196 ; RV64I-NEXT:    addiw a1, a1, -1184
197 ; RV64I-NEXT:    add a0, a0, a1
198 ; RV64I-NEXT:    ret
199   %tmp0 = shl i64 %x, 5
200   %tmp1 = add i64 %tmp0, 47968
201   ret i64 %tmp1
204 define i32 @shl5_add47969_a(i32 %x) {
205 ; RV32I-LABEL: shl5_add47969_a:
206 ; RV32I:       # %bb.0:
207 ; RV32I-NEXT:    slli a0, a0, 5
208 ; RV32I-NEXT:    lui a1, 12
209 ; RV32I-NEXT:    addi a1, a1, -1183
210 ; RV32I-NEXT:    add a0, a0, a1
211 ; RV32I-NEXT:    ret
213 ; RV64I-LABEL: shl5_add47969_a:
214 ; RV64I:       # %bb.0:
215 ; RV64I-NEXT:    slliw a0, a0, 5
216 ; RV64I-NEXT:    lui a1, 12
217 ; RV64I-NEXT:    addiw a1, a1, -1183
218 ; RV64I-NEXT:    addw a0, a0, a1
219 ; RV64I-NEXT:    ret
220   %tmp0 = shl i32 %x, 5
221   %tmp1 = add i32 %tmp0, 47969
222   ret i32 %tmp1
225 define signext i32 @shl5_add47969_b(i32 signext %x) {
226 ; RV32I-LABEL: shl5_add47969_b:
227 ; RV32I:       # %bb.0:
228 ; RV32I-NEXT:    slli a0, a0, 5
229 ; RV32I-NEXT:    lui a1, 12
230 ; RV32I-NEXT:    addi a1, a1, -1183
231 ; RV32I-NEXT:    add a0, a0, a1
232 ; RV32I-NEXT:    ret
234 ; RV64I-LABEL: shl5_add47969_b:
235 ; RV64I:       # %bb.0:
236 ; RV64I-NEXT:    slliw a0, a0, 5
237 ; RV64I-NEXT:    lui a1, 12
238 ; RV64I-NEXT:    addiw a1, a1, -1183
239 ; RV64I-NEXT:    addw a0, a0, a1
240 ; RV64I-NEXT:    ret
241   %tmp0 = shl i32 %x, 5
242   %tmp1 = add i32 %tmp0, 47969
243   ret i32 %tmp1
246 define i64 @shl5_add47969_c(i64 %x) {
247 ; RV32I-LABEL: shl5_add47969_c:
248 ; RV32I:       # %bb.0:
249 ; RV32I-NEXT:    srli a2, a0, 27
250 ; RV32I-NEXT:    slli a1, a1, 5
251 ; RV32I-NEXT:    or a1, a1, a2
252 ; RV32I-NEXT:    slli a2, a0, 5
253 ; RV32I-NEXT:    lui a0, 12
254 ; RV32I-NEXT:    addi a0, a0, -1183
255 ; RV32I-NEXT:    add a0, a2, a0
256 ; RV32I-NEXT:    sltu a2, a0, a2
257 ; RV32I-NEXT:    add a1, a1, a2
258 ; RV32I-NEXT:    ret
260 ; RV64I-LABEL: shl5_add47969_c:
261 ; RV64I:       # %bb.0:
262 ; RV64I-NEXT:    slli a0, a0, 5
263 ; RV64I-NEXT:    lui a1, 12
264 ; RV64I-NEXT:    addiw a1, a1, -1183
265 ; RV64I-NEXT:    add a0, a0, a1
266 ; RV64I-NEXT:    ret
267   %tmp0 = shl i64 %x, 5
268   %tmp1 = add i64 %tmp0, 47969
269   ret i64 %tmp1
272 define i32 @shl5_sub47968_a(i32 %x) {
273 ; RV32I-LABEL: shl5_sub47968_a:
274 ; RV32I:       # %bb.0:
275 ; RV32I-NEXT:    slli a0, a0, 5
276 ; RV32I-NEXT:    lui a1, 1048564
277 ; RV32I-NEXT:    addi a1, a1, 1184
278 ; RV32I-NEXT:    add a0, a0, a1
279 ; RV32I-NEXT:    ret
281 ; RV64I-LABEL: shl5_sub47968_a:
282 ; RV64I:       # %bb.0:
283 ; RV64I-NEXT:    slliw a0, a0, 5
284 ; RV64I-NEXT:    lui a1, 1048564
285 ; RV64I-NEXT:    addiw a1, a1, 1184
286 ; RV64I-NEXT:    addw a0, a0, a1
287 ; RV64I-NEXT:    ret
288   %tmp0 = shl i32 %x, 5
289   %tmp1 = add i32 %tmp0, -47968
290   ret i32 %tmp1
293 define signext i32 @shl5_sub47968_b(i32 signext %x) {
294 ; RV32I-LABEL: shl5_sub47968_b:
295 ; RV32I:       # %bb.0:
296 ; RV32I-NEXT:    slli a0, a0, 5
297 ; RV32I-NEXT:    lui a1, 1048564
298 ; RV32I-NEXT:    addi a1, a1, 1184
299 ; RV32I-NEXT:    add a0, a0, a1
300 ; RV32I-NEXT:    ret
302 ; RV64I-LABEL: shl5_sub47968_b:
303 ; RV64I:       # %bb.0:
304 ; RV64I-NEXT:    slliw a0, a0, 5
305 ; RV64I-NEXT:    lui a1, 1048564
306 ; RV64I-NEXT:    addiw a1, a1, 1184
307 ; RV64I-NEXT:    addw a0, a0, a1
308 ; RV64I-NEXT:    ret
309   %tmp0 = shl i32 %x, 5
310   %tmp1 = add i32 %tmp0, -47968
311   ret i32 %tmp1
314 define i64 @shl5_sub47968_c(i64 %x) {
315 ; RV32I-LABEL: shl5_sub47968_c:
316 ; RV32I:       # %bb.0:
317 ; RV32I-NEXT:    srli a2, a0, 27
318 ; RV32I-NEXT:    slli a1, a1, 5
319 ; RV32I-NEXT:    or a1, a1, a2
320 ; RV32I-NEXT:    slli a2, a0, 5
321 ; RV32I-NEXT:    lui a0, 1048564
322 ; RV32I-NEXT:    addi a0, a0, 1184
323 ; RV32I-NEXT:    add a0, a2, a0
324 ; RV32I-NEXT:    sltu a2, a0, a2
325 ; RV32I-NEXT:    add a1, a1, a2
326 ; RV32I-NEXT:    addi a1, a1, -1
327 ; RV32I-NEXT:    ret
329 ; RV64I-LABEL: shl5_sub47968_c:
330 ; RV64I:       # %bb.0:
331 ; RV64I-NEXT:    slli a0, a0, 5
332 ; RV64I-NEXT:    lui a1, 1048564
333 ; RV64I-NEXT:    addiw a1, a1, 1184
334 ; RV64I-NEXT:    add a0, a0, a1
335 ; RV64I-NEXT:    ret
336   %tmp0 = shl i64 %x, 5
337   %tmp1 = add i64 %tmp0, -47968
338   ret i64 %tmp1
341 define i32 @shl5_sub47969_a(i32 %x) {
342 ; RV32I-LABEL: shl5_sub47969_a:
343 ; RV32I:       # %bb.0:
344 ; RV32I-NEXT:    slli a0, a0, 5
345 ; RV32I-NEXT:    lui a1, 1048564
346 ; RV32I-NEXT:    addi a1, a1, 1183
347 ; RV32I-NEXT:    add a0, a0, a1
348 ; RV32I-NEXT:    ret
350 ; RV64I-LABEL: shl5_sub47969_a:
351 ; RV64I:       # %bb.0:
352 ; RV64I-NEXT:    slliw a0, a0, 5
353 ; RV64I-NEXT:    lui a1, 1048564
354 ; RV64I-NEXT:    addiw a1, a1, 1183
355 ; RV64I-NEXT:    addw a0, a0, a1
356 ; RV64I-NEXT:    ret
357   %tmp0 = shl i32 %x, 5
358   %tmp1 = add i32 %tmp0, -47969
359   ret i32 %tmp1
362 define signext i32 @shl5_sub47969_b(i32 signext %x) {
363 ; RV32I-LABEL: shl5_sub47969_b:
364 ; RV32I:       # %bb.0:
365 ; RV32I-NEXT:    slli a0, a0, 5
366 ; RV32I-NEXT:    lui a1, 1048564
367 ; RV32I-NEXT:    addi a1, a1, 1183
368 ; RV32I-NEXT:    add a0, a0, a1
369 ; RV32I-NEXT:    ret
371 ; RV64I-LABEL: shl5_sub47969_b:
372 ; RV64I:       # %bb.0:
373 ; RV64I-NEXT:    slliw a0, a0, 5
374 ; RV64I-NEXT:    lui a1, 1048564
375 ; RV64I-NEXT:    addiw a1, a1, 1183
376 ; RV64I-NEXT:    addw a0, a0, a1
377 ; RV64I-NEXT:    ret
378   %tmp0 = shl i32 %x, 5
379   %tmp1 = add i32 %tmp0, -47969
380   ret i32 %tmp1
383 define i64 @shl5_sub47969_c(i64 %x) {
384 ; RV32I-LABEL: shl5_sub47969_c:
385 ; RV32I:       # %bb.0:
386 ; RV32I-NEXT:    srli a2, a0, 27
387 ; RV32I-NEXT:    slli a1, a1, 5
388 ; RV32I-NEXT:    or a1, a1, a2
389 ; RV32I-NEXT:    slli a2, a0, 5
390 ; RV32I-NEXT:    lui a0, 1048564
391 ; RV32I-NEXT:    addi a0, a0, 1183
392 ; RV32I-NEXT:    add a0, a2, a0
393 ; RV32I-NEXT:    sltu a2, a0, a2
394 ; RV32I-NEXT:    add a1, a1, a2
395 ; RV32I-NEXT:    addi a1, a1, -1
396 ; RV32I-NEXT:    ret
398 ; RV64I-LABEL: shl5_sub47969_c:
399 ; RV64I:       # %bb.0:
400 ; RV64I-NEXT:    slli a0, a0, 5
401 ; RV64I-NEXT:    lui a1, 1048564
402 ; RV64I-NEXT:    addiw a1, a1, 1183
403 ; RV64I-NEXT:    add a0, a0, a1
404 ; RV64I-NEXT:    ret
405   %tmp0 = shl i64 %x, 5
406   %tmp1 = add i64 %tmp0, -47969
407   ret i64 %tmp1