[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / combine-add.mir
bloba0142afd067770e972223a6f40e3b7a83c2352ec
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs -mtriple aarch64-unknown-unknown %s -o - | FileCheck %s
4 ---
5 name:            add_lhs_sub_reg
6 alignment:       4
7 tracksRegLiveness: true
8 frameInfo:
9   maxAlignment:    1
10 machineFunctionInfo: {}
11 body:             |
12   bb.0:
13     liveins: $w0, $w1
14     ; CHECK-LABEL: name: add_lhs_sub_reg
15     ; CHECK: liveins: $w0, $w1
16     ; CHECK-NEXT: {{  $}}
17     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
18     ; CHECK-NEXT: $w0 = COPY [[COPY]](s32)
19     %0:_(s32) = COPY $w0
20     %1:_(s32) = COPY $w1
21     %2:_(s32) = G_SUB %0, %1
22     %3:_(s32) = G_ADD %2, %1
23     $w0 = COPY %3
24 ...
25 ---
26 name:            add_lhs_sub_reg_wide
27 alignment:       4
28 tracksRegLiveness: true
29 frameInfo:
30   maxAlignment:    1
31 machineFunctionInfo: {}
32 body:             |
33   bb.0:
34     liveins: $q0, $q1
35     ; CHECK-LABEL: name: add_lhs_sub_reg_wide
36     ; CHECK: liveins: $q0, $q1
37     ; CHECK-NEXT: {{  $}}
38     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s128) = COPY $q0
39     ; CHECK-NEXT: $q0 = COPY [[COPY]](s128)
40     %0:_(s128) = COPY $q0
41     %1:_(s128) = COPY $q1
42     %2:_(s128) = G_SUB %0, %1
43     %3:_(s128) = G_ADD %2, %1
44     $q0 = COPY %3
45 ...
46 ---
47 name:            add_lhs_sub_reg_vec
48 alignment:       4
49 tracksRegLiveness: true
50 frameInfo:
51   maxAlignment:    1
52 machineFunctionInfo: {}
53 body:             |
54   bb.0:
55     liveins: $x0, $x1
56     ; CHECK-LABEL: name: add_lhs_sub_reg_vec
57     ; CHECK: liveins: $x0, $x1
58     ; CHECK-NEXT: {{  $}}
59     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $x0
60     ; CHECK-NEXT: $x0 = COPY [[COPY]](<4 x s16>)
61     %0:_(<4 x s16>) = COPY $x0
62     %1:_(<4 x s16>) = COPY $x1
63     %2:_(<4 x s16>) = G_SUB %0, %1
64     %3:_(<4 x s16>) = G_ADD %2, %1
65     $x0 = COPY %3
66 ...
67 ---
68 name:            add_rhs_sub_reg
69 alignment:       4
70 tracksRegLiveness: true
71 frameInfo:
72   maxAlignment:    1
73 machineFunctionInfo: {}
74 body:             |
75   bb.0:
76     liveins: $w0, $w1
77     ; CHECK-LABEL: name: add_rhs_sub_reg
78     ; CHECK: liveins: $w0, $w1
79     ; CHECK-NEXT: {{  $}}
80     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
81     ; CHECK-NEXT: $w0 = COPY [[COPY]](s32)
82     %0:_(s32) = COPY $w0
83     %1:_(s32) = COPY $w1
84     %2:_(s32) = G_SUB %0, %1
85     %3:_(s32) = G_ADD %1, %2
86     $w0 = COPY %3
87 ...
88 ---
89 name:            add_rhs_sub_reg_wide
90 alignment:       4
91 tracksRegLiveness: true
92 frameInfo:
93   maxAlignment:    1
94 machineFunctionInfo: {}
95 body:             |
96   bb.0:
97     liveins: $q0, $q1
98     ; CHECK-LABEL: name: add_rhs_sub_reg_wide
99     ; CHECK: liveins: $q0, $q1
100     ; CHECK-NEXT: {{  $}}
101     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s128) = COPY $q0
102     ; CHECK-NEXT: $q0 = COPY [[COPY]](s128)
103     %0:_(s128) = COPY $q0
104     %1:_(s128) = COPY $q1
105     %2:_(s128) = G_SUB %0, %1
106     %3:_(s128) = G_ADD %1, %2
107     $q0 = COPY %3
110 name:            add_rhs_sub_reg_vec
111 alignment:       4
112 tracksRegLiveness: true
113 frameInfo:
114   maxAlignment:    1
115 machineFunctionInfo: {}
116 body:             |
117   bb.0:
118     liveins: $x0, $x1
119     ; CHECK-LABEL: name: add_rhs_sub_reg_vec
120     ; CHECK: liveins: $x0, $x1
121     ; CHECK-NEXT: {{  $}}
122     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $x0
123     ; CHECK-NEXT: $x0 = COPY [[COPY]](<4 x s16>)
124     %0:_(<4 x s16>) = COPY $x0
125     %1:_(<4 x s16>) = COPY $x1
126     %2:_(<4 x s16>) = G_SUB %0, %1
127     %3:_(<4 x s16>) = G_ADD %1, %2
128     $x0 = COPY %3
131 name:            fadd_by_zero
132 tracksRegLiveness: true
133 body:             |
134   bb.0:
135     liveins: $d0
136     ; CHECK-LABEL: name: fadd_by_zero
137     ; CHECK: liveins: $d0
138     ; CHECK-NEXT: {{  $}}
139     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d0
140     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 0.000000e+00
141     ; CHECK-NEXT: [[FADD:%[0-9]+]]:_(s64) = G_FADD [[COPY]], [[C]]
142     ; CHECK-NEXT: $d0 = COPY [[FADD]](s64)
143     %0:_(s64) = COPY $d0
144     %1:_(s64) = G_FCONSTANT double 0.000000e+00
145     %2:_(s64) = G_FADD %0, %1(s64)
146     $d0 = COPY %2(s64)
149 name:            fadd_vector_by_zero
150 alignment:       4
151 tracksRegLiveness: true
152 frameInfo:
153   maxAlignment:    1
154 machineFunctionInfo: {}
155 body:             |
156   bb.0:
157     liveins: $q0
158     ; CHECK-LABEL: name: fadd_vector_by_zero
159     ; CHECK: liveins: $q0
160     ; CHECK-NEXT: {{  $}}
161     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
162     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 0.000000e+00
163     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
164     ; CHECK-NEXT: [[FADD:%[0-9]+]]:_(<4 x s32>) = G_FADD [[COPY]], [[BUILD_VECTOR]]
165     ; CHECK-NEXT: $q0 = COPY [[FADD]](<4 x s32>)
166     %0:_(<4 x s32>) = COPY $q0
167     %1:_(s32) = G_FCONSTANT float 0.0
168     %2:_(<4 x s32>) = G_BUILD_VECTOR %1(s32), %1(s32), %1(s32), %1(s32)
169     %3:_(<4 x s32>) = G_FADD %0, %2(<4 x s32>)
170     $q0 = COPY %3(<4 x s32>)
174 name:            fadd_by_neg_zero
175 tracksRegLiveness: true
176 body:             |
177   bb.0:
178     liveins: $d0
179     ; CHECK-LABEL: name: fadd_by_neg_zero
180     ; CHECK: liveins: $d0
181     ; CHECK-NEXT: {{  $}}
182     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d0
183     ; CHECK-NEXT: $d0 = COPY [[COPY]](s64)
184     %0:_(s64) = COPY $d0
185     %1:_(s64) = G_FCONSTANT double -0.000000e+00
186     %2:_(s64) = G_FADD %0, %1(s64)
187     $d0 = COPY %2(s64)
190 name:            fadd_vector_by_neg_zero
191 alignment:       4
192 tracksRegLiveness: true
193 frameInfo:
194   maxAlignment:    1
195 machineFunctionInfo: {}
196 body:             |
197   bb.0:
198     liveins: $q0
199     ; CHECK-LABEL: name: fadd_vector_by_neg_zero
200     ; CHECK: liveins: $q0
201     ; CHECK-NEXT: {{  $}}
202     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
203     ; CHECK-NEXT: $q0 = COPY [[COPY]](<4 x s32>)
204     %0:_(<4 x s32>) = COPY $q0
205     %1:_(s32) = G_FCONSTANT float -0.0
206     %2:_(<4 x s32>) = G_BUILD_VECTOR %1(s32), %1(s32), %1(s32), %1(s32)
207     %3:_(<4 x s32>) = G_FADD %0, %2(<4 x s32>)
208     $q0 = COPY %3(<4 x s32>)
211 name:            saddl_v8i8_v8i32
212 tracksRegLiveness: true
213 body:             |
214   bb.1:
215     liveins: $d0, $d1
217     ; CHECK-LABEL: name: saddl_v8i8_v8i32
218     ; CHECK: liveins: $d0, $d1
219     ; CHECK-NEXT: {{  $}}
220     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
221     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
222     ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(<8 x s16>) = G_SEXT [[COPY]](<8 x s8>)
223     ; CHECK-NEXT: [[SEXT1:%[0-9]+]]:_(<8 x s16>) = G_SEXT [[COPY1]](<8 x s8>)
224     ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[SEXT]], [[SEXT1]]
225     ; CHECK-NEXT: [[SEXT2:%[0-9]+]]:_(<8 x s32>) = G_SEXT [[ADD]](<8 x s16>)
226     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[SEXT2]](<8 x s32>)
227     ; CHECK-NEXT: $q0 = COPY [[UV]](<4 x s32>)
228     ; CHECK-NEXT: $q1 = COPY [[UV1]](<4 x s32>)
229     ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
230     %0:_(<8 x s8>) = COPY $d0
231     %1:_(<8 x s8>) = COPY $d1
232     %2:_(<8 x s32>) = G_SEXT %0(<8 x s8>)
233     %3:_(<8 x s32>) = G_SEXT %1(<8 x s8>)
234     %4:_(<8 x s32>) = G_ADD %2, %3
235     %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %4(<8 x s32>)
236     $q0 = COPY %5(<4 x s32>)
237     $q1 = COPY %6(<4 x s32>)
238     RET_ReallyLR implicit $q0, implicit $q1
242 name:            uaddl_v8i8_v8i32
243 tracksRegLiveness: true
244 body:             |
245   bb.1:
246     liveins: $d0, $d1
248     ; CHECK-LABEL: name: uaddl_v8i8_v8i32
249     ; CHECK: liveins: $d0, $d1
250     ; CHECK-NEXT: {{  $}}
251     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
252     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
253     ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[COPY]](<8 x s8>)
254     ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[COPY1]](<8 x s8>)
255     ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[ZEXT]], [[ZEXT1]]
256     ; CHECK-NEXT: [[ZEXT2:%[0-9]+]]:_(<8 x s32>) = G_ZEXT [[ADD]](<8 x s16>)
257     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[ZEXT2]](<8 x s32>)
258     ; CHECK-NEXT: $q0 = COPY [[UV]](<4 x s32>)
259     ; CHECK-NEXT: $q1 = COPY [[UV1]](<4 x s32>)
260     ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
261     %0:_(<8 x s8>) = COPY $d0
262     %1:_(<8 x s8>) = COPY $d1
263     %2:_(<8 x s32>) = G_ZEXT %0(<8 x s8>)
264     %3:_(<8 x s32>) = G_ZEXT %1(<8 x s8>)
265     %4:_(<8 x s32>) = G_ADD %2, %3
266     %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %4(<8 x s32>)
267     $q0 = COPY %5(<4 x s32>)
268     $q1 = COPY %6(<4 x s32>)
269     RET_ReallyLR implicit $q0, implicit $q1
273 name:            ssubl_v8i8_v8i32
274 tracksRegLiveness: true
275 body:             |
276   bb.1:
277     liveins: $d0, $d1
279     ; CHECK-LABEL: name: ssubl_v8i8_v8i32
280     ; CHECK: liveins: $d0, $d1
281     ; CHECK-NEXT: {{  $}}
282     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
283     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
284     ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(<8 x s16>) = G_SEXT [[COPY]](<8 x s8>)
285     ; CHECK-NEXT: [[SEXT1:%[0-9]+]]:_(<8 x s16>) = G_SEXT [[COPY1]](<8 x s8>)
286     ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(<8 x s16>) = G_SUB [[SEXT]], [[SEXT1]]
287     ; CHECK-NEXT: [[SEXT2:%[0-9]+]]:_(<8 x s32>) = G_SEXT [[SUB]](<8 x s16>)
288     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[SEXT2]](<8 x s32>)
289     ; CHECK-NEXT: $q0 = COPY [[UV]](<4 x s32>)
290     ; CHECK-NEXT: $q1 = COPY [[UV1]](<4 x s32>)
291     ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
292     %0:_(<8 x s8>) = COPY $d0
293     %1:_(<8 x s8>) = COPY $d1
294     %2:_(<8 x s32>) = G_SEXT %0(<8 x s8>)
295     %3:_(<8 x s32>) = G_SEXT %1(<8 x s8>)
296     %4:_(<8 x s32>) = G_SUB %2, %3
297     %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %4(<8 x s32>)
298     $q0 = COPY %5(<4 x s32>)
299     $q1 = COPY %6(<4 x s32>)
300     RET_ReallyLR implicit $q0, implicit $q1
304 name:            usubl_v8i8_v8i32
305 tracksRegLiveness: true
306 body:             |
307   bb.1:
308     liveins: $d0, $d1
310     ; CHECK-LABEL: name: usubl_v8i8_v8i32
311     ; CHECK: liveins: $d0, $d1
312     ; CHECK-NEXT: {{  $}}
313     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
314     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
315     ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[COPY]](<8 x s8>)
316     ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[COPY1]](<8 x s8>)
317     ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(<8 x s16>) = G_SUB [[ZEXT]], [[ZEXT1]]
318     ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(<8 x s32>) = G_SEXT [[SUB]](<8 x s16>)
319     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[SEXT]](<8 x s32>)
320     ; CHECK-NEXT: $q0 = COPY [[UV]](<4 x s32>)
321     ; CHECK-NEXT: $q1 = COPY [[UV1]](<4 x s32>)
322     ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
323     %0:_(<8 x s8>) = COPY $d0
324     %1:_(<8 x s8>) = COPY $d1
325     %2:_(<8 x s32>) = G_ZEXT %0(<8 x s8>)
326     %3:_(<8 x s32>) = G_ZEXT %1(<8 x s8>)
327     %4:_(<8 x s32>) = G_SUB %2, %3
328     %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %4(<8 x s32>)
329     $q0 = COPY %5(<4 x s32>)
330     $q1 = COPY %6(<4 x s32>)
331     RET_ReallyLR implicit $q0, implicit $q1