[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / replace-intrinsics-with-veclib-armpl.ll
blob127514961f48dfdfcbaeb802306b433510312508
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2
2 ; RUN: opt -S -vector-library=ArmPL -replace-with-veclib < %s | FileCheck %s
4 target triple = "aarch64-unknown-linux-gnu"
7 ; The replace-with-veclib pass does not work with scalable types, thus
8 ; the mappings aren't utilised. Tests will need to be regenerated when the
9 ; pass is improved.
12 declare <2 x double> @llvm.cos.v2f64(<2 x double>)
13 declare <4 x float> @llvm.cos.v4f32(<4 x float>)
14 declare <vscale x 2 x double> @llvm.cos.nxv2f64(<vscale x 2 x double>)
15 declare <vscale x 4 x float> @llvm.cos.nxv4f32(<vscale x 4 x float>)
18 ; CHECK: @[[LLVM_COMPILER_USED:[a-zA-Z0-9_$"\\.-]+]] = appending global [14 x ptr] [ptr @armpl_vcosq_f64, ptr @armpl_vcosq_f32, ptr @armpl_vsinq_f64, ptr @armpl_vsinq_f32, ptr @armpl_vexpq_f64, ptr @armpl_vexpq_f32, ptr @armpl_vexp2q_f64, ptr @armpl_vexp2q_f32, ptr @armpl_vlogq_f64, ptr @armpl_vlogq_f32, ptr @armpl_vlog2q_f64, ptr @armpl_vlog2q_f32, ptr @armpl_vlog10q_f64, ptr @armpl_vlog10q_f32], section "llvm.metadata"
20 define <2 x double> @llvm_cos_f64(<2 x double> %in) {
21 ; CHECK-LABEL: define <2 x double> @llvm_cos_f64
22 ; CHECK-SAME: (<2 x double> [[IN:%.*]]) {
23 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @armpl_vcosq_f64(<2 x double> [[IN]])
24 ; CHECK-NEXT:    ret <2 x double> [[TMP1]]
26   %1 = call fast <2 x double> @llvm.cos.v2f64(<2 x double> %in)
27   ret <2 x double> %1
30 define <4 x float> @llvm_cos_f32(<4 x float> %in) {
31 ; CHECK-LABEL: define <4 x float> @llvm_cos_f32
32 ; CHECK-SAME: (<4 x float> [[IN:%.*]]) {
33 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <4 x float> @armpl_vcosq_f32(<4 x float> [[IN]])
34 ; CHECK-NEXT:    ret <4 x float> [[TMP1]]
36   %1 = call fast <4 x float> @llvm.cos.v4f32(<4 x float> %in)
37   ret <4 x float> %1
40 define <vscale x 2 x double> @llvm_cos_vscale_f64(<vscale x 2 x double> %in) #0 {
41 ; CHECK-LABEL: define <vscale x 2 x double> @llvm_cos_vscale_f64
42 ; CHECK-SAME: (<vscale x 2 x double> [[IN:%.*]]) #[[ATTR1:[0-9]+]] {
43 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 2 x double> @llvm.cos.nxv2f64(<vscale x 2 x double> [[IN]])
44 ; CHECK-NEXT:    ret <vscale x 2 x double> [[TMP1]]
46   %1 = call fast <vscale x 2 x double> @llvm.cos.nxv2f64(<vscale x 2 x double> %in)
47   ret <vscale x 2 x double> %1
50 define <vscale x 4 x float> @llvm_cos_vscale_f32(<vscale x 4 x float> %in) #0 {
51 ; CHECK-LABEL: define <vscale x 4 x float> @llvm_cos_vscale_f32
52 ; CHECK-SAME: (<vscale x 4 x float> [[IN:%.*]]) #[[ATTR1]] {
53 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 4 x float> @llvm.cos.nxv4f32(<vscale x 4 x float> [[IN]])
54 ; CHECK-NEXT:    ret <vscale x 4 x float> [[TMP1]]
56   %1 = call fast <vscale x 4 x float> @llvm.cos.nxv4f32(<vscale x 4 x float> %in)
57   ret <vscale x 4 x float> %1
60 declare <2 x double> @llvm.sin.v2f64(<2 x double>)
61 declare <4 x float> @llvm.sin.v4f32(<4 x float>)
62 declare <vscale x 2 x double> @llvm.sin.nxv2f64(<vscale x 2 x double>)
63 declare <vscale x 4 x float> @llvm.sin.nxv4f32(<vscale x 4 x float>)
65 define <2 x double> @llvm_sin_f64(<2 x double> %in) {
66 ; CHECK-LABEL: define <2 x double> @llvm_sin_f64
67 ; CHECK-SAME: (<2 x double> [[IN:%.*]]) {
68 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @armpl_vsinq_f64(<2 x double> [[IN]])
69 ; CHECK-NEXT:    ret <2 x double> [[TMP1]]
71   %1 = call fast <2 x double> @llvm.sin.v2f64(<2 x double> %in)
72   ret <2 x double> %1
75 define <4 x float> @llvm_sin_f32(<4 x float> %in) {
76 ; CHECK-LABEL: define <4 x float> @llvm_sin_f32
77 ; CHECK-SAME: (<4 x float> [[IN:%.*]]) {
78 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <4 x float> @armpl_vsinq_f32(<4 x float> [[IN]])
79 ; CHECK-NEXT:    ret <4 x float> [[TMP1]]
81   %1 = call fast <4 x float> @llvm.sin.v4f32(<4 x float> %in)
82   ret <4 x float> %1
85 define <vscale x 2 x double> @llvm_sin_vscale_f64(<vscale x 2 x double> %in) #0 {
86 ; CHECK-LABEL: define <vscale x 2 x double> @llvm_sin_vscale_f64
87 ; CHECK-SAME: (<vscale x 2 x double> [[IN:%.*]]) #[[ATTR1]] {
88 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 2 x double> @llvm.sin.nxv2f64(<vscale x 2 x double> [[IN]])
89 ; CHECK-NEXT:    ret <vscale x 2 x double> [[TMP1]]
91   %1 = call fast <vscale x 2 x double> @llvm.sin.nxv2f64(<vscale x 2 x double> %in)
92   ret <vscale x 2 x double> %1
95 define <vscale x 4 x float> @llvm_sin_vscale_f32(<vscale x 4 x float> %in) #0 {
96 ; CHECK-LABEL: define <vscale x 4 x float> @llvm_sin_vscale_f32
97 ; CHECK-SAME: (<vscale x 4 x float> [[IN:%.*]]) #[[ATTR1]] {
98 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 4 x float> @llvm.sin.nxv4f32(<vscale x 4 x float> [[IN]])
99 ; CHECK-NEXT:    ret <vscale x 4 x float> [[TMP1]]
101   %1 = call fast <vscale x 4 x float> @llvm.sin.nxv4f32(<vscale x 4 x float> %in)
102   ret <vscale x 4 x float> %1
105 declare <2 x double> @llvm.exp.v2f64(<2 x double>)
106 declare <4 x float> @llvm.exp.v4f32(<4 x float>)
107 declare <vscale x 2 x double> @llvm.exp.nxv2f64(<vscale x 2 x double>)
108 declare <vscale x 4 x float> @llvm.exp.nxv4f32(<vscale x 4 x float>)
110 define <2 x double> @llvm_exp_f64(<2 x double> %in) {
111 ; CHECK-LABEL: define <2 x double> @llvm_exp_f64
112 ; CHECK-SAME: (<2 x double> [[IN:%.*]]) {
113 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @armpl_vexpq_f64(<2 x double> [[IN]])
114 ; CHECK-NEXT:    ret <2 x double> [[TMP1]]
116   %1 = call fast <2 x double> @llvm.exp.v2f64(<2 x double> %in)
117   ret <2 x double> %1
120 define <4 x float> @llvm_exp_f32(<4 x float> %in) {
121 ; CHECK-LABEL: define <4 x float> @llvm_exp_f32
122 ; CHECK-SAME: (<4 x float> [[IN:%.*]]) {
123 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <4 x float> @armpl_vexpq_f32(<4 x float> [[IN]])
124 ; CHECK-NEXT:    ret <4 x float> [[TMP1]]
126   %1 = call fast <4 x float> @llvm.exp.v4f32(<4 x float> %in)
127   ret <4 x float> %1
130 define <vscale x 2 x double> @llvm_exp_vscale_f64(<vscale x 2 x double> %in) #0 {
131 ; CHECK-LABEL: define <vscale x 2 x double> @llvm_exp_vscale_f64
132 ; CHECK-SAME: (<vscale x 2 x double> [[IN:%.*]]) #[[ATTR1]] {
133 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 2 x double> @llvm.exp.nxv2f64(<vscale x 2 x double> [[IN]])
134 ; CHECK-NEXT:    ret <vscale x 2 x double> [[TMP1]]
136   %1 = call fast <vscale x 2 x double> @llvm.exp.nxv2f64(<vscale x 2 x double> %in)
137   ret <vscale x 2 x double> %1
140 define <vscale x 4 x float> @llvm_exp_vscale_f32(<vscale x 4 x float> %in) #0 {
141 ; CHECK-LABEL: define <vscale x 4 x float> @llvm_exp_vscale_f32
142 ; CHECK-SAME: (<vscale x 4 x float> [[IN:%.*]]) #[[ATTR1]] {
143 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 4 x float> @llvm.exp.nxv4f32(<vscale x 4 x float> [[IN]])
144 ; CHECK-NEXT:    ret <vscale x 4 x float> [[TMP1]]
146   %1 = call fast <vscale x 4 x float> @llvm.exp.nxv4f32(<vscale x 4 x float> %in)
147   ret <vscale x 4 x float> %1
150 declare <2 x double> @llvm.exp2.v2f64(<2 x double>)
151 declare <4 x float> @llvm.exp2.v4f32(<4 x float>)
152 declare <vscale x 2 x double> @llvm.exp2.nxv2f64(<vscale x 2 x double>)
153 declare <vscale x 4 x float> @llvm.exp2.nxv4f32(<vscale x 4 x float>)
155 define <2 x double> @llvm_exp2_f64(<2 x double> %in) {
156 ; CHECK-LABEL: define <2 x double> @llvm_exp2_f64
157 ; CHECK-SAME: (<2 x double> [[IN:%.*]]) {
158 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @armpl_vexp2q_f64(<2 x double> [[IN]])
159 ; CHECK-NEXT:    ret <2 x double> [[TMP1]]
161   %1 = call fast <2 x double> @llvm.exp2.v2f64(<2 x double> %in)
162   ret <2 x double> %1
165 define <4 x float> @llvm_exp2_f32(<4 x float> %in) {
166 ; CHECK-LABEL: define <4 x float> @llvm_exp2_f32
167 ; CHECK-SAME: (<4 x float> [[IN:%.*]]) {
168 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <4 x float> @armpl_vexp2q_f32(<4 x float> [[IN]])
169 ; CHECK-NEXT:    ret <4 x float> [[TMP1]]
171   %1 = call fast <4 x float> @llvm.exp2.v4f32(<4 x float> %in)
172   ret <4 x float> %1
175 define <vscale x 2 x double> @llvm_exp2_vscale_f64(<vscale x 2 x double> %in) #0 {
176 ; CHECK-LABEL: define <vscale x 2 x double> @llvm_exp2_vscale_f64
177 ; CHECK-SAME: (<vscale x 2 x double> [[IN:%.*]]) #[[ATTR1]] {
178 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 2 x double> @llvm.exp2.nxv2f64(<vscale x 2 x double> [[IN]])
179 ; CHECK-NEXT:    ret <vscale x 2 x double> [[TMP1]]
181   %1 = call fast <vscale x 2 x double> @llvm.exp2.nxv2f64(<vscale x 2 x double> %in)
182   ret <vscale x 2 x double> %1
185 define <vscale x 4 x float> @llvm_exp2_vscale_f32(<vscale x 4 x float> %in) #0 {
186 ; CHECK-LABEL: define <vscale x 4 x float> @llvm_exp2_vscale_f32
187 ; CHECK-SAME: (<vscale x 4 x float> [[IN:%.*]]) #[[ATTR1]] {
188 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 4 x float> @llvm.exp2.nxv4f32(<vscale x 4 x float> [[IN]])
189 ; CHECK-NEXT:    ret <vscale x 4 x float> [[TMP1]]
191   %1 = call fast <vscale x 4 x float> @llvm.exp2.nxv4f32(<vscale x 4 x float> %in)
192   ret <vscale x 4 x float> %1
196 declare <2 x double> @llvm.log.v2f64(<2 x double>)
197 declare <4 x float> @llvm.log.v4f32(<4 x float>)
198 declare <vscale x 2 x double> @llvm.log.nxv2f64(<vscale x 2 x double>)
199 declare <vscale x 4 x float> @llvm.log.nxv4f32(<vscale x 4 x float>)
201 define <2 x double> @llvm_log_f64(<2 x double> %in) {
202 ; CHECK-LABEL: define <2 x double> @llvm_log_f64
203 ; CHECK-SAME: (<2 x double> [[IN:%.*]]) {
204 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @armpl_vlogq_f64(<2 x double> [[IN]])
205 ; CHECK-NEXT:    ret <2 x double> [[TMP1]]
207   %1 = call fast <2 x double> @llvm.log.v2f64(<2 x double> %in)
208   ret <2 x double> %1
211 define <4 x float> @llvm_log_f32(<4 x float> %in) {
212 ; CHECK-LABEL: define <4 x float> @llvm_log_f32
213 ; CHECK-SAME: (<4 x float> [[IN:%.*]]) {
214 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <4 x float> @armpl_vlogq_f32(<4 x float> [[IN]])
215 ; CHECK-NEXT:    ret <4 x float> [[TMP1]]
217   %1 = call fast <4 x float> @llvm.log.v4f32(<4 x float> %in)
218   ret <4 x float> %1
221 define <vscale x 2 x double> @llvm_log_vscale_f64(<vscale x 2 x double> %in) #0 {
222 ; CHECK-LABEL: define <vscale x 2 x double> @llvm_log_vscale_f64
223 ; CHECK-SAME: (<vscale x 2 x double> [[IN:%.*]]) #[[ATTR1]] {
224 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 2 x double> @llvm.log.nxv2f64(<vscale x 2 x double> [[IN]])
225 ; CHECK-NEXT:    ret <vscale x 2 x double> [[TMP1]]
227   %1 = call fast <vscale x 2 x double> @llvm.log.nxv2f64(<vscale x 2 x double> %in)
228   ret <vscale x 2 x double> %1
231 define <vscale x 4 x float> @llvm_log_vscale_f32(<vscale x 4 x float> %in) #0 {
232 ; CHECK-LABEL: define <vscale x 4 x float> @llvm_log_vscale_f32
233 ; CHECK-SAME: (<vscale x 4 x float> [[IN:%.*]]) #[[ATTR1]] {
234 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 4 x float> @llvm.log.nxv4f32(<vscale x 4 x float> [[IN]])
235 ; CHECK-NEXT:    ret <vscale x 4 x float> [[TMP1]]
237   %1 = call fast <vscale x 4 x float> @llvm.log.nxv4f32(<vscale x 4 x float> %in)
238   ret <vscale x 4 x float> %1
241 declare <2 x double> @llvm.log2.v2f64(<2 x double>)
242 declare <4 x float> @llvm.log2.v4f32(<4 x float>)
243 declare <vscale x 2 x double> @llvm.log2.nxv2f64(<vscale x 2 x double>)
244 declare <vscale x 4 x float> @llvm.log2.nxv4f32(<vscale x 4 x float>)
246 define <2 x double> @llvm_log2_f64(<2 x double> %in) {
247 ; CHECK-LABEL: define <2 x double> @llvm_log2_f64
248 ; CHECK-SAME: (<2 x double> [[IN:%.*]]) {
249 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @armpl_vlog2q_f64(<2 x double> [[IN]])
250 ; CHECK-NEXT:    ret <2 x double> [[TMP1]]
252   %1 = call fast <2 x double> @llvm.log2.v2f64(<2 x double> %in)
253   ret <2 x double> %1
256 define <4 x float> @llvm_log2_f32(<4 x float> %in) {
257 ; CHECK-LABEL: define <4 x float> @llvm_log2_f32
258 ; CHECK-SAME: (<4 x float> [[IN:%.*]]) {
259 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <4 x float> @armpl_vlog2q_f32(<4 x float> [[IN]])
260 ; CHECK-NEXT:    ret <4 x float> [[TMP1]]
262   %1 = call fast <4 x float> @llvm.log2.v4f32(<4 x float> %in)
263   ret <4 x float> %1
266 define <vscale x 2 x double> @llvm_log2_vscale_f64(<vscale x 2 x double> %in) #0 {
267 ; CHECK-LABEL: define <vscale x 2 x double> @llvm_log2_vscale_f64
268 ; CHECK-SAME: (<vscale x 2 x double> [[IN:%.*]]) #[[ATTR1]] {
269 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 2 x double> @llvm.log2.nxv2f64(<vscale x 2 x double> [[IN]])
270 ; CHECK-NEXT:    ret <vscale x 2 x double> [[TMP1]]
272   %1 = call fast <vscale x 2 x double> @llvm.log2.nxv2f64(<vscale x 2 x double> %in)
273   ret <vscale x 2 x double> %1
276 define <vscale x 4 x float> @llvm_log2_vscale_f32(<vscale x 4 x float> %in) #0 {
277 ; CHECK-LABEL: define <vscale x 4 x float> @llvm_log2_vscale_f32
278 ; CHECK-SAME: (<vscale x 4 x float> [[IN:%.*]]) #[[ATTR1]] {
279 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 4 x float> @llvm.log2.nxv4f32(<vscale x 4 x float> [[IN]])
280 ; CHECK-NEXT:    ret <vscale x 4 x float> [[TMP1]]
282   %1 = call fast <vscale x 4 x float> @llvm.log2.nxv4f32(<vscale x 4 x float> %in)
283   ret <vscale x 4 x float> %1
286 declare <2 x double> @llvm.log10.v2f64(<2 x double>)
287 declare <4 x float> @llvm.log10.v4f32(<4 x float>)
288 declare <vscale x 2 x double> @llvm.log10.nxv2f64(<vscale x 2 x double>)
289 declare <vscale x 4 x float> @llvm.log10.nxv4f32(<vscale x 4 x float>)
291 define <2 x double> @llvm_log10_f64(<2 x double> %in) {
292 ; CHECK-LABEL: define <2 x double> @llvm_log10_f64
293 ; CHECK-SAME: (<2 x double> [[IN:%.*]]) {
294 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @armpl_vlog10q_f64(<2 x double> [[IN]])
295 ; CHECK-NEXT:    ret <2 x double> [[TMP1]]
297   %1 = call fast <2 x double> @llvm.log10.v2f64(<2 x double> %in)
298   ret <2 x double> %1
301 define <4 x float> @llvm_log10_f32(<4 x float> %in) {
302 ; CHECK-LABEL: define <4 x float> @llvm_log10_f32
303 ; CHECK-SAME: (<4 x float> [[IN:%.*]]) {
304 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <4 x float> @armpl_vlog10q_f32(<4 x float> [[IN]])
305 ; CHECK-NEXT:    ret <4 x float> [[TMP1]]
307   %1 = call fast <4 x float> @llvm.log10.v4f32(<4 x float> %in)
308   ret <4 x float> %1
311 define <vscale x 2 x double> @llvm_log10_vscale_f64(<vscale x 2 x double> %in) #0 {
312 ; CHECK-LABEL: define <vscale x 2 x double> @llvm_log10_vscale_f64
313 ; CHECK-SAME: (<vscale x 2 x double> [[IN:%.*]]) #[[ATTR1]] {
314 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 2 x double> @llvm.log10.nxv2f64(<vscale x 2 x double> [[IN]])
315 ; CHECK-NEXT:    ret <vscale x 2 x double> [[TMP1]]
317   %1 = call fast <vscale x 2 x double> @llvm.log10.nxv2f64(<vscale x 2 x double> %in)
318   ret <vscale x 2 x double> %1
321 define <vscale x 4 x float> @llvm_log10_vscale_f32(<vscale x 4 x float> %in) #0 {
322 ; CHECK-LABEL: define <vscale x 4 x float> @llvm_log10_vscale_f32
323 ; CHECK-SAME: (<vscale x 4 x float> [[IN:%.*]]) #[[ATTR1]] {
324 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 4 x float> @llvm.log10.nxv4f32(<vscale x 4 x float> [[IN]])
325 ; CHECK-NEXT:    ret <vscale x 4 x float> [[TMP1]]
327   %1 = call fast <vscale x 4 x float> @llvm.log10.nxv4f32(<vscale x 4 x float> %in)
328   ret <vscale x 4 x float> %1
331 declare <2 x double> @llvm.pow.v2f64(<2 x double>, <2 x double>)
332 declare <4 x float> @llvm.pow.v4f32(<4 x float>, <4 x float>)
333 declare <vscale x 2 x double> @llvm.pow.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
334 declare <vscale x 4 x float> @llvm.pow.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
337 ; There is a bug in the replace-with-veclib pass, and for intrinsics which take
338 ; more than one arguments, but has just one overloaded type, it incorrectly
339 ; reconstructs the scalar name, for pow specificlly it is searching for:
340 ; llvm.pow.f64.f64 and llvm.pow.f32.f32
343 define <2 x double> @llvm_pow_f64(<2 x double> %in, <2 x double> %power) {
344 ; CHECK-LABEL: define <2 x double> @llvm_pow_f64
345 ; CHECK-SAME: (<2 x double> [[IN:%.*]], <2 x double> [[POWER:%.*]]) {
346 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @llvm.pow.v2f64(<2 x double> [[IN]], <2 x double> [[POWER]])
347 ; CHECK-NEXT:    ret <2 x double> [[TMP1]]
349   %1 = call fast <2 x double> @llvm.pow.v2f64(<2 x double> %in, <2 x double> %power)
350   ret <2 x double> %1
353 define <4 x float> @llvm_pow_f32(<4 x float> %in, <4 x float> %power) {
354 ; CHECK-LABEL: define <4 x float> @llvm_pow_f32
355 ; CHECK-SAME: (<4 x float> [[IN:%.*]], <4 x float> [[POWER:%.*]]) {
356 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <4 x float> @llvm.pow.v4f32(<4 x float> [[IN]], <4 x float> [[POWER]])
357 ; CHECK-NEXT:    ret <4 x float> [[TMP1]]
359   %1 = call fast <4 x float> @llvm.pow.v4f32(<4 x float> %in, <4 x float> %power)
360   ret <4 x float> %1
363 define <vscale x 2 x double> @llvm_pow_vscale_f64(<vscale x 2 x double> %in, <vscale x 2 x double> %power) #0 {
364 ; CHECK-LABEL: define <vscale x 2 x double> @llvm_pow_vscale_f64
365 ; CHECK-SAME: (<vscale x 2 x double> [[IN:%.*]], <vscale x 2 x double> [[POWER:%.*]]) #[[ATTR1]] {
366 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 2 x double> @llvm.pow.nxv2f64(<vscale x 2 x double> [[IN]], <vscale x 2 x double> [[POWER]])
367 ; CHECK-NEXT:    ret <vscale x 2 x double> [[TMP1]]
369   %1 = call fast <vscale x 2 x double> @llvm.pow.nxv2f64(<vscale x 2 x double> %in, <vscale x 2 x double> %power)
370   ret <vscale x 2 x double> %1
373 define <vscale x 4 x float> @llvm_pow_vscale_f32(<vscale x 4 x float> %in, <vscale x 4 x float> %power) #0 {
374 ; CHECK-LABEL: define <vscale x 4 x float> @llvm_pow_vscale_f32
375 ; CHECK-SAME: (<vscale x 4 x float> [[IN:%.*]], <vscale x 4 x float> [[POWER:%.*]]) #[[ATTR1]] {
376 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast <vscale x 4 x float> @llvm.pow.nxv4f32(<vscale x 4 x float> [[IN]], <vscale x 4 x float> [[POWER]])
377 ; CHECK-NEXT:    ret <vscale x 4 x float> [[TMP1]]
379   %1 = call fast <vscale x 4 x float> @llvm.pow.nxv4f32(<vscale x 4 x float> %in, <vscale x 4 x float> %power)
380   ret <vscale x 4 x float> %1
383 attributes #0 = { "target-features"="+sve" }
385 ; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
386 ; CHECK: attributes #[[ATTR1]] = { "target-features"="+sve" }