Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64xtheadba.ll
blobed2b159d0ae7b010a4631ec76382fe1b37fc7f66
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub
2 ; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefixes=RV64I
4 ; RUN: llc -mtriple=riscv64 -mattr=+m,+xtheadba -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefixes=RV64XTHEADBA
7 define signext i16 @th_addsl_1(i64 %0, ptr %1) {
8 ; RV64I-LABEL: th_addsl_1:
9 ; RV64I:       # %bb.0:
10 ; RV64I-NEXT:    slli a0, a0, 1
11 ; RV64I-NEXT:    add a0, a1, a0
12 ; RV64I-NEXT:    lh a0, 0(a0)
13 ; RV64I-NEXT:    ret
15 ; RV64XTHEADBA-LABEL: th_addsl_1:
16 ; RV64XTHEADBA:       # %bb.0:
17 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
18 ; RV64XTHEADBA-NEXT:    lh a0, 0(a0)
19 ; RV64XTHEADBA-NEXT:    ret
20   %3 = getelementptr inbounds i16, ptr %1, i64 %0
21   %4 = load i16, ptr %3
22   ret i16 %4
25 define signext i32 @th_addsl_2(i64 %0, ptr %1) {
26 ; RV64I-LABEL: th_addsl_2:
27 ; RV64I:       # %bb.0:
28 ; RV64I-NEXT:    slli a0, a0, 2
29 ; RV64I-NEXT:    add a0, a1, a0
30 ; RV64I-NEXT:    lw a0, 0(a0)
31 ; RV64I-NEXT:    ret
33 ; RV64XTHEADBA-LABEL: th_addsl_2:
34 ; RV64XTHEADBA:       # %bb.0:
35 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
36 ; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
37 ; RV64XTHEADBA-NEXT:    ret
38   %3 = getelementptr inbounds i32, ptr %1, i64 %0
39   %4 = load i32, ptr %3
40   ret i32 %4
43 define i64 @th_addsl_3(i64 %0, ptr %1) {
44 ; RV64I-LABEL: th_addsl_3:
45 ; RV64I:       # %bb.0:
46 ; RV64I-NEXT:    slli a0, a0, 3
47 ; RV64I-NEXT:    add a0, a1, a0
48 ; RV64I-NEXT:    ld a0, 0(a0)
49 ; RV64I-NEXT:    ret
51 ; RV64XTHEADBA-LABEL: th_addsl_3:
52 ; RV64XTHEADBA:       # %bb.0:
53 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
54 ; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
55 ; RV64XTHEADBA-NEXT:    ret
56   %3 = getelementptr inbounds i64, ptr %1, i64 %0
57   %4 = load i64, ptr %3
58   ret i64 %4
61 ; Type legalization inserts a sext_inreg after the first add. That add will be
62 ; selected as th.addsl which does not sign extend. SimplifyDemandedBits is unable
63 ; to remove the sext_inreg because it has multiple uses. The ashr will use the
64 ; sext_inreg to become sraiw. This leaves the sext_inreg only used by the shl.
65 ; If the shl is selected as sllw, we don't need the sext_inreg.
66 define i64 @th_addsl_2_extra_sext(i32 %x, i32 %y, i32 %z) {
67 ; RV64I-LABEL: th_addsl_2_extra_sext:
68 ; RV64I:       # %bb.0:
69 ; RV64I-NEXT:    slli a0, a0, 2
70 ; RV64I-NEXT:    add a0, a0, a1
71 ; RV64I-NEXT:    sllw a1, a2, a0
72 ; RV64I-NEXT:    sraiw a0, a0, 2
73 ; RV64I-NEXT:    mul a0, a1, a0
74 ; RV64I-NEXT:    ret
76 ; RV64XTHEADBA-LABEL: th_addsl_2_extra_sext:
77 ; RV64XTHEADBA:       # %bb.0:
78 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
79 ; RV64XTHEADBA-NEXT:    sllw a1, a2, a0
80 ; RV64XTHEADBA-NEXT:    sraiw a0, a0, 2
81 ; RV64XTHEADBA-NEXT:    mul a0, a1, a0
82 ; RV64XTHEADBA-NEXT:    ret
83   %a = shl i32 %x, 2
84   %b = add i32 %a, %y
85   %c = shl i32 %z, %b
86   %d = ashr i32 %b, 2
87   %e = sext i32 %c to i64
88   %f = sext i32 %d to i64
89   %g = mul i64 %e, %f
90   ret i64 %g
93 define i64 @addmul6(i64 %a, i64 %b) {
94 ; RV64I-LABEL: addmul6:
95 ; RV64I:       # %bb.0:
96 ; RV64I-NEXT:    li a2, 6
97 ; RV64I-NEXT:    mul a0, a0, a2
98 ; RV64I-NEXT:    add a0, a0, a1
99 ; RV64I-NEXT:    ret
101 ; RV64XTHEADBA-LABEL: addmul6:
102 ; RV64XTHEADBA:       # %bb.0:
103 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
104 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
105 ; RV64XTHEADBA-NEXT:    ret
106   %c = mul i64 %a, 6
107   %d = add i64 %c, %b
108   ret i64 %d
111 define i64 @addmul10(i64 %a, i64 %b) {
112 ; RV64I-LABEL: addmul10:
113 ; RV64I:       # %bb.0:
114 ; RV64I-NEXT:    li a2, 10
115 ; RV64I-NEXT:    mul a0, a0, a2
116 ; RV64I-NEXT:    add a0, a0, a1
117 ; RV64I-NEXT:    ret
119 ; RV64XTHEADBA-LABEL: addmul10:
120 ; RV64XTHEADBA:       # %bb.0:
121 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
122 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
123 ; RV64XTHEADBA-NEXT:    ret
124   %c = mul i64 %a, 10
125   %d = add i64 %c, %b
126   ret i64 %d
129 define i64 @addmul12(i64 %a, i64 %b) {
130 ; RV64I-LABEL: addmul12:
131 ; RV64I:       # %bb.0:
132 ; RV64I-NEXT:    li a2, 12
133 ; RV64I-NEXT:    mul a0, a0, a2
134 ; RV64I-NEXT:    add a0, a0, a1
135 ; RV64I-NEXT:    ret
137 ; RV64XTHEADBA-LABEL: addmul12:
138 ; RV64XTHEADBA:       # %bb.0:
139 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
140 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
141 ; RV64XTHEADBA-NEXT:    ret
142   %c = mul i64 %a, 12
143   %d = add i64 %c, %b
144   ret i64 %d
147 define i64 @addmul18(i64 %a, i64 %b) {
148 ; RV64I-LABEL: addmul18:
149 ; RV64I:       # %bb.0:
150 ; RV64I-NEXT:    li a2, 18
151 ; RV64I-NEXT:    mul a0, a0, a2
152 ; RV64I-NEXT:    add a0, a0, a1
153 ; RV64I-NEXT:    ret
155 ; RV64XTHEADBA-LABEL: addmul18:
156 ; RV64XTHEADBA:       # %bb.0:
157 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
158 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
159 ; RV64XTHEADBA-NEXT:    ret
160   %c = mul i64 %a, 18
161   %d = add i64 %c, %b
162   ret i64 %d
165 define i64 @addmul20(i64 %a, i64 %b) {
166 ; RV64I-LABEL: addmul20:
167 ; RV64I:       # %bb.0:
168 ; RV64I-NEXT:    li a2, 20
169 ; RV64I-NEXT:    mul a0, a0, a2
170 ; RV64I-NEXT:    add a0, a0, a1
171 ; RV64I-NEXT:    ret
173 ; RV64XTHEADBA-LABEL: addmul20:
174 ; RV64XTHEADBA:       # %bb.0:
175 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
176 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
177 ; RV64XTHEADBA-NEXT:    ret
178   %c = mul i64 %a, 20
179   %d = add i64 %c, %b
180   ret i64 %d
183 define i64 @addmul24(i64 %a, i64 %b) {
184 ; RV64I-LABEL: addmul24:
185 ; RV64I:       # %bb.0:
186 ; RV64I-NEXT:    li a2, 24
187 ; RV64I-NEXT:    mul a0, a0, a2
188 ; RV64I-NEXT:    add a0, a0, a1
189 ; RV64I-NEXT:    ret
191 ; RV64XTHEADBA-LABEL: addmul24:
192 ; RV64XTHEADBA:       # %bb.0:
193 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
194 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
195 ; RV64XTHEADBA-NEXT:    ret
196   %c = mul i64 %a, 24
197   %d = add i64 %c, %b
198   ret i64 %d
201 define i64 @addmul36(i64 %a, i64 %b) {
202 ; RV64I-LABEL: addmul36:
203 ; RV64I:       # %bb.0:
204 ; RV64I-NEXT:    li a2, 36
205 ; RV64I-NEXT:    mul a0, a0, a2
206 ; RV64I-NEXT:    add a0, a0, a1
207 ; RV64I-NEXT:    ret
209 ; RV64XTHEADBA-LABEL: addmul36:
210 ; RV64XTHEADBA:       # %bb.0:
211 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
212 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
213 ; RV64XTHEADBA-NEXT:    ret
214   %c = mul i64 %a, 36
215   %d = add i64 %c, %b
216   ret i64 %d
219 define i64 @addmul40(i64 %a, i64 %b) {
220 ; RV64I-LABEL: addmul40:
221 ; RV64I:       # %bb.0:
222 ; RV64I-NEXT:    li a2, 40
223 ; RV64I-NEXT:    mul a0, a0, a2
224 ; RV64I-NEXT:    add a0, a0, a1
225 ; RV64I-NEXT:    ret
227 ; RV64XTHEADBA-LABEL: addmul40:
228 ; RV64XTHEADBA:       # %bb.0:
229 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
230 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
231 ; RV64XTHEADBA-NEXT:    ret
232   %c = mul i64 %a, 40
233   %d = add i64 %c, %b
234   ret i64 %d
237 define i64 @addmul72(i64 %a, i64 %b) {
238 ; RV64I-LABEL: addmul72:
239 ; RV64I:       # %bb.0:
240 ; RV64I-NEXT:    li a2, 72
241 ; RV64I-NEXT:    mul a0, a0, a2
242 ; RV64I-NEXT:    add a0, a0, a1
243 ; RV64I-NEXT:    ret
245 ; RV64XTHEADBA-LABEL: addmul72:
246 ; RV64XTHEADBA:       # %bb.0:
247 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
248 ; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
249 ; RV64XTHEADBA-NEXT:    ret
250   %c = mul i64 %a, 72
251   %d = add i64 %c, %b
252   ret i64 %d
255 define i64 @mul96(i64 %a) {
256 ; RV64I-LABEL: mul96:
257 ; RV64I:       # %bb.0:
258 ; RV64I-NEXT:    li a1, 96
259 ; RV64I-NEXT:    mul a0, a0, a1
260 ; RV64I-NEXT:    ret
262 ; RV64XTHEADBA-LABEL: mul96:
263 ; RV64XTHEADBA:       # %bb.0:
264 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
265 ; RV64XTHEADBA-NEXT:    slli a0, a0, 5
266 ; RV64XTHEADBA-NEXT:    ret
267   %c = mul i64 %a, 96
268   ret i64 %c
271 define i64 @mul160(i64 %a) {
272 ; RV64I-LABEL: mul160:
273 ; RV64I:       # %bb.0:
274 ; RV64I-NEXT:    li a1, 160
275 ; RV64I-NEXT:    mul a0, a0, a1
276 ; RV64I-NEXT:    ret
278 ; RV64XTHEADBA-LABEL: mul160:
279 ; RV64XTHEADBA:       # %bb.0:
280 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
281 ; RV64XTHEADBA-NEXT:    slli a0, a0, 5
282 ; RV64XTHEADBA-NEXT:    ret
283   %c = mul i64 %a, 160
284   ret i64 %c
287 define i64 @mul200(i64 %a) {
288 ; RV64I-LABEL: mul200:
289 ; RV64I:       # %bb.0:
290 ; RV64I-NEXT:    li a1, 200
291 ; RV64I-NEXT:    mul a0, a0, a1
292 ; RV64I-NEXT:    ret
294 ; RV64XTHEADBA-LABEL: mul200:
295 ; RV64XTHEADBA:       # %bb.0:
296 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
297 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
298 ; RV64XTHEADBA-NEXT:    slli a0, a0, 3
299 ; RV64XTHEADBA-NEXT:    ret
300   %c = mul i64 %a, 200
301   ret i64 %c
304 define i64 @mul288(i64 %a) {
305 ; RV64I-LABEL: mul288:
306 ; RV64I:       # %bb.0:
307 ; RV64I-NEXT:    li a1, 288
308 ; RV64I-NEXT:    mul a0, a0, a1
309 ; RV64I-NEXT:    ret
311 ; RV64XTHEADBA-LABEL: mul288:
312 ; RV64XTHEADBA:       # %bb.0:
313 ; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
314 ; RV64XTHEADBA-NEXT:    slli a0, a0, 5
315 ; RV64XTHEADBA-NEXT:    ret
316   %c = mul i64 %a, 288
317   ret i64 %c