[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-cntp-combine-i64.ll
blobbf4cad0bb33cf6184558e5e8bdba03f32f35ebd7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s | FileCheck %s
4 target triple = "aarch64-unknown-linux-gnu"
6 ; INCP
8 define i64 @cntp_add_all_active_nxv16i1(i64 %x, <vscale x 16 x i1> %pg) #0 {
9 ; CHECK-LABEL: cntp_add_all_active_nxv16i1:
10 ; CHECK:       // %bb.0:
11 ; CHECK-NEXT:    incp x0, p0.b
12 ; CHECK-NEXT:    ret
13   %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)
14   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %pg)
15   %add = add i64 %2, %x
16   ret i64 %add
19 define i64 @cntp_add_all_active_nxv8i1(i64 %x, <vscale x 8 x i1> %pg) #0 {
20 ; CHECK-LABEL: cntp_add_all_active_nxv8i1:
21 ; CHECK:       // %bb.0:
22 ; CHECK-NEXT:    incp x0, p0.h
23 ; CHECK-NEXT:    ret
24   %1 = tail call <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32 31)
25   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1> %1, <vscale x 8 x i1> %pg)
26   %add = add i64 %2, %x
27   ret i64 %add
30 define i64 @cntp_add_all_active_nxv4i1(i64 %x, <vscale x 4 x i1> %pg) #0 {
31 ; CHECK-LABEL: cntp_add_all_active_nxv4i1:
32 ; CHECK:       // %bb.0:
33 ; CHECK-NEXT:    incp x0, p0.s
34 ; CHECK-NEXT:    ret
35   %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
36   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %pg)
37   %add = add i64 %2, %x
38   ret i64 %add
41 define i64 @cntp_add_all_active_nxv2i1(i64 %x, <vscale x 2 x i1> %pg) #0 {
42 ; CHECK-LABEL: cntp_add_all_active_nxv2i1:
43 ; CHECK:       // %bb.0:
44 ; CHECK-NEXT:    incp x0, p0.d
45 ; CHECK-NEXT:    ret
46   %1 = tail call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
47   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %1, <vscale x 2 x i1> %pg)
48   %add = add i64 %2, %x
49   ret i64 %add
52 define i64 @cntp_add_all_active_nxv8i1_via_cast(i64 %x, <vscale x 8 x i1> %pg) #0 {
53 ; CHECK-LABEL: cntp_add_all_active_nxv8i1_via_cast:
54 ; CHECK:       // %bb.0:
55 ; CHECK-NEXT:    incp x0, p0.h
56 ; CHECK-NEXT:    ret
57   %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)
58   %2 = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %1)
59   %3 = tail call i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1> %2, <vscale x 8 x i1> %pg)
60   %add = add i64 %3, %x
61   ret i64 %add
64 define i64 @cntp_add_all_active_nxv2i1_multiuse(i64 %x, <vscale x 2 x i1> %pg) #0 {
65 ; CHECK-LABEL: cntp_add_all_active_nxv2i1_multiuse:
66 ; CHECK:       // %bb.0:
67 ; CHECK-NEXT:    ptrue p1.d
68 ; CHECK-NEXT:    cntp x8, p1, p0.d
69 ; CHECK-NEXT:    add x9, x8, x0
70 ; CHECK-NEXT:    madd x0, x8, x0, x9
71 ; CHECK-NEXT:    ret
72   %1 = tail call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
73   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %1, <vscale x 2 x i1> %pg)
74   %add = add i64 %2, %x
75   %mul = mul i64 %2, %x
76   %res = add i64 %add, %mul
77   ret i64 %res
80 define i64 @cntp_add_same_active_nxv16i1(i64 %x, <vscale x 16 x i1> %pg) #0 {
81 ; CHECK-LABEL: cntp_add_same_active_nxv16i1:
82 ; CHECK:       // %bb.0:
83 ; CHECK-NEXT:    incp x0, p0.b
84 ; CHECK-NEXT:    ret
85   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %pg)
86   %add = add i64 %1, %x
87   ret i64 %add
90 define i64 @cntp_add_same_active_nxv8i1(i64 %x, <vscale x 8 x i1> %pg) #0 {
91 ; CHECK-LABEL: cntp_add_same_active_nxv8i1:
92 ; CHECK:       // %bb.0:
93 ; CHECK-NEXT:    incp x0, p0.h
94 ; CHECK-NEXT:    ret
95   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1> %pg, <vscale x 8 x i1> %pg)
96   %add = add i64 %1, %x
97   ret i64 %add
100 define i64 @cntp_add_same_active_nxv4i1(i64 %x, <vscale x 4 x i1> %pg) #0 {
101 ; CHECK-LABEL: cntp_add_same_active_nxv4i1:
102 ; CHECK:       // %bb.0:
103 ; CHECK-NEXT:    incp x0, p0.s
104 ; CHECK-NEXT:    ret
105   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv4i1(<vscale x 4 x i1> %pg, <vscale x 4 x i1> %pg)
106   %add = add i64 %1, %x
107   ret i64 %add
110 define i64 @cntp_add_same_active_nxv2i1(i64 %x, <vscale x 2 x i1> %pg) #0 {
111 ; CHECK-LABEL: cntp_add_same_active_nxv2i1:
112 ; CHECK:       // %bb.0:
113 ; CHECK-NEXT:    incp x0, p0.d
114 ; CHECK-NEXT:    ret
115   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %pg, <vscale x 2 x i1> %pg)
116   %add = add i64 %1, %x
117   ret i64 %add
120 define i64 @cntp_add_same_active_nxv2i1_multiuse(i64 %x, <vscale x 2 x i1> %pg) #0 {
121 ; CHECK-LABEL: cntp_add_same_active_nxv2i1_multiuse:
122 ; CHECK:       // %bb.0:
123 ; CHECK-NEXT:    cntp x8, p0, p0.d
124 ; CHECK-NEXT:    add x9, x8, x0
125 ; CHECK-NEXT:    madd x0, x8, x0, x9
126 ; CHECK-NEXT:    ret
127   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %pg, <vscale x 2 x i1> %pg)
128   %add = add i64 %1, %x
129   %mul = mul i64 %1, %x
130   %res = add i64 %add, %mul
131   ret i64 %res
134 ; DECP
136 define i64 @cntp_sub_all_active_nxv16i1(i64 %x, <vscale x 16 x i1> %pg) #0 {
137 ; CHECK-LABEL: cntp_sub_all_active_nxv16i1:
138 ; CHECK:       // %bb.0:
139 ; CHECK-NEXT:    decp x0, p0.b
140 ; CHECK-NEXT:    ret
141   %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)
142   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %pg)
143   %sub = sub i64 %x, %2
144   ret i64 %sub
147 define i64 @cntp_sub_all_active_nxv8i1(i64 %x, <vscale x 8 x i1> %pg) #0 {
148 ; CHECK-LABEL: cntp_sub_all_active_nxv8i1:
149 ; CHECK:       // %bb.0:
150 ; CHECK-NEXT:    decp x0, p0.h
151 ; CHECK-NEXT:    ret
152   %1 = tail call <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32 31)
153   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1> %1, <vscale x 8 x i1> %pg)
154   %sub = sub i64 %x, %2
155   ret i64 %sub
158 define i64 @cntp_sub_all_active_nxv4i1(i64 %x, <vscale x 4 x i1> %pg) #0 {
159 ; CHECK-LABEL: cntp_sub_all_active_nxv4i1:
160 ; CHECK:       // %bb.0:
161 ; CHECK-NEXT:    decp x0, p0.s
162 ; CHECK-NEXT:    ret
163   %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
164   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %pg)
165   %sub = sub i64 %x, %2
166   ret i64 %sub
169 define i64 @cntp_sub_all_active_nxv2i1(i64 %x, <vscale x 2 x i1> %pg) #0 {
170 ; CHECK-LABEL: cntp_sub_all_active_nxv2i1:
171 ; CHECK:       // %bb.0:
172 ; CHECK-NEXT:    decp x0, p0.d
173 ; CHECK-NEXT:    ret
174   %1 = tail call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
175   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %1, <vscale x 2 x i1> %pg)
176   %sub = sub i64 %x, %2
177   ret i64 %sub
180 define i64 @cntp_sub_all_active_nxv8i1_via_cast(i64 %x, <vscale x 8 x i1> %pg) #0 {
181 ; CHECK-LABEL: cntp_sub_all_active_nxv8i1_via_cast:
182 ; CHECK:       // %bb.0:
183 ; CHECK-NEXT:    decp x0, p0.h
184 ; CHECK-NEXT:    ret
185   %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)
186   %2 = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %1)
187   %3 = tail call i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1> %2, <vscale x 8 x i1> %pg)
188   %sub = sub i64 %x, %3
189   ret i64 %sub
192 define i64 @cntp_sub_all_active_nxv2i1_multiuse(i64 %x, <vscale x 2 x i1> %pg) #0 {
193 ; CHECK-LABEL: cntp_sub_all_active_nxv2i1_multiuse:
194 ; CHECK:       // %bb.0:
195 ; CHECK-NEXT:    ptrue p1.d
196 ; CHECK-NEXT:    cntp x8, p1, p0.d
197 ; CHECK-NEXT:    sub x9, x8, x0
198 ; CHECK-NEXT:    madd x0, x8, x0, x9
199 ; CHECK-NEXT:    ret
200   %1 = tail call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
201   %2 = tail call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %1, <vscale x 2 x i1> %pg)
202   %sub = sub i64 %2, %x
203   %mul = mul i64 %2, %x
204   %res = add i64 %sub, %mul
205   ret i64 %res
208 define i64 @cntp_sub_same_active_nxv16i1(i64 %x, <vscale x 16 x i1> %pg) #0 {
209 ; CHECK-LABEL: cntp_sub_same_active_nxv16i1:
210 ; CHECK:       // %bb.0:
211 ; CHECK-NEXT:    decp x0, p0.b
212 ; CHECK-NEXT:    ret
213   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %pg)
214   %sub = sub i64 %x, %1
215   ret i64 %sub
218 define i64 @cntp_sub_same_active_nxv8i1(i64 %x, <vscale x 8 x i1> %pg) #0 {
219 ; CHECK-LABEL: cntp_sub_same_active_nxv8i1:
220 ; CHECK:       // %bb.0:
221 ; CHECK-NEXT:    decp x0, p0.h
222 ; CHECK-NEXT:    ret
223   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1> %pg, <vscale x 8 x i1> %pg)
224   %sub = sub i64 %x, %1
225   ret i64 %sub
228 define i64 @cntp_sub_same_active_nxv4i1(i64 %x, <vscale x 4 x i1> %pg) #0 {
229 ; CHECK-LABEL: cntp_sub_same_active_nxv4i1:
230 ; CHECK:       // %bb.0:
231 ; CHECK-NEXT:    decp x0, p0.s
232 ; CHECK-NEXT:    ret
233   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv4i1(<vscale x 4 x i1> %pg, <vscale x 4 x i1> %pg)
234   %sub = sub i64 %x, %1
235   ret i64 %sub
238 define i64 @cntp_sub_same_active_nxv2i1(i64 %x, <vscale x 2 x i1> %pg) #0 {
239 ; CHECK-LABEL: cntp_sub_same_active_nxv2i1:
240 ; CHECK:       // %bb.0:
241 ; CHECK-NEXT:    decp x0, p0.d
242 ; CHECK-NEXT:    ret
243   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %pg, <vscale x 2 x i1> %pg)
244   %sub = sub i64 %x, %1
245   ret i64 %sub
248 define i64 @cntp_sub_same_active_nxv2i1_multiuse(i64 %x, <vscale x 2 x i1> %pg) #0 {
249 ; CHECK-LABEL: cntp_sub_same_active_nxv2i1_multiuse:
250 ; CHECK:       // %bb.0:
251 ; CHECK-NEXT:    cntp x8, p0, p0.d
252 ; CHECK-NEXT:    sub x9, x8, x0
253 ; CHECK-NEXT:    madd x0, x8, x0, x9
254 ; CHECK-NEXT:    ret
255   %1 = tail call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %pg, <vscale x 2 x i1> %pg)
256   %sub = sub i64 %1, %x
257   %mul = mul i64 %1, %x
258   %res = add i64 %sub, %mul
259   ret i64 %res
262 declare <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1>)
263 declare <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1>)
264 declare <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1>)
266 declare <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32)
267 declare <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32)
268 declare <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32)
269 declare <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32)
271 declare i64 @llvm.aarch64.sve.cntp.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>)
272 declare i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1>, <vscale x 8 x i1>)
273 declare i64 @llvm.aarch64.sve.cntp.nxv4i1(<vscale x 4 x i1>, <vscale x 4 x i1>)
274 declare i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1>, <vscale x 2 x i1>)
276 attributes #0 = { "target-features"="+sve" }