1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=amdgpu-simplifylib,instcombine -amdgpu-prelink %s | FileCheck %s
4 target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8"
6 declare float @_Z4pownfi(float, i32)
7 declare <2 x float> @_Z4pownDv2_fDv2_i(<2 x float>, <2 x i32>)
8 declare <3 x float> @_Z4pownDv3_fDv3_i(<3 x float>, <3 x i32>)
9 declare <4 x float> @_Z4pownDv4_fDv4_i(<4 x float>, <4 x i32>)
10 declare <8 x float> @_Z4pownDv8_fDv8_i(<8 x float>, <8 x i32>)
11 declare <16 x float> @_Z4pownDv16_fDv16_i(<16 x float>, <16 x i32>)
12 declare double @_Z4powndi(double, i32)
13 declare <2 x double> @_Z4pownDv2_dDv2_i(<2 x double>, <2 x i32>)
14 declare <3 x double> @_Z4pownDv3_dDv3_i(<3 x double>, <3 x i32>)
15 declare <4 x double> @_Z4pownDv4_dDv4_i(<4 x double>, <4 x i32>)
16 declare <8 x double> @_Z4pownDv8_dDv8_i(<8 x double>, <8 x i32>)
17 declare <16 x double> @_Z4pownDv16_dDv16_i(<16 x double>, <16 x i32>)
18 declare half @_Z4pownDhi(half, i32)
19 declare <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half>, <2 x i32>)
20 declare <3 x half> @_Z4pownDv3_DhDv3_i(<3 x half>, <3 x i32>)
21 declare <4 x half> @_Z4pownDv4_DhDv4_i(<4 x half>, <4 x i32>)
22 declare <8 x half> @_Z4pownDv8_DhDv8_i(<8 x half>, <8 x i32>)
23 declare <16 x half> @_Z4pownDv16_DhDv16_i(<16 x half>, <16 x i32>)
25 define float @test_pown_f32(float %x, i32 %y) {
26 ; CHECK-LABEL: define float @test_pown_f32
27 ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) {
29 ; CHECK-NEXT: [[CALL:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 [[Y]])
30 ; CHECK-NEXT: ret float [[CALL]]
33 %call = tail call float @_Z4pownfi(float %x, i32 %y)
37 define <2 x float> @test_pown_v2f32(<2 x float> %x, <2 x i32> %y) {
38 ; CHECK-LABEL: define <2 x float> @test_pown_v2f32
39 ; CHECK-SAME: (<2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
41 ; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> [[Y]])
42 ; CHECK-NEXT: ret <2 x float> [[CALL]]
45 %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> %y)
49 define <3 x float> @test_pown_v3f32(<3 x float> %x, <3 x i32> %y) {
50 ; CHECK-LABEL: define <3 x float> @test_pown_v3f32
51 ; CHECK-SAME: (<3 x float> [[X:%.*]], <3 x i32> [[Y:%.*]]) {
53 ; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> [[X]], <3 x i32> [[Y]])
54 ; CHECK-NEXT: ret <3 x float> [[CALL]]
57 %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> %y)
61 define <4 x float> @test_pown_v4f32(<4 x float> %x, <4 x i32> %y) {
62 ; CHECK-LABEL: define <4 x float> @test_pown_v4f32
63 ; CHECK-SAME: (<4 x float> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
65 ; CHECK-NEXT: [[CALL:%.*]] = tail call <4 x float> @_Z4pownDv4_fDv4_i(<4 x float> [[X]], <4 x i32> [[Y]])
66 ; CHECK-NEXT: ret <4 x float> [[CALL]]
69 %call = tail call <4 x float> @_Z4pownDv4_fDv4_i(<4 x float> %x, <4 x i32> %y)
73 define <8 x float> @test_pown_v8f32(<8 x float> %x, <8 x i32> %y) {
74 ; CHECK-LABEL: define <8 x float> @test_pown_v8f32
75 ; CHECK-SAME: (<8 x float> [[X:%.*]], <8 x i32> [[Y:%.*]]) {
77 ; CHECK-NEXT: [[CALL:%.*]] = tail call <8 x float> @_Z4pownDv8_fDv8_i(<8 x float> [[X]], <8 x i32> [[Y]])
78 ; CHECK-NEXT: ret <8 x float> [[CALL]]
81 %call = tail call <8 x float> @_Z4pownDv8_fDv8_i(<8 x float> %x, <8 x i32> %y)
85 define <16 x float> @test_pown_v16f32(<16 x float> %x, <16 x i32> %y) {
86 ; CHECK-LABEL: define <16 x float> @test_pown_v16f32
87 ; CHECK-SAME: (<16 x float> [[X:%.*]], <16 x i32> [[Y:%.*]]) {
89 ; CHECK-NEXT: [[CALL:%.*]] = tail call <16 x float> @_Z4pownDv16_fDv16_i(<16 x float> [[X]], <16 x i32> [[Y]])
90 ; CHECK-NEXT: ret <16 x float> [[CALL]]
93 %call = tail call <16 x float> @_Z4pownDv16_fDv16_i(<16 x float> %x, <16 x i32> %y)
94 ret <16 x float> %call
97 define double @test_pown_f64(double %x, i32 %y) {
98 ; CHECK-LABEL: define double @test_pown_f64
99 ; CHECK-SAME: (double [[X:%.*]], i32 [[Y:%.*]]) {
101 ; CHECK-NEXT: [[CALL:%.*]] = tail call double @_Z4powndi(double [[X]], i32 [[Y]])
102 ; CHECK-NEXT: ret double [[CALL]]
105 %call = tail call double @_Z4powndi(double %x, i32 %y)
109 define <2 x double> @test_pown_v2f64(<2 x double> %x, <2 x i32> %y) {
110 ; CHECK-LABEL: define <2 x double> @test_pown_v2f64
111 ; CHECK-SAME: (<2 x double> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
113 ; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x double> @_Z4pownDv2_dDv2_i(<2 x double> [[X]], <2 x i32> [[Y]])
114 ; CHECK-NEXT: ret <2 x double> [[CALL]]
117 %call = tail call <2 x double> @_Z4pownDv2_dDv2_i(<2 x double> %x, <2 x i32> %y)
118 ret <2 x double> %call
121 define <3 x double> @test_pown_v3f64(<3 x double> %x, <3 x i32> %y) {
122 ; CHECK-LABEL: define <3 x double> @test_pown_v3f64
123 ; CHECK-SAME: (<3 x double> [[X:%.*]], <3 x i32> [[Y:%.*]]) {
125 ; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x double> @_Z4pownDv3_dDv3_i(<3 x double> [[X]], <3 x i32> [[Y]])
126 ; CHECK-NEXT: ret <3 x double> [[CALL]]
129 %call = tail call <3 x double> @_Z4pownDv3_dDv3_i(<3 x double> %x, <3 x i32> %y)
130 ret <3 x double> %call
133 define <4 x double> @test_pown_v4f64(<4 x double> %x, <4 x i32> %y) {
134 ; CHECK-LABEL: define <4 x double> @test_pown_v4f64
135 ; CHECK-SAME: (<4 x double> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
137 ; CHECK-NEXT: [[CALL:%.*]] = tail call <4 x double> @_Z4pownDv4_dDv4_i(<4 x double> [[X]], <4 x i32> [[Y]])
138 ; CHECK-NEXT: ret <4 x double> [[CALL]]
141 %call = tail call <4 x double> @_Z4pownDv4_dDv4_i(<4 x double> %x, <4 x i32> %y)
142 ret <4 x double> %call
145 define <8 x double> @test_pown_v8f64(<8 x double> %x, <8 x i32> %y) {
146 ; CHECK-LABEL: define <8 x double> @test_pown_v8f64
147 ; CHECK-SAME: (<8 x double> [[X:%.*]], <8 x i32> [[Y:%.*]]) {
149 ; CHECK-NEXT: [[CALL:%.*]] = tail call <8 x double> @_Z4pownDv8_dDv8_i(<8 x double> [[X]], <8 x i32> [[Y]])
150 ; CHECK-NEXT: ret <8 x double> [[CALL]]
153 %call = tail call <8 x double> @_Z4pownDv8_dDv8_i(<8 x double> %x, <8 x i32> %y)
154 ret <8 x double> %call
157 define <16 x double> @test_pown_v16f64(<16 x double> %x, <16 x i32> %y) {
158 ; CHECK-LABEL: define <16 x double> @test_pown_v16f64
159 ; CHECK-SAME: (<16 x double> [[X:%.*]], <16 x i32> [[Y:%.*]]) {
161 ; CHECK-NEXT: [[CALL:%.*]] = tail call <16 x double> @_Z4pownDv16_dDv16_i(<16 x double> [[X]], <16 x i32> [[Y]])
162 ; CHECK-NEXT: ret <16 x double> [[CALL]]
165 %call = tail call <16 x double> @_Z4pownDv16_dDv16_i(<16 x double> %x, <16 x i32> %y)
166 ret <16 x double> %call
169 define half @test_pown_f16(half %x, i32 %y) {
170 ; CHECK-LABEL: define half @test_pown_f16
171 ; CHECK-SAME: (half [[X:%.*]], i32 [[Y:%.*]]) {
173 ; CHECK-NEXT: [[CALL:%.*]] = tail call half @_Z4pownDhi(half [[X]], i32 [[Y]])
174 ; CHECK-NEXT: ret half [[CALL]]
177 %call = tail call half @_Z4pownDhi(half %x, i32 %y)
181 define <2 x half> @test_pown_v2f16(<2 x half> %x, <2 x i32> %y) {
182 ; CHECK-LABEL: define <2 x half> @test_pown_v2f16
183 ; CHECK-SAME: (<2 x half> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
185 ; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half> [[X]], <2 x i32> [[Y]])
186 ; CHECK-NEXT: ret <2 x half> [[CALL]]
189 %call = tail call <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half> %x, <2 x i32> %y)
193 define <3 x half> @test_pown_v3f16(<3 x half> %x, <3 x i32> %y) {
194 ; CHECK-LABEL: define <3 x half> @test_pown_v3f16
195 ; CHECK-SAME: (<3 x half> [[X:%.*]], <3 x i32> [[Y:%.*]]) {
197 ; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x half> @_Z4pownDv3_DhDv3_i(<3 x half> [[X]], <3 x i32> [[Y]])
198 ; CHECK-NEXT: ret <3 x half> [[CALL]]
201 %call = tail call <3 x half> @_Z4pownDv3_DhDv3_i(<3 x half> %x, <3 x i32> %y)
205 define <4 x half> @test_pown_v4f16(<4 x half> %x, <4 x i32> %y) {
206 ; CHECK-LABEL: define <4 x half> @test_pown_v4f16
207 ; CHECK-SAME: (<4 x half> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
209 ; CHECK-NEXT: [[CALL:%.*]] = tail call <4 x half> @_Z4pownDv4_DhDv4_i(<4 x half> [[X]], <4 x i32> [[Y]])
210 ; CHECK-NEXT: ret <4 x half> [[CALL]]
213 %call = tail call <4 x half> @_Z4pownDv4_DhDv4_i(<4 x half> %x, <4 x i32> %y)
217 define <8 x half> @test_pown_v8f16(<8 x half> %x, <8 x i32> %y) {
218 ; CHECK-LABEL: define <8 x half> @test_pown_v8f16
219 ; CHECK-SAME: (<8 x half> [[X:%.*]], <8 x i32> [[Y:%.*]]) {
221 ; CHECK-NEXT: [[CALL:%.*]] = tail call <8 x half> @_Z4pownDv8_DhDv8_i(<8 x half> [[X]], <8 x i32> [[Y]])
222 ; CHECK-NEXT: ret <8 x half> [[CALL]]
225 %call = tail call <8 x half> @_Z4pownDv8_DhDv8_i(<8 x half> %x, <8 x i32> %y)
229 define <16 x half> @test_pown_v16f16(<16 x half> %x, <16 x i32> %y) {
230 ; CHECK-LABEL: define <16 x half> @test_pown_v16f16
231 ; CHECK-SAME: (<16 x half> [[X:%.*]], <16 x i32> [[Y:%.*]]) {
233 ; CHECK-NEXT: [[CALL:%.*]] = tail call <16 x half> @_Z4pownDv16_DhDv16_i(<16 x half> [[X]], <16 x i32> [[Y]])
234 ; CHECK-NEXT: ret <16 x half> [[CALL]]
237 %call = tail call <16 x half> @_Z4pownDv16_DhDv16_i(<16 x half> %x, <16 x i32> %y)
238 ret <16 x half> %call
241 define float @test_pown_f32__y_0(float %x) {
242 ; CHECK-LABEL: define float @test_pown_f32__y_0
243 ; CHECK-SAME: (float [[X:%.*]]) {
245 ; CHECK-NEXT: ret float 1.000000e+00
248 %call = tail call float @_Z4pownfi(float %x, i32 0)
252 define float @test_pown_f32__y_poison(float %x) {
253 ; CHECK-LABEL: define float @test_pown_f32__y_poison
254 ; CHECK-SAME: (float [[X:%.*]]) {
256 ; CHECK-NEXT: [[CALL:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 poison)
257 ; CHECK-NEXT: ret float [[CALL]]
260 %call = tail call float @_Z4pownfi(float %x, i32 poison)
264 define <2 x float> @test_pown_v2f32__y_poison(<2 x float> %x) {
265 ; CHECK-LABEL: define <2 x float> @test_pown_v2f32__y_poison
266 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
268 ; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> poison)
269 ; CHECK-NEXT: ret <2 x float> [[CALL]]
272 %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> poison)
273 ret <2 x float> %call
276 define <2 x float> @test_pown_v2f32__y_0(<2 x float> %x) {
277 ; CHECK-LABEL: define <2 x float> @test_pown_v2f32__y_0
278 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
280 ; CHECK-NEXT: ret <2 x float> <float 1.000000e+00, float 1.000000e+00>
283 %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> zeroinitializer)
284 ret <2 x float> %call
287 define <2 x float> @test_pown_v2f32__y_0_undef(<2 x float> %x) {
288 ; CHECK-LABEL: define <2 x float> @test_pown_v2f32__y_0_undef
289 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
291 ; CHECK-NEXT: ret <2 x float> <float 1.000000e+00, float 1.000000e+00>
294 %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 0, i32 poison>)
295 ret <2 x float> %call
298 define <3 x float> @test_pown_v3f32__y_0(<3 x float> %x) {
299 ; CHECK-LABEL: define <3 x float> @test_pown_v3f32__y_0
300 ; CHECK-SAME: (<3 x float> [[X:%.*]]) {
302 ; CHECK-NEXT: ret <3 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
305 %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> zeroinitializer)
306 ret <3 x float> %call
309 define <4 x float> @test_pown_v4f32__y_0(<4 x float> %x) {
310 ; CHECK-LABEL: define <4 x float> @test_pown_v4f32__y_0
311 ; CHECK-SAME: (<4 x float> [[X:%.*]]) {
313 ; CHECK-NEXT: ret <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
316 %call = tail call <4 x float> @_Z4pownDv4_fDv4_i(<4 x float> %x, <4 x i32> zeroinitializer)
317 ret <4 x float> %call
320 define <8 x float> @test_pown_v8f32__y_0(<8 x float> %x) {
321 ; CHECK-LABEL: define <8 x float> @test_pown_v8f32__y_0
322 ; CHECK-SAME: (<8 x float> [[X:%.*]]) {
324 ; CHECK-NEXT: ret <8 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
327 %call = tail call <8 x float> @_Z4pownDv8_fDv8_i(<8 x float> %x, <8 x i32> zeroinitializer)
328 ret <8 x float> %call
331 define <16 x float> @test_pown_v16f32__y_0(<16 x float> %x) {
332 ; CHECK-LABEL: define <16 x float> @test_pown_v16f32__y_0
333 ; CHECK-SAME: (<16 x float> [[X:%.*]]) {
335 ; CHECK-NEXT: ret <16 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
338 %call = tail call <16 x float> @_Z4pownDv16_fDv16_i(<16 x float> %x, <16 x i32> zeroinitializer)
339 ret <16 x float> %call
342 define float @test_pown_f32__y_1(float %x) {
343 ; CHECK-LABEL: define float @test_pown_f32__y_1
344 ; CHECK-SAME: (float [[X:%.*]]) {
346 ; CHECK-NEXT: ret float [[X]]
349 %call = tail call float @_Z4pownfi(float %x, i32 1)
353 define <2 x float> @test_pown_v2f32__y_1(<2 x float> %x) {
354 ; CHECK-LABEL: define <2 x float> @test_pown_v2f32__y_1
355 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
357 ; CHECK-NEXT: ret <2 x float> [[X]]
360 %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 1, i32 1>)
361 ret <2 x float> %call
364 define <2 x float> @test_pown_v2f32__y_1_undef(<2 x float> %x) {
365 ; CHECK-LABEL: define <2 x float> @test_pown_v2f32__y_1_undef
366 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
368 ; CHECK-NEXT: ret <2 x float> [[X]]
371 %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 1, i32 poison>)
372 ret <2 x float> %call
375 define <3 x float> @test_pown_v3f32__y_1(<3 x float> %x) {
376 ; CHECK-LABEL: define <3 x float> @test_pown_v3f32__y_1
377 ; CHECK-SAME: (<3 x float> [[X:%.*]]) {
379 ; CHECK-NEXT: ret <3 x float> [[X]]
382 %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> <i32 1, i32 1, i32 1>)
383 ret <3 x float> %call
386 define <3 x float> @test_pown_v3f32__y_1_undef(<3 x float> %x) {
387 ; CHECK-LABEL: define <3 x float> @test_pown_v3f32__y_1_undef
388 ; CHECK-SAME: (<3 x float> [[X:%.*]]) {
390 ; CHECK-NEXT: ret <3 x float> [[X]]
393 %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> <i32 1, i32 1, i32 poison>)
394 ret <3 x float> %call
397 define <4 x float> @test_pown_v4f32__y_1(<4 x float> %x) {
398 ; CHECK-LABEL: define <4 x float> @test_pown_v4f32__y_1
399 ; CHECK-SAME: (<4 x float> [[X:%.*]]) {
401 ; CHECK-NEXT: ret <4 x float> [[X]]
404 %call = tail call <4 x float> @_Z4pownDv4_fDv4_i(<4 x float> %x, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
405 ret <4 x float> %call
408 define <8 x float> @test_pown_v8f32__y_1(<8 x float> %x) {
409 ; CHECK-LABEL: define <8 x float> @test_pown_v8f32__y_1
410 ; CHECK-SAME: (<8 x float> [[X:%.*]]) {
412 ; CHECK-NEXT: ret <8 x float> [[X]]
415 %call = tail call <8 x float> @_Z4pownDv8_fDv8_i(<8 x float> %x, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
416 ret <8 x float> %call
419 define <16 x float> @test_pown_v16f32__y_1(<16 x float> %x) {
420 ; CHECK-LABEL: define <16 x float> @test_pown_v16f32__y_1
421 ; CHECK-SAME: (<16 x float> [[X:%.*]]) {
423 ; CHECK-NEXT: ret <16 x float> [[X]]
426 %call = tail call <16 x float> @_Z4pownDv16_fDv16_i(<16 x float> %x, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
427 ret <16 x float> %call
430 define float @test_pown_f32__y_2(float %x) {
431 ; CHECK-LABEL: define float @test_pown_f32__y_2
432 ; CHECK-SAME: (float [[X:%.*]]) {
434 ; CHECK-NEXT: [[__POW2:%.*]] = fmul float [[X]], [[X]]
435 ; CHECK-NEXT: ret float [[__POW2]]
438 %call = tail call float @_Z4pownfi(float %x, i32 2)
442 define <2 x float> @test_pown_v2f32__y_2(<2 x float> %x) {
443 ; CHECK-LABEL: define <2 x float> @test_pown_v2f32__y_2
444 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
446 ; CHECK-NEXT: [[__POW2:%.*]] = fmul <2 x float> [[X]], [[X]]
447 ; CHECK-NEXT: ret <2 x float> [[__POW2]]
450 %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 2, i32 2>)
451 ret <2 x float> %call
454 define <3 x float> @test_pown_v3f32__y_2(<3 x float> %x) {
455 ; CHECK-LABEL: define <3 x float> @test_pown_v3f32__y_2
456 ; CHECK-SAME: (<3 x float> [[X:%.*]]) {
458 ; CHECK-NEXT: [[__POW2:%.*]] = fmul <3 x float> [[X]], [[X]]
459 ; CHECK-NEXT: ret <3 x float> [[__POW2]]
462 %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> <i32 2, i32 2, i32 2>)
463 ret <3 x float> %call
466 define <3 x float> @test_pown_v3f32__y_2_undef(<3 x float> %x) {
467 ; CHECK-LABEL: define <3 x float> @test_pown_v3f32__y_2_undef
468 ; CHECK-SAME: (<3 x float> [[X:%.*]]) {
470 ; CHECK-NEXT: [[__POW2:%.*]] = fmul <3 x float> [[X]], [[X]]
471 ; CHECK-NEXT: ret <3 x float> [[__POW2]]
474 %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> <i32 2, i32 poison, i32 2>)
475 ret <3 x float> %call
478 define <4 x float> @test_pown_v4f32__y_2(<4 x float> %x) {
479 ; CHECK-LABEL: define <4 x float> @test_pown_v4f32__y_2
480 ; CHECK-SAME: (<4 x float> [[X:%.*]]) {
482 ; CHECK-NEXT: [[__POW2:%.*]] = fmul <4 x float> [[X]], [[X]]
483 ; CHECK-NEXT: ret <4 x float> [[__POW2]]
486 %call = tail call <4 x float> @_Z4pownDv4_fDv4_i(<4 x float> %x, <4 x i32> <i32 2, i32 2, i32 2, i32 2>)
487 ret <4 x float> %call
490 define <8 x float> @test_pown_v8f32__y_2(<8 x float> %x) {
491 ; CHECK-LABEL: define <8 x float> @test_pown_v8f32__y_2
492 ; CHECK-SAME: (<8 x float> [[X:%.*]]) {
494 ; CHECK-NEXT: [[__POW2:%.*]] = fmul <8 x float> [[X]], [[X]]
495 ; CHECK-NEXT: ret <8 x float> [[__POW2]]
498 %call = tail call <8 x float> @_Z4pownDv8_fDv8_i(<8 x float> %x, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>)
499 ret <8 x float> %call
502 define <16 x float> @test_pown_v26f32__y_2(<16 x float> %x) {
503 ; CHECK-LABEL: define <16 x float> @test_pown_v26f32__y_2
504 ; CHECK-SAME: (<16 x float> [[X:%.*]]) {
506 ; CHECK-NEXT: [[__POW2:%.*]] = fmul <16 x float> [[X]], [[X]]
507 ; CHECK-NEXT: ret <16 x float> [[__POW2]]
510 %call = tail call <16 x float> @_Z4pownDv16_fDv16_i(<16 x float> %x, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>)
511 ret <16 x float> %call
514 define float @test_pown_f32__y_neg1(float %x) {
515 ; CHECK-LABEL: define float @test_pown_f32__y_neg1
516 ; CHECK-SAME: (float [[X:%.*]]) {
518 ; CHECK-NEXT: [[__POWRECIP:%.*]] = fdiv float 1.000000e+00, [[X]]
519 ; CHECK-NEXT: ret float [[__POWRECIP]]
522 %call = tail call float @_Z4pownfi(float %x, i32 -1)
526 define <2 x float> @test_pown_v2f32__y_neg1(<2 x float> %x) {
527 ; CHECK-LABEL: define <2 x float> @test_pown_v2f32__y_neg1
528 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
530 ; CHECK-NEXT: [[__POWRECIP:%.*]] = fdiv <2 x float> <float 1.000000e+00, float 1.000000e+00>, [[X]]
531 ; CHECK-NEXT: ret <2 x float> [[__POWRECIP]]
534 %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 -1, i32 -1>)
535 ret <2 x float> %call
538 define <3 x float> @test_pown_v3f32__y_neg1(<3 x float> %x) {
539 ; CHECK-LABEL: define <3 x float> @test_pown_v3f32__y_neg1
540 ; CHECK-SAME: (<3 x float> [[X:%.*]]) {
542 ; CHECK-NEXT: [[__POWRECIP:%.*]] = fdiv <3 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, [[X]]
543 ; CHECK-NEXT: ret <3 x float> [[__POWRECIP]]
546 %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> <i32 -1, i32 -1, i32 -1>)
547 ret <3 x float> %call
550 define <3 x float> @test_pown_v3f32__y_neg1_undef(<3 x float> %x) {
551 ; CHECK-LABEL: define <3 x float> @test_pown_v3f32__y_neg1_undef
552 ; CHECK-SAME: (<3 x float> [[X:%.*]]) {
554 ; CHECK-NEXT: [[__POWRECIP:%.*]] = fdiv <3 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, [[X]]
555 ; CHECK-NEXT: ret <3 x float> [[__POWRECIP]]
558 %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> <i32 -1, i32 -1, i32 poison>)
559 ret <3 x float> %call
562 define <4 x float> @test_pown_v4f32__y_neg1(<4 x float> %x) {
563 ; CHECK-LABEL: define <4 x float> @test_pown_v4f32__y_neg1
564 ; CHECK-SAME: (<4 x float> [[X:%.*]]) {
566 ; CHECK-NEXT: [[__POWRECIP:%.*]] = fdiv <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, [[X]]
567 ; CHECK-NEXT: ret <4 x float> [[__POWRECIP]]
570 %call = tail call <4 x float> @_Z4pownDv4_fDv4_i(<4 x float> %x, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
571 ret <4 x float> %call
574 define <8 x float> @test_pown_v8f32__y_neg1(<8 x float> %x) {
575 ; CHECK-LABEL: define <8 x float> @test_pown_v8f32__y_neg1
576 ; CHECK-SAME: (<8 x float> [[X:%.*]]) {
578 ; CHECK-NEXT: [[__POWRECIP:%.*]] = fdiv <8 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, [[X]]
579 ; CHECK-NEXT: ret <8 x float> [[__POWRECIP]]
582 %call = tail call <8 x float> @_Z4pownDv8_fDv8_i(<8 x float> %x, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>)
583 ret <8 x float> %call
586 define <16 x float> @test_pown_v16f32__y_neg1(<16 x float> %x) {
587 ; CHECK-LABEL: define <16 x float> @test_pown_v16f32__y_neg1
588 ; CHECK-SAME: (<16 x float> [[X:%.*]]) {
590 ; CHECK-NEXT: [[__POWRECIP:%.*]] = fdiv <16 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, [[X]]
591 ; CHECK-NEXT: ret <16 x float> [[__POWRECIP]]
594 %call = tail call <16 x float> @_Z4pownDv16_fDv16_i(<16 x float> %x, <16 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>)
595 ret <16 x float> %call
598 define float @test_pown_afn_f32(float %x, i32 %y) {
599 ; CHECK-LABEL: define float @test_pown_afn_f32
600 ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) {
602 ; CHECK-NEXT: [[CALL:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 [[Y]])
603 ; CHECK-NEXT: ret float [[CALL]]
606 %call = tail call afn float @_Z4pownfi(float %x, i32 %y)
610 define <2 x float> @test_pown_afn_v2f32(<2 x float> %x, <2 x i32> %y) {
611 ; CHECK-LABEL: define <2 x float> @test_pown_afn_v2f32
612 ; CHECK-SAME: (<2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
614 ; CHECK-NEXT: [[CALL:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> [[Y]])
615 ; CHECK-NEXT: ret <2 x float> [[CALL]]
618 %call = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> %y)
619 ret <2 x float> %call
622 define double @test_pown_afn_f64(double %x, i32 %y) {
623 ; CHECK-LABEL: define double @test_pown_afn_f64
624 ; CHECK-SAME: (double [[X:%.*]], i32 [[Y:%.*]]) {
626 ; CHECK-NEXT: [[CALL:%.*]] = tail call afn double @_Z4powndi(double [[X]], i32 [[Y]])
627 ; CHECK-NEXT: ret double [[CALL]]
630 %call = tail call afn double @_Z4powndi(double %x, i32 %y)
634 define <2 x double> @test_pown_afn_v2f64(<2 x double> %x, <2 x i32> %y) {
635 ; CHECK-LABEL: define <2 x double> @test_pown_afn_v2f64
636 ; CHECK-SAME: (<2 x double> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
638 ; CHECK-NEXT: [[CALL:%.*]] = tail call afn <2 x double> @_Z4pownDv2_dDv2_i(<2 x double> [[X]], <2 x i32> [[Y]])
639 ; CHECK-NEXT: ret <2 x double> [[CALL]]
642 %call = tail call afn <2 x double> @_Z4pownDv2_dDv2_i(<2 x double> %x, <2 x i32> %y)
643 ret <2 x double> %call
646 define half @test_pown_afn_f16(half %x, i32 %y) {
647 ; CHECK-LABEL: define half @test_pown_afn_f16
648 ; CHECK-SAME: (half [[X:%.*]], i32 [[Y:%.*]]) {
650 ; CHECK-NEXT: [[CALL:%.*]] = tail call afn half @_Z4pownDhi(half [[X]], i32 [[Y]])
651 ; CHECK-NEXT: ret half [[CALL]]
654 %call = tail call afn half @_Z4pownDhi(half %x, i32 %y)
658 define <2 x half> @test_pown_afn_v2f16(<2 x half> %x, <2 x i32> %y) {
659 ; CHECK-LABEL: define <2 x half> @test_pown_afn_v2f16
660 ; CHECK-SAME: (<2 x half> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
662 ; CHECK-NEXT: [[CALL:%.*]] = tail call afn <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half> [[X]], <2 x i32> [[Y]])
663 ; CHECK-NEXT: ret <2 x half> [[CALL]]
666 %call = tail call afn <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half> %x, <2 x i32> %y)
670 define float @test_pown_afn_nnan_ninf_f32(float %x, i32 %y) {
671 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32
672 ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) {
674 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn float @llvm.fabs.f32(float [[X]])
675 ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn float @llvm.log2.f32(float [[__FABS]])
676 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[Y]] to float
677 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[POWNI2F]]
678 ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn float @llvm.exp2.f32(float [[__YLOGX]])
679 ; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[Y]], 31
680 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[X]] to i32
681 ; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP0]]
682 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[__EXP2]] to i32
683 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[__POW_SIGN]], [[TMP1]]
684 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[TMP2]] to float
685 ; CHECK-NEXT: ret float [[TMP3]]
688 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 %y)
692 define <2 x float> @test_pown_afn_nnan_ninf_v2f32(<2 x float> %x, <2 x i32> %y) {
693 ; CHECK-LABEL: define <2 x float> @test_pown_afn_nnan_ninf_v2f32
694 ; CHECK-SAME: (<2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
696 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn <2 x float> @llvm.fabs.v2f32(<2 x float> [[X]])
697 ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn <2 x float> @llvm.log2.v2f32(<2 x float> [[__FABS]])
698 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp <2 x i32> [[Y]] to <2 x float>
699 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn <2 x float> [[__LOG2]], [[POWNI2F]]
700 ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn <2 x float> @llvm.exp2.v2f32(<2 x float> [[__YLOGX]])
701 ; CHECK-NEXT: [[__YTOU:%.*]] = fptosi <2 x float> [[POWNI2F]] to <2 x i32>
702 ; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i32> [[__YTOU]], <i32 31, i32 31>
703 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x float> [[X]] to <2 x i32>
704 ; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i32> [[__YEVEN]], [[TMP0]]
705 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x float> [[__EXP2]] to <2 x i32>
706 ; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i32> [[__POW_SIGN]], [[TMP1]]
707 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i32> [[TMP2]] to <2 x float>
708 ; CHECK-NEXT: ret <2 x float> [[TMP3]]
711 %call = tail call nnan ninf afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> %y)
712 ret <2 x float> %call
715 define double @test_pown_afn_nnan_ninf_f64(double %x, i32 %y) {
716 ; CHECK-LABEL: define double @test_pown_afn_nnan_ninf_f64
717 ; CHECK-SAME: (double [[X:%.*]], i32 [[Y:%.*]]) {
719 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn double @llvm.fabs.f64(double [[X]])
720 ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn double @_Z4log2d(double [[__FABS]])
721 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[Y]] to double
722 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn double [[__LOG2]], [[POWNI2F]]
723 ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn double @_Z4exp2d(double [[__YLOGX]])
724 ; CHECK-NEXT: [[__YTOU:%.*]] = zext i32 [[Y]] to i64
725 ; CHECK-NEXT: [[__YEVEN:%.*]] = shl i64 [[__YTOU]], 63
726 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast double [[X]] to i64
727 ; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i64 [[__YEVEN]], [[TMP0]]
728 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast double [[__EXP2]] to i64
729 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[__POW_SIGN]], [[TMP1]]
730 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i64 [[TMP2]] to double
731 ; CHECK-NEXT: ret double [[TMP3]]
734 %call = tail call nnan ninf afn double @_Z4powndi(double %x, i32 %y)
738 define <2 x double> @test_pown_afn_nnan_ninf_v2f64(<2 x double> %x, <2 x i32> %y) {
739 ; CHECK-LABEL: define <2 x double> @test_pown_afn_nnan_ninf_v2f64
740 ; CHECK-SAME: (<2 x double> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
742 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn <2 x double> @llvm.fabs.v2f64(<2 x double> [[X]])
743 ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn <2 x double> @_Z4log2Dv2_d(<2 x double> [[__FABS]])
744 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp <2 x i32> [[Y]] to <2 x double>
745 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn <2 x double> [[__LOG2]], [[POWNI2F]]
746 ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn <2 x double> @_Z4exp2Dv2_d(<2 x double> [[__YLOGX]])
747 ; CHECK-NEXT: [[__YTOU1:%.*]] = zext <2 x i32> [[Y]] to <2 x i64>
748 ; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i64> [[__YTOU1]], <i64 63, i64 63>
749 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x double> [[X]] to <2 x i64>
750 ; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i64> [[__YEVEN]], [[TMP0]]
751 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x double> [[__EXP2]] to <2 x i64>
752 ; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i64> [[__POW_SIGN]], [[TMP1]]
753 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i64> [[TMP2]] to <2 x double>
754 ; CHECK-NEXT: ret <2 x double> [[TMP3]]
757 %call = tail call nnan ninf afn <2 x double> @_Z4pownDv2_dDv2_i(<2 x double> %x, <2 x i32> %y)
758 ret <2 x double> %call
761 define half @test_pown_afn_nnan_ninf_f16(half %x, i32 %y) {
762 ; CHECK-LABEL: define half @test_pown_afn_nnan_ninf_f16
763 ; CHECK-SAME: (half [[X:%.*]], i32 [[Y:%.*]]) {
765 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn half @llvm.fabs.f16(half [[X]])
766 ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn half @llvm.log2.f16(half [[__FABS]])
767 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[Y]] to half
768 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn half [[__LOG2]], [[POWNI2F]]
769 ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn half @llvm.exp2.f16(half [[__YLOGX]])
770 ; CHECK-NEXT: [[__YTOU:%.*]] = trunc i32 [[Y]] to i16
771 ; CHECK-NEXT: [[__YEVEN:%.*]] = shl i16 [[__YTOU]], 15
772 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[X]] to i16
773 ; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i16 [[__YEVEN]], [[TMP0]]
774 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast half [[__EXP2]] to i16
775 ; CHECK-NEXT: [[TMP2:%.*]] = or i16 [[__POW_SIGN]], [[TMP1]]
776 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i16 [[TMP2]] to half
777 ; CHECK-NEXT: ret half [[TMP3]]
780 %call = tail call nnan ninf afn half @_Z4pownDhi(half %x, i32 %y)
784 define <2 x half> @test_pown_afn_nnan_ninf_v2f16(<2 x half> %x, <2 x i32> %y) {
785 ; CHECK-LABEL: define <2 x half> @test_pown_afn_nnan_ninf_v2f16
786 ; CHECK-SAME: (<2 x half> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
788 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn <2 x half> @llvm.fabs.v2f16(<2 x half> [[X]])
789 ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn <2 x half> @llvm.log2.v2f16(<2 x half> [[__FABS]])
790 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp <2 x i32> [[Y]] to <2 x half>
791 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn <2 x half> [[__LOG2]], [[POWNI2F]]
792 ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn <2 x half> @llvm.exp2.v2f16(<2 x half> [[__YLOGX]])
793 ; CHECK-NEXT: [[__YTOU:%.*]] = fptosi <2 x half> [[POWNI2F]] to <2 x i16>
794 ; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i16> [[__YTOU]], <i16 15, i16 15>
795 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x half> [[X]] to <2 x i16>
796 ; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i16> [[__YEVEN]], [[TMP0]]
797 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x half> [[__EXP2]] to <2 x i16>
798 ; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i16> [[__POW_SIGN]], [[TMP1]]
799 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i16> [[TMP2]] to <2 x half>
800 ; CHECK-NEXT: ret <2 x half> [[TMP3]]
803 %call = tail call nnan ninf afn <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half> %x, <2 x i32> %y)
807 define float @test_pown_fast_f32_nobuiltin(float %x, i32 %y) {
808 ; CHECK-LABEL: define float @test_pown_fast_f32_nobuiltin
809 ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) {
811 ; CHECK-NEXT: [[CALL:%.*]] = tail call fast float @_Z4pownfi(float [[X]], i32 [[Y]]) #[[ATTR3:[0-9]+]]
812 ; CHECK-NEXT: ret float [[CALL]]
815 %call = tail call fast float @_Z4pownfi(float %x, i32 %y) #0
819 define float @test_pown_fast_f32_strictfp(float %x, i32 %y) #1 {
820 ; CHECK-LABEL: define float @test_pown_fast_f32_strictfp
821 ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR0:[0-9]+]] {
823 ; CHECK-NEXT: [[__FABS:%.*]] = call fast float @llvm.fabs.f32(float [[X]])
824 ; CHECK-NEXT: [[__LOG2:%.*]] = call fast float @llvm.log2.f32(float [[__FABS]])
825 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[Y]] to float
826 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul fast float [[__LOG2]], [[POWNI2F]]
827 ; CHECK-NEXT: [[__EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[__YLOGX]])
828 ; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[Y]], 31
829 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[X]] to i32
830 ; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP0]]
831 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[__EXP2]] to i32
832 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[__POW_SIGN]], [[TMP1]]
833 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[TMP2]] to float
834 ; CHECK-NEXT: ret float [[TMP3]]
837 %call = tail call fast float @_Z4pownfi(float %x, i32 %y) #1
841 define float @test_pown_fast_f32__y_poison(float %x) {
842 ; CHECK-LABEL: define float @test_pown_fast_f32__y_poison
843 ; CHECK-SAME: (float [[X:%.*]]) {
844 ; CHECK-NEXT: ret float poison
846 %call = tail call fast float @_Z4pownfi(float %x, i32 poison)
850 define float @test_pown_afn_nnan_ninf_f32__y_3(float %x) {
851 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_3
852 ; CHECK-SAME: (float [[X:%.*]]) {
853 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
854 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[X]]
855 ; CHECK-NEXT: ret float [[__POWPROD]]
857 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 3)
861 define float @test_pown_afn_nnan_ninf_f32__y_neg3(float %x) {
862 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_neg3
863 ; CHECK-SAME: (float [[X:%.*]]) {
864 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
865 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[X]]
866 ; CHECK-NEXT: [[__1POWPROD:%.*]] = fdiv nnan ninf afn float 1.000000e+00, [[__POWPROD]]
867 ; CHECK-NEXT: ret float [[__1POWPROD]]
869 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 -3)
873 define float @test_pown_afn_nnan_ninf_f32__y_4(float %x) {
874 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_4
875 ; CHECK-SAME: (float [[X:%.*]]) {
876 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
877 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[__POWX2]]
878 ; CHECK-NEXT: ret float [[__POWX21]]
880 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 4)
884 define float @test_pown_afn_nnan_ninf_f32__y_neg4(float %x) {
885 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_neg4
886 ; CHECK-SAME: (float [[X:%.*]]) {
887 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
888 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[__POWX2]]
889 ; CHECK-NEXT: [[__1POWPROD:%.*]] = fdiv nnan ninf afn float 1.000000e+00, [[__POWX21]]
890 ; CHECK-NEXT: ret float [[__1POWPROD]]
892 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 -4)
896 define float @test_pown_afn_nnan_ninf_f32__y_5(float %x) {
897 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_5
898 ; CHECK-SAME: (float [[X:%.*]]) {
899 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
900 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[__POWX2]]
901 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn float [[__POWX21]], [[X]]
902 ; CHECK-NEXT: ret float [[__POWPROD]]
904 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 5)
908 define float @test_pown_afn_nnan_ninf_f32__y_neg5(float %x) {
909 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_neg5
910 ; CHECK-SAME: (float [[X:%.*]]) {
911 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
912 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[__POWX2]]
913 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn float [[__POWX21]], [[X]]
914 ; CHECK-NEXT: [[__1POWPROD:%.*]] = fdiv nnan ninf afn float 1.000000e+00, [[__POWPROD]]
915 ; CHECK-NEXT: ret float [[__1POWPROD]]
917 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 -5)
921 define float @test_pown_afn_nnan_ninf_f32__y_7(float %x) {
922 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_7
923 ; CHECK-SAME: (float [[X:%.*]]) {
924 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
925 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[X]]
926 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[__POWX2]]
927 ; CHECK-NEXT: [[__POWPROD2:%.*]] = fmul nnan ninf afn float [[__POWPROD]], [[__POWX21]]
928 ; CHECK-NEXT: ret float [[__POWPROD2]]
930 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 7)
934 define float @test_pown_afn_nnan_ninf_f32__y_neg7(float %x) {
935 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_neg7
936 ; CHECK-SAME: (float [[X:%.*]]) {
937 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
938 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[X]]
939 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[__POWX2]]
940 ; CHECK-NEXT: [[__POWPROD2:%.*]] = fmul nnan ninf afn float [[__POWPROD]], [[__POWX21]]
941 ; CHECK-NEXT: [[__1POWPROD:%.*]] = fdiv nnan ninf afn float 1.000000e+00, [[__POWPROD2]]
942 ; CHECK-NEXT: ret float [[__1POWPROD]]
944 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 -7)
948 define float @test_pown_afn_nnan_ninf_f32__y_8(float %x) {
949 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_8
950 ; CHECK-SAME: (float [[X:%.*]]) {
951 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
952 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[__POWX2]]
953 ; CHECK-NEXT: [[__POWX22:%.*]] = fmul nnan ninf afn float [[__POWX21]], [[__POWX21]]
954 ; CHECK-NEXT: ret float [[__POWX22]]
956 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 8)
960 define float @test_pown_afn_nnan_ninf_f32__y_neg8(float %x) {
961 ; CHECK-LABEL: define float @test_pown_afn_nnan_ninf_f32__y_neg8
962 ; CHECK-SAME: (float [[X:%.*]]) {
963 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn float [[X]], [[X]]
964 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn float [[__POWX2]], [[__POWX2]]
965 ; CHECK-NEXT: [[__POWX22:%.*]] = fmul nnan ninf afn float [[__POWX21]], [[__POWX21]]
966 ; CHECK-NEXT: [[__1POWPROD:%.*]] = fdiv nnan ninf afn float 1.000000e+00, [[__POWX22]]
967 ; CHECK-NEXT: ret float [[__1POWPROD]]
969 %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 -8)
973 define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_3(<2 x float> %x) {
974 ; CHECK-LABEL: define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_3
975 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
977 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn <2 x float> [[X]], [[X]]
978 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn <2 x float> [[__POWX2]], [[X]]
979 ; CHECK-NEXT: ret <2 x float> [[__POWPROD]]
982 %call = tail call afn nnan ninf <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 3, i32 3>)
983 ret <2 x float> %call
986 define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_4(<2 x float> %x) {
987 ; CHECK-LABEL: define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_4
988 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
990 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn <2 x float> [[X]], [[X]]
991 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn <2 x float> [[__POWX2]], [[__POWX2]]
992 ; CHECK-NEXT: ret <2 x float> [[__POWX21]]
995 %call = tail call afn nnan ninf <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 4, i32 4>)
996 ret <2 x float> %call
999 define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_neg3(<2 x float> %x) {
1000 ; CHECK-LABEL: define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_neg3
1001 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
1002 ; CHECK-NEXT: entry:
1003 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn <2 x float> [[X]], [[X]]
1004 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn <2 x float> [[__POWX2]], [[X]]
1005 ; CHECK-NEXT: [[__1POWPROD:%.*]] = fdiv nnan ninf afn <2 x float> <float 1.000000e+00, float 1.000000e+00>, [[__POWPROD]]
1006 ; CHECK-NEXT: ret <2 x float> [[__1POWPROD]]
1009 %call = tail call afn nnan ninf <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 -3, i32 -3>)
1010 ret <2 x float> %call
1013 define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_neg4(<2 x float> %x) {
1014 ; CHECK-LABEL: define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_neg4
1015 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
1016 ; CHECK-NEXT: entry:
1017 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn <2 x float> [[X]], [[X]]
1018 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn <2 x float> [[__POWX2]], [[__POWX2]]
1019 ; CHECK-NEXT: [[__1POWPROD:%.*]] = fdiv nnan ninf afn <2 x float> <float 1.000000e+00, float 1.000000e+00>, [[__POWX21]]
1020 ; CHECK-NEXT: ret <2 x float> [[__1POWPROD]]
1023 %call = tail call afn nnan ninf <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 -4, i32 -4>)
1024 ret <2 x float> %call
1027 define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_5(<2 x float> %x) {
1028 ; CHECK-LABEL: define <2 x float> @test_pown_afn_nnan_ninf_v2f32__y_5
1029 ; CHECK-SAME: (<2 x float> [[X:%.*]]) {
1030 ; CHECK-NEXT: entry:
1031 ; CHECK-NEXT: [[__POWX2:%.*]] = fmul nnan ninf afn <2 x float> [[X]], [[X]]
1032 ; CHECK-NEXT: [[__POWX21:%.*]] = fmul nnan ninf afn <2 x float> [[__POWX2]], [[__POWX2]]
1033 ; CHECK-NEXT: [[__POWPROD:%.*]] = fmul nnan ninf afn <2 x float> [[__POWX21]], [[X]]
1034 ; CHECK-NEXT: ret <2 x float> [[__POWPROD]]
1037 %call = tail call afn nnan ninf <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> <i32 5, i32 5>)
1038 ret <2 x float> %call
1041 define float @test_pown_f32__x_known_positive(float nofpclass(ninf nsub nnorm) %x, i32 %y) {
1042 ; CHECK-LABEL: define float @test_pown_f32__x_known_positive
1043 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]], i32 [[Y:%.*]]) {
1044 ; CHECK-NEXT: entry:
1045 ; CHECK-NEXT: [[CALL:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 [[Y]])
1046 ; CHECK-NEXT: ret float [[CALL]]
1049 %call = tail call float @_Z4pownfi(float %x, i32 %y)
1053 define float @test_pown_afn_f32__x_known_positive(float nofpclass(ninf nsub nnorm) %x, i32 %y) {
1054 ; CHECK-LABEL: define float @test_pown_afn_f32__x_known_positive
1055 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]], i32 [[Y:%.*]]) {
1056 ; CHECK-NEXT: entry:
1057 ; CHECK-NEXT: [[CALL:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 [[Y]])
1058 ; CHECK-NEXT: ret float [[CALL]]
1061 %call = tail call afn float @_Z4pownfi(float %x, i32 %y)
1065 define float @test_pown_afn_ninf_nnan_f32__x_known_positive(float nofpclass(ninf nsub nnorm) %x, i32 %y) {
1066 ; CHECK-LABEL: define float @test_pown_afn_ninf_nnan_f32__x_known_positive
1067 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]], i32 [[Y:%.*]]) {
1068 ; CHECK-NEXT: entry:
1069 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn float @llvm.fabs.f32(float [[X]])
1070 ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn float @llvm.log2.f32(float [[__FABS]])
1071 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[Y]] to float
1072 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[POWNI2F]]
1073 ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn float @llvm.exp2.f32(float [[__YLOGX]])
1074 ; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[Y]], 31
1075 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[X]] to i32
1076 ; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP0]]
1077 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[__EXP2]] to i32
1078 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[__POW_SIGN]], [[TMP1]]
1079 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[TMP2]] to float
1080 ; CHECK-NEXT: ret float [[TMP3]]
1083 %call = tail call afn ninf nnan float @_Z4pownfi(float %x, i32 %y)
1087 define float @test_pown_afn_f32__x_known_positive__y_4(float nofpclass(ninf nsub nnorm) %x) {
1088 ; CHECK-LABEL: define float @test_pown_afn_f32__x_known_positive__y_4
1089 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]]) {
1090 ; CHECK-NEXT: entry:
1091 ; CHECK-NEXT: [[CALL:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 4)
1092 ; CHECK-NEXT: ret float [[CALL]]
1095 %call = tail call afn float @_Z4pownfi(float %x, i32 4)
1099 define float @test_pown_f32__x_known_positive__y_4(float nofpclass(ninf nsub nnorm) %x) {
1100 ; CHECK-LABEL: define float @test_pown_f32__x_known_positive__y_4
1101 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]]) {
1102 ; CHECK-NEXT: entry:
1103 ; CHECK-NEXT: [[CALL:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 4)
1104 ; CHECK-NEXT: ret float [[CALL]]
1107 %call = tail call float @_Z4pownfi(float %x, i32 4)
1111 define float @test_pown_f32_y_known_even(float %x, i32 %y.arg) {
1112 ; CHECK-LABEL: define float @test_pown_f32_y_known_even
1113 ; CHECK-SAME: (float [[X:%.*]], i32 [[Y_ARG:%.*]]) {
1114 ; CHECK-NEXT: entry:
1115 ; CHECK-NEXT: [[Y:%.*]] = shl i32 [[Y_ARG]], 1
1116 ; CHECK-NEXT: [[CALL:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 [[Y]])
1117 ; CHECK-NEXT: ret float [[CALL]]
1120 %y = shl i32 %y.arg, 1
1121 %call = tail call float @_Z4pownfi(float %x, i32 %y)
1125 define float @test_fast_pown_f32_y_known_even(float %x, i32 %y.arg) {
1126 ; CHECK-LABEL: define float @test_fast_pown_f32_y_known_even
1127 ; CHECK-SAME: (float [[X:%.*]], i32 [[Y_ARG:%.*]]) {
1128 ; CHECK-NEXT: entry:
1129 ; CHECK-NEXT: [[Y:%.*]] = shl i32 [[Y_ARG]], 1
1130 ; CHECK-NEXT: [[__FABS:%.*]] = call fast float @llvm.fabs.f32(float [[X]])
1131 ; CHECK-NEXT: [[__LOG2:%.*]] = call fast float @llvm.log2.f32(float [[__FABS]])
1132 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[Y]] to float
1133 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul fast float [[__LOG2]], [[POWNI2F]]
1134 ; CHECK-NEXT: [[__EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[__YLOGX]])
1135 ; CHECK-NEXT: ret float [[__EXP2]]
1138 %y = shl i32 %y.arg, 1
1139 %call = tail call fast float @_Z4pownfi(float %x, i32 %y)
1143 define float @test_fast_pown_f32_known_positive_y_known_even(float nofpclass(ninf nsub nnorm) %x, i32 %y.arg) {
1144 ; CHECK-LABEL: define float @test_fast_pown_f32_known_positive_y_known_even
1145 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]], i32 [[Y_ARG:%.*]]) {
1146 ; CHECK-NEXT: entry:
1147 ; CHECK-NEXT: [[Y:%.*]] = shl i32 [[Y_ARG]], 1
1148 ; CHECK-NEXT: [[__FABS:%.*]] = call fast float @llvm.fabs.f32(float [[X]])
1149 ; CHECK-NEXT: [[__LOG2:%.*]] = call fast float @llvm.log2.f32(float [[__FABS]])
1150 ; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[Y]] to float
1151 ; CHECK-NEXT: [[__YLOGX:%.*]] = fmul fast float [[__LOG2]], [[POWNI2F]]
1152 ; CHECK-NEXT: [[__EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[__YLOGX]])
1153 ; CHECK-NEXT: ret float [[__EXP2]]
1156 %y = shl i32 %y.arg, 1
1157 %call = tail call fast float @_Z4pownfi(float %x, i32 %y)
1161 attributes #0 = { nobuiltin }
1162 attributes #1 = { strictfp }