Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / amdgpu-simplify-libcall-pown.ll
blob85e14048f394788a4d93ca4df71300287a23002c
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:%.*]]) {
28 ; CHECK-NEXT:  entry:
29 ; CHECK-NEXT:    [[CALL:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 [[Y]])
30 ; CHECK-NEXT:    ret float [[CALL]]
32 entry:
33   %call = tail call float @_Z4pownfi(float %x, i32 %y)
34   ret float %call
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:%.*]]) {
40 ; CHECK-NEXT:  entry:
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]]
44 entry:
45   %call = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> %x, <2 x i32> %y)
46   ret <2 x float> %call
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:%.*]]) {
52 ; CHECK-NEXT:  entry:
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]]
56 entry:
57   %call = tail call <3 x float> @_Z4pownDv3_fDv3_i(<3 x float> %x, <3 x i32> %y)
58   ret <3 x float> %call
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:%.*]]) {
64 ; CHECK-NEXT:  entry:
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]]
68 entry:
69   %call = tail call <4 x float> @_Z4pownDv4_fDv4_i(<4 x float> %x, <4 x i32> %y)
70   ret <4 x float> %call
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:%.*]]) {
76 ; CHECK-NEXT:  entry:
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]]
80 entry:
81   %call = tail call <8 x float> @_Z4pownDv8_fDv8_i(<8 x float> %x, <8 x i32> %y)
82   ret <8 x float> %call
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:%.*]]) {
88 ; CHECK-NEXT:  entry:
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]]
92 entry:
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:%.*]]) {
100 ; CHECK-NEXT:  entry:
101 ; CHECK-NEXT:    [[CALL:%.*]] = tail call double @_Z4powndi(double [[X]], i32 [[Y]])
102 ; CHECK-NEXT:    ret double [[CALL]]
104 entry:
105   %call = tail call double @_Z4powndi(double %x, i32 %y)
106   ret double %call
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:%.*]]) {
112 ; CHECK-NEXT:  entry:
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]]
116 entry:
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:%.*]]) {
124 ; CHECK-NEXT:  entry:
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]]
128 entry:
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:%.*]]) {
136 ; CHECK-NEXT:  entry:
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]]
140 entry:
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:%.*]]) {
148 ; CHECK-NEXT:  entry:
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]]
152 entry:
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:%.*]]) {
160 ; CHECK-NEXT:  entry:
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]]
164 entry:
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:%.*]]) {
172 ; CHECK-NEXT:  entry:
173 ; CHECK-NEXT:    [[CALL:%.*]] = tail call half @_Z4pownDhi(half [[X]], i32 [[Y]])
174 ; CHECK-NEXT:    ret half [[CALL]]
176 entry:
177   %call = tail call half @_Z4pownDhi(half %x, i32 %y)
178   ret half %call
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:%.*]]) {
184 ; CHECK-NEXT:  entry:
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]]
188 entry:
189   %call = tail call <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half> %x, <2 x i32> %y)
190   ret <2 x half> %call
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:%.*]]) {
196 ; CHECK-NEXT:  entry:
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]]
200 entry:
201   %call = tail call <3 x half> @_Z4pownDv3_DhDv3_i(<3 x half> %x, <3 x i32> %y)
202   ret <3 x half> %call
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:%.*]]) {
208 ; CHECK-NEXT:  entry:
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]]
212 entry:
213   %call = tail call <4 x half> @_Z4pownDv4_DhDv4_i(<4 x half> %x, <4 x i32> %y)
214   ret <4 x half> %call
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:%.*]]) {
220 ; CHECK-NEXT:  entry:
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]]
224 entry:
225   %call = tail call <8 x half> @_Z4pownDv8_DhDv8_i(<8 x half> %x, <8 x i32> %y)
226   ret <8 x half> %call
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:%.*]]) {
232 ; CHECK-NEXT:  entry:
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]]
236 entry:
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:%.*]]) {
244 ; CHECK-NEXT:  entry:
245 ; CHECK-NEXT:    ret float 1.000000e+00
247 entry:
248   %call = tail call float @_Z4pownfi(float %x, i32 0)
249   ret float %call
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:%.*]]) {
255 ; CHECK-NEXT:  entry:
256 ; CHECK-NEXT:    [[CALL:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 poison)
257 ; CHECK-NEXT:    ret float [[CALL]]
259 entry:
260   %call = tail call float @_Z4pownfi(float %x, i32 poison)
261   ret float %call
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:%.*]]) {
267 ; CHECK-NEXT:  entry:
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]]
271 entry:
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:%.*]]) {
279 ; CHECK-NEXT:  entry:
280 ; CHECK-NEXT:    ret <2 x float> <float 1.000000e+00, float 1.000000e+00>
282 entry:
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:%.*]]) {
290 ; CHECK-NEXT:  entry:
291 ; CHECK-NEXT:    ret <2 x float> <float 1.000000e+00, float 1.000000e+00>
293 entry:
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:%.*]]) {
301 ; CHECK-NEXT:  entry:
302 ; CHECK-NEXT:    ret <3 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
304 entry:
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:%.*]]) {
312 ; CHECK-NEXT:  entry:
313 ; CHECK-NEXT:    ret <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
315 entry:
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:%.*]]) {
323 ; CHECK-NEXT:  entry:
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>
326 entry:
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:%.*]]) {
334 ; CHECK-NEXT:  entry:
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>
337 entry:
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:%.*]]) {
345 ; CHECK-NEXT:  entry:
346 ; CHECK-NEXT:    ret float [[X]]
348 entry:
349   %call = tail call float @_Z4pownfi(float %x, i32 1)
350   ret float %call
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:%.*]]) {
356 ; CHECK-NEXT:  entry:
357 ; CHECK-NEXT:    ret <2 x float> [[X]]
359 entry:
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:%.*]]) {
367 ; CHECK-NEXT:  entry:
368 ; CHECK-NEXT:    ret <2 x float> [[X]]
370 entry:
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:%.*]]) {
378 ; CHECK-NEXT:  entry:
379 ; CHECK-NEXT:    ret <3 x float> [[X]]
381 entry:
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:%.*]]) {
389 ; CHECK-NEXT:  entry:
390 ; CHECK-NEXT:    ret <3 x float> [[X]]
392 entry:
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:%.*]]) {
400 ; CHECK-NEXT:  entry:
401 ; CHECK-NEXT:    ret <4 x float> [[X]]
403 entry:
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:%.*]]) {
411 ; CHECK-NEXT:  entry:
412 ; CHECK-NEXT:    ret <8 x float> [[X]]
414 entry:
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:%.*]]) {
422 ; CHECK-NEXT:  entry:
423 ; CHECK-NEXT:    ret <16 x float> [[X]]
425 entry:
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:%.*]]) {
433 ; CHECK-NEXT:  entry:
434 ; CHECK-NEXT:    [[__POW2:%.*]] = fmul float [[X]], [[X]]
435 ; CHECK-NEXT:    ret float [[__POW2]]
437 entry:
438   %call = tail call float @_Z4pownfi(float %x, i32 2)
439   ret float %call
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:%.*]]) {
445 ; CHECK-NEXT:  entry:
446 ; CHECK-NEXT:    [[__POW2:%.*]] = fmul <2 x float> [[X]], [[X]]
447 ; CHECK-NEXT:    ret <2 x float> [[__POW2]]
449 entry:
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:%.*]]) {
457 ; CHECK-NEXT:  entry:
458 ; CHECK-NEXT:    [[__POW2:%.*]] = fmul <3 x float> [[X]], [[X]]
459 ; CHECK-NEXT:    ret <3 x float> [[__POW2]]
461 entry:
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:%.*]]) {
469 ; CHECK-NEXT:  entry:
470 ; CHECK-NEXT:    [[__POW2:%.*]] = fmul <3 x float> [[X]], [[X]]
471 ; CHECK-NEXT:    ret <3 x float> [[__POW2]]
473 entry:
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:%.*]]) {
481 ; CHECK-NEXT:  entry:
482 ; CHECK-NEXT:    [[__POW2:%.*]] = fmul <4 x float> [[X]], [[X]]
483 ; CHECK-NEXT:    ret <4 x float> [[__POW2]]
485 entry:
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:%.*]]) {
493 ; CHECK-NEXT:  entry:
494 ; CHECK-NEXT:    [[__POW2:%.*]] = fmul <8 x float> [[X]], [[X]]
495 ; CHECK-NEXT:    ret <8 x float> [[__POW2]]
497 entry:
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:%.*]]) {
505 ; CHECK-NEXT:  entry:
506 ; CHECK-NEXT:    [[__POW2:%.*]] = fmul <16 x float> [[X]], [[X]]
507 ; CHECK-NEXT:    ret <16 x float> [[__POW2]]
509 entry:
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:%.*]]) {
517 ; CHECK-NEXT:  entry:
518 ; CHECK-NEXT:    [[__POWRECIP:%.*]] = fdiv float 1.000000e+00, [[X]]
519 ; CHECK-NEXT:    ret float [[__POWRECIP]]
521 entry:
522   %call = tail call float @_Z4pownfi(float %x, i32 -1)
523   ret float %call
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:%.*]]) {
529 ; CHECK-NEXT:  entry:
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]]
533 entry:
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:%.*]]) {
541 ; CHECK-NEXT:  entry:
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]]
545 entry:
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:%.*]]) {
553 ; CHECK-NEXT:  entry:
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]]
557 entry:
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:%.*]]) {
565 ; CHECK-NEXT:  entry:
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]]
569 entry:
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:%.*]]) {
577 ; CHECK-NEXT:  entry:
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]]
581 entry:
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:%.*]]) {
589 ; CHECK-NEXT:  entry:
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]]
593 entry:
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:%.*]]) {
601 ; CHECK-NEXT:  entry:
602 ; CHECK-NEXT:    [[CALL:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 [[Y]])
603 ; CHECK-NEXT:    ret float [[CALL]]
605 entry:
606   %call = tail call afn float @_Z4pownfi(float %x, i32 %y)
607   ret float %call
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:%.*]]) {
613 ; CHECK-NEXT:  entry:
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]]
617 entry:
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:%.*]]) {
625 ; CHECK-NEXT:  entry:
626 ; CHECK-NEXT:    [[CALL:%.*]] = tail call afn double @_Z4powndi(double [[X]], i32 [[Y]])
627 ; CHECK-NEXT:    ret double [[CALL]]
629 entry:
630   %call = tail call afn double @_Z4powndi(double %x, i32 %y)
631   ret double %call
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:%.*]]) {
637 ; CHECK-NEXT:  entry:
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]]
641 entry:
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:%.*]]) {
649 ; CHECK-NEXT:  entry:
650 ; CHECK-NEXT:    [[CALL:%.*]] = tail call afn half @_Z4pownDhi(half [[X]], i32 [[Y]])
651 ; CHECK-NEXT:    ret half [[CALL]]
653 entry:
654   %call = tail call afn half @_Z4pownDhi(half %x, i32 %y)
655   ret half %call
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:%.*]]) {
661 ; CHECK-NEXT:  entry:
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]]
665 entry:
666   %call = tail call afn <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half> %x, <2 x i32> %y)
667   ret <2 x half> %call
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:%.*]]) {
673 ; CHECK-NEXT:  entry:
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]]
687 entry:
688   %call = tail call nnan ninf afn float @_Z4pownfi(float %x, i32 %y)
689   ret float %call
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:%.*]]) {
695 ; CHECK-NEXT:  entry:
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]]
710 entry:
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:%.*]]) {
718 ; CHECK-NEXT:  entry:
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]]
733 entry:
734   %call = tail call nnan ninf afn double @_Z4powndi(double %x, i32 %y)
735   ret double %call
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:%.*]]) {
741 ; CHECK-NEXT:  entry:
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]]
756 entry:
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:%.*]]) {
764 ; CHECK-NEXT:  entry:
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]]
779 entry:
780   %call = tail call nnan ninf afn half @_Z4pownDhi(half %x, i32 %y)
781   ret half %call
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:%.*]]) {
787 ; CHECK-NEXT:  entry:
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]]
802 entry:
803   %call = tail call nnan ninf afn <2 x half> @_Z4pownDv2_DhDv2_i(<2 x half> %x, <2 x i32> %y)
804   ret <2 x half> %call
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:%.*]]) {
810 ; CHECK-NEXT:  entry:
811 ; CHECK-NEXT:    [[CALL:%.*]] = tail call fast float @_Z4pownfi(float [[X]], i32 [[Y]]) #[[ATTR3:[0-9]+]]
812 ; CHECK-NEXT:    ret float [[CALL]]
814 entry:
815   %call = tail call fast float @_Z4pownfi(float %x, i32 %y) #0
816   ret float %call
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]+]] {
822 ; CHECK-NEXT:  entry:
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]]
836 entry:
837   %call = tail call fast float @_Z4pownfi(float %x, i32 %y) #1
838   ret float %call
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)
847   ret float %call
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)
858   ret float %call
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)
870   ret float %call
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)
881   ret float %call
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)
893   ret float %call
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)
905   ret float %call
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)
918   ret float %call
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)
931   ret float %call
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)
945   ret float %call
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)
957   ret float %call
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)
970   ret float %call
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:%.*]]) {
976 ; CHECK-NEXT:  entry:
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]]
981 entry:
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:%.*]]) {
989 ; CHECK-NEXT:  entry:
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]]
994 entry:
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]]
1008 entry:
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]]
1022 entry:
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]]
1036 entry:
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]]
1048 entry:
1049   %call = tail call float @_Z4pownfi(float %x, i32 %y)
1050   ret float %call
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]]
1060 entry:
1061   %call = tail call afn float @_Z4pownfi(float %x, i32 %y)
1062   ret float %call
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]]
1082 entry:
1083   %call = tail call afn ninf nnan float @_Z4pownfi(float %x, i32 %y)
1084   ret float %call
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]]
1094 entry:
1095   %call = tail call afn float @_Z4pownfi(float %x, i32 4)
1096   ret float %call
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]]
1106 entry:
1107   %call = tail call float @_Z4pownfi(float %x, i32 4)
1108   ret float %call
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]]
1119 entry:
1120   %y = shl i32 %y.arg, 1
1121   %call = tail call float @_Z4pownfi(float %x, i32 %y)
1122   ret float %call
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]]
1137 entry:
1138   %y = shl i32 %y.arg, 1
1139   %call = tail call fast float @_Z4pownfi(float %x, i32 %y)
1140   ret float %call
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]]
1155 entry:
1156   %y = shl i32 %y.arg, 1
1157   %call = tail call fast float @_Z4pownfi(float %x, i32 %y)
1158   ret float %call
1161 attributes #0 = { nobuiltin }
1162 attributes #1 = { strictfp }