xref: /llvm-project/llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-sincos.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2; RUN: opt -S -O1 -mtriple=amdgcn-- -amdgpu-simplify-libcall=1 -amdgpu-prelink < %s | FileCheck %s
3
4target 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:9"
5
6declare float @_Z3sinf(float) #0
7declare float @_Z3cosf(float) #0
8declare <2 x float> @_Z3sinDv2_f(<2 x float>) #0
9declare <2 x float> @_Z3cosDv2_f(<2 x float>) #0
10declare <3 x float> @_Z3sinDv3_f(<3 x float>) #0
11declare <3 x float> @_Z3cosDv3_f(<3 x float>) #0
12declare <4 x float> @_Z3sinDv4_f(<4 x float>) #0
13declare <4 x float> @_Z3cosDv4_f(<4 x float>) #0
14declare <8 x float> @_Z3sinDv8_f(<8 x float>) #0
15declare <8 x float> @_Z3cosDv8_f(<8 x float>) #0
16declare <16 x float> @_Z3sinDv16_f(<16 x float>) #0
17declare <16 x float> @_Z3cosDv16_f(<16 x float>) #0
18
19
20declare half @_Z3sinDh(half) #0
21declare half @_Z3cosDh(half) #0
22declare <2 x half> @_Z3sinDv2_Dh(<2 x half>) #0
23declare <2 x half> @_Z3cosDv2_Dh(<2 x half>) #0
24declare <3 x half> @_Z3sinDv3_Dh(<3 x half>) #0
25declare <3 x half> @_Z3cosDv3_Dh(<3 x half>) #0
26declare <4 x half> @_Z3sinDv4_Dh(<4 x half>) #0
27declare <4 x half> @_Z3cosDv4_Dh(<4 x half>) #0
28declare <8 x half> @_Z3sinDv8_Dh(<8 x half>) #0
29declare <8 x half> @_Z3cosDv8_Dh(<8 x half>) #0
30declare <16 x half> @_Z3sinDv16_Dh(<16 x half>) #0
31declare <16 x half> @_Z3cosDv16_Dh(<16 x half>) #0
32
33
34declare double @_Z3sind(double) #0
35declare double @_Z3cosd(double) #0
36declare <2 x double> @_Z3sinDv2_d(<2 x double>) #0
37declare <2 x double> @_Z3cosDv2_d(<2 x double>) #0
38declare <3 x double> @_Z3sinDv3_d(<3 x double>) #0
39declare <3 x double> @_Z3cosDv3_d(<3 x double>) #0
40declare <4 x double> @_Z3sinDv4_d(<4 x double>) #0
41declare <4 x double> @_Z3cosDv4_d(<4 x double>) #0
42declare <8 x double> @_Z3sinDv8_d(<8 x double>) #0
43declare <8 x double> @_Z3cosDv8_d(<8 x double>) #0
44declare <16 x double> @_Z3sinDv16_d(<16 x double>) #0
45declare <16 x double> @_Z3cosDv16_d(<16 x double>) #0
46
47declare float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) writeonly %ptr) #1
48declare float @_Z6sincosfPU3AS0f(float %x, ptr writeonly %ptr) #1
49
50define void @sincos_f16_nocontract(half %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
51; CHECK-LABEL: define void @sincos_f16_nocontract
52; CHECK-SAME: (half [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 2)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 2)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {
53; CHECK-NEXT:  entry:
54; CHECK-NEXT:    [[CALL:%.*]] = tail call half @_Z3sinDh(half [[X]])
55; CHECK-NEXT:    store half [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 2
56; CHECK-NEXT:    [[CALL1:%.*]] = tail call half @_Z3cosDh(half [[X]])
57; CHECK-NEXT:    store half [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 2
58; CHECK-NEXT:    ret void
59;
60entry:
61  %call = tail call half @_Z3sinDh(half %x)
62  store half %call, ptr addrspace(1) %sin_out, align 2
63  %call1 = tail call half @_Z3cosDh(half %x)
64  store half %call1, ptr addrspace(1) %cos_out, align 2
65  ret void
66}
67
68
69define void @sincos_v2f16_nocontract(<2 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
70; CHECK-LABEL: define void @sincos_v2f16_nocontract
71; CHECK-SAME: (<2 x half> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
72; CHECK-NEXT:  entry:
73; CHECK-NEXT:    [[CALL:%.*]] = tail call <2 x half> @_Z3sinDv2_Dh(<2 x half> [[X]])
74; CHECK-NEXT:    store <2 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4
75; CHECK-NEXT:    [[CALL1:%.*]] = tail call <2 x half> @_Z3cosDv2_Dh(<2 x half> [[X]])
76; CHECK-NEXT:    store <2 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4
77; CHECK-NEXT:    ret void
78;
79entry:
80  %call = tail call <2 x half> @_Z3sinDv2_Dh(<2 x half> %x)
81  store <2 x half> %call, ptr addrspace(1) %sin_out, align 4
82  %call1 = tail call <2 x half> @_Z3cosDv2_Dh(<2 x half> %x)
83  store <2 x half> %call1, ptr addrspace(1) %cos_out, align 4
84  ret void
85}
86
87
88define void @sincos_f16(half %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
89; CHECK-LABEL: define void @sincos_f16
90; CHECK-SAME: (half [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 2)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 2)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
91; CHECK-NEXT:  entry:
92; CHECK-NEXT:    [[CALL:%.*]] = tail call contract half @_Z3sinDh(half [[X]])
93; CHECK-NEXT:    store half [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 2
94; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract half @_Z3cosDh(half [[X]])
95; CHECK-NEXT:    store half [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 2
96; CHECK-NEXT:    ret void
97;
98entry:
99  %call = tail call contract half @_Z3sinDh(half %x)
100  store half %call, ptr addrspace(1) %sin_out, align 2
101  %call1 = tail call contract half @_Z3cosDh(half %x)
102  store half %call1, ptr addrspace(1) %cos_out, align 2
103  ret void
104}
105
106define void @sincos_f16_order1(half %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
107; CHECK-LABEL: define void @sincos_f16_order1
108; CHECK-SAME: (half [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 2)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 2)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
109; CHECK-NEXT:  entry:
110; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract half @_Z3cosDh(half [[X]])
111; CHECK-NEXT:    store half [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 2
112; CHECK-NEXT:    [[CALL:%.*]] = tail call contract half @_Z3sinDh(half [[X]])
113; CHECK-NEXT:    store half [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 2
114; CHECK-NEXT:    ret void
115;
116entry:
117  %call1 = tail call contract half @_Z3cosDh(half %x)
118  store half %call1, ptr addrspace(1) %cos_out, align 2
119  %call = tail call contract half @_Z3sinDh(half %x)
120  store half %call, ptr addrspace(1) %sin_out, align 2
121  ret void
122}
123
124define void @sincos_v2f16(<2 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
125; CHECK-LABEL: define void @sincos_v2f16
126; CHECK-SAME: (<2 x half> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
127; CHECK-NEXT:  entry:
128; CHECK-NEXT:    [[CALL:%.*]] = tail call contract <2 x half> @_Z3sinDv2_Dh(<2 x half> [[X]])
129; CHECK-NEXT:    store <2 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4
130; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract <2 x half> @_Z3cosDv2_Dh(<2 x half> [[X]])
131; CHECK-NEXT:    store <2 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4
132; CHECK-NEXT:    ret void
133;
134entry:
135  %call = tail call contract <2 x half> @_Z3sinDv2_Dh(<2 x half> %x)
136  store <2 x half> %call, ptr addrspace(1) %sin_out, align 4
137  %call1 = tail call contract <2 x half> @_Z3cosDv2_Dh(<2 x half> %x)
138  store <2 x half> %call1, ptr addrspace(1) %cos_out, align 4
139  ret void
140}
141
142define void @sincos_v3f16(<3 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
143; CHECK-LABEL: define void @sincos_v3f16
144; CHECK-SAME: (<3 x half> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
145; CHECK-NEXT:  entry:
146; CHECK-NEXT:    [[CALL:%.*]] = tail call contract <3 x half> @_Z3sinDv3_Dh(<3 x half> [[X]])
147; CHECK-NEXT:    [[EXTRACTVEC2:%.*]] = shufflevector <3 x half> [[CALL]], <3 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
148; CHECK-NEXT:    store <4 x half> [[EXTRACTVEC2]], ptr addrspace(1) [[SIN_OUT]], align 8
149; CHECK-NEXT:    [[CALL5:%.*]] = tail call contract <3 x half> @_Z3cosDv3_Dh(<3 x half> [[X]])
150; CHECK-NEXT:    [[EXTRACTVEC6:%.*]] = shufflevector <3 x half> [[CALL5]], <3 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
151; CHECK-NEXT:    store <4 x half> [[EXTRACTVEC6]], ptr addrspace(1) [[COS_OUT]], align 8
152; CHECK-NEXT:    ret void
153;
154entry:
155  %call = tail call contract <3 x half> @_Z3sinDv3_Dh(<3 x half> %x)
156  %extractVec2 = shufflevector <3 x half> %call, <3 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
157  store <4 x half> %extractVec2, ptr addrspace(1) %sin_out, align 8
158  %call5 = tail call contract <3 x half> @_Z3cosDv3_Dh(<3 x half> %x)
159  %extractVec6 = shufflevector <3 x half> %call5, <3 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
160  store <4 x half> %extractVec6, ptr addrspace(1) %cos_out, align 8
161  ret void
162}
163
164
165define void @sincos_v4f16(<4 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
166; CHECK-LABEL: define void @sincos_v4f16
167; CHECK-SAME: (<4 x half> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
168; CHECK-NEXT:  entry:
169; CHECK-NEXT:    [[CALL:%.*]] = tail call contract <4 x half> @_Z3sinDv4_Dh(<4 x half> [[X]])
170; CHECK-NEXT:    store <4 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 8
171; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract <4 x half> @_Z3cosDv4_Dh(<4 x half> [[X]])
172; CHECK-NEXT:    store <4 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 8
173; CHECK-NEXT:    ret void
174;
175entry:
176  %call = tail call contract <4 x half> @_Z3sinDv4_Dh(<4 x half> %x)
177  store <4 x half> %call, ptr addrspace(1) %sin_out, align 8
178  %call1 = tail call contract <4 x half> @_Z3cosDv4_Dh(<4 x half> %x)
179  store <4 x half> %call1, ptr addrspace(1) %cos_out, align 8
180  ret void
181}
182
183define void @sincos_v8f16(<8 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
184; CHECK-LABEL: define void @sincos_v8f16
185; CHECK-SAME: (<8 x half> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
186; CHECK-NEXT:  entry:
187; CHECK-NEXT:    [[CALL:%.*]] = tail call contract <8 x half> @_Z3sinDv8_Dh(<8 x half> [[X]])
188; CHECK-NEXT:    store <8 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 16
189; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract <8 x half> @_Z3cosDv8_Dh(<8 x half> [[X]])
190; CHECK-NEXT:    store <8 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 16
191; CHECK-NEXT:    ret void
192;
193entry:
194  %call = tail call contract <8 x half> @_Z3sinDv8_Dh(<8 x half> %x)
195  store <8 x half> %call, ptr addrspace(1) %sin_out, align 16
196  %call1 = tail call contract <8 x half> @_Z3cosDv8_Dh(<8 x half> %x)
197  store <8 x half> %call1, ptr addrspace(1) %cos_out, align 16
198  ret void
199}
200
201
202define void @sincos_v16f16(<16 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
203; CHECK-LABEL: define void @sincos_v16f16
204; CHECK-SAME: (<16 x half> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 32)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 32)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
205; CHECK-NEXT:  entry:
206; CHECK-NEXT:    [[CALL:%.*]] = tail call contract <16 x half> @_Z3sinDv16_Dh(<16 x half> [[X]])
207; CHECK-NEXT:    store <16 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 32
208; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract <16 x half> @_Z3cosDv16_Dh(<16 x half> [[X]])
209; CHECK-NEXT:    store <16 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 32
210; CHECK-NEXT:    ret void
211;
212entry:
213  %call = tail call contract <16 x half> @_Z3sinDv16_Dh(<16 x half> %x)
214  store <16 x half> %call, ptr addrspace(1) %sin_out, align 32
215  %call1 = tail call contract <16 x half> @_Z3cosDv16_Dh(<16 x half> %x)
216  store <16 x half> %call1, ptr addrspace(1) %cos_out, align 32
217  ret void
218}
219
220
221define void @sincos_f32_nocontract(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
222; CHECK-LABEL: define void @sincos_f32_nocontract
223; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3:[0-9]+]] {
224; CHECK-NEXT:  entry:
225; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
226; CHECK-NEXT:    [[TMP0:%.*]] = call float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
227; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
228; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
229; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
230; CHECK-NEXT:    ret void
231;
232entry:
233  %call = tail call float @_Z3sinf(float %x)
234  store float %call, ptr addrspace(1) %sin_out, align 4
235  %call1 = tail call float @_Z3cosf(float %x)
236  store float %call1, ptr addrspace(1) %cos_out, align 4
237  ret void
238}
239
240
241define void @sincos_v2f32_nocontract(<2 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
242; CHECK-LABEL: define void @sincos_v2f32_nocontract
243; CHECK-SAME: (<2 x float> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4:[0-9]+]] {
244; CHECK-NEXT:  entry:
245; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <2 x float>, align 8, addrspace(5)
246; CHECK-NEXT:    [[TMP0:%.*]] = call <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])
247; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x float>, ptr addrspace(5) [[__SINCOS_]], align 8
248; CHECK-NEXT:    store <2 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8
249; CHECK-NEXT:    store <2 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8
250; CHECK-NEXT:    ret void
251;
252entry:
253  %call = tail call <2 x float> @_Z3sinDv2_f(<2 x float> %x)
254  store <2 x float> %call, ptr addrspace(1) %sin_out, align 8
255  %call1 = tail call <2 x float> @_Z3cosDv2_f(<2 x float> %x)
256  store <2 x float> %call1, ptr addrspace(1) %cos_out, align 8
257  ret void
258}
259
260
261define void @sincos_f32(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
262; CHECK-LABEL: define void @sincos_f32
263; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
264; CHECK-NEXT:  entry:
265; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
266; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
267; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
268; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
269; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
270; CHECK-NEXT:    ret void
271;
272entry:
273  %call = tail call contract float @_Z3sinf(float %x)
274  store float %call, ptr addrspace(1) %sin_out, align 4
275  %call1 = tail call contract float @_Z3cosf(float %x)
276  store float %call1, ptr addrspace(1) %cos_out, align 4
277  ret void
278}
279
280define void @sincos_f32_order1(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
281; CHECK-LABEL: define void @sincos_f32_order1
282; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
283; CHECK-NEXT:  entry:
284; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
285; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
286; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
287; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
288; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
289; CHECK-NEXT:    ret void
290;
291entry:
292  %call1 = tail call contract float @_Z3cosf(float %x)
293  store float %call1, ptr addrspace(1) %cos_out, align 4
294  %call = tail call contract float @_Z3sinf(float %x)
295  store float %call, ptr addrspace(1) %sin_out, align 4
296  ret void
297}
298
299define void @sincos_v2f32(<2 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
300; CHECK-LABEL: define void @sincos_v2f32
301; CHECK-SAME: (<2 x float> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
302; CHECK-NEXT:  entry:
303; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <2 x float>, align 8, addrspace(5)
304; CHECK-NEXT:    [[TMP0:%.*]] = call contract <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])
305; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x float>, ptr addrspace(5) [[__SINCOS_]], align 8
306; CHECK-NEXT:    store <2 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8
307; CHECK-NEXT:    store <2 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8
308; CHECK-NEXT:    ret void
309;
310entry:
311  %call = tail call contract <2 x float> @_Z3sinDv2_f(<2 x float> %x)
312  store <2 x float> %call, ptr addrspace(1) %sin_out, align 8
313  %call1 = tail call contract <2 x float> @_Z3cosDv2_f(<2 x float> %x)
314  store <2 x float> %call1, ptr addrspace(1) %cos_out, align 8
315  ret void
316}
317
318define void @sincos_v3f32(<3 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
319; CHECK-LABEL: define void @sincos_v3f32
320; CHECK-SAME: (<3 x float> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
321; CHECK-NEXT:  entry:
322; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <3 x float>, align 16, addrspace(5)
323; CHECK-NEXT:    [[TMP0:%.*]] = call contract <3 x float> @_Z6sincosDv3_fPU3AS5S_(<3 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])
324; CHECK-NEXT:    [[TMP1:%.*]] = load <3 x float>, ptr addrspace(5) [[__SINCOS_]], align 16
325; CHECK-NEXT:    [[EXTRACTVEC2:%.*]] = shufflevector <3 x float> [[TMP0]], <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
326; CHECK-NEXT:    store <4 x float> [[EXTRACTVEC2]], ptr addrspace(1) [[SIN_OUT]], align 16
327; CHECK-NEXT:    [[EXTRACTVEC6:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
328; CHECK-NEXT:    store <4 x float> [[EXTRACTVEC6]], ptr addrspace(1) [[COS_OUT]], align 16
329; CHECK-NEXT:    ret void
330;
331entry:
332  %call = tail call contract <3 x float> @_Z3sinDv3_f(<3 x float> %x)
333  %extractVec2 = shufflevector <3 x float> %call, <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
334  store <4 x float> %extractVec2, ptr addrspace(1) %sin_out, align 16
335  %call5 = tail call contract <3 x float> @_Z3cosDv3_f(<3 x float> %x)
336  %extractVec6 = shufflevector <3 x float> %call5, <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
337  store <4 x float> %extractVec6, ptr addrspace(1) %cos_out, align 16
338  ret void
339}
340
341define void @sincos_v4f32(<4 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
342; CHECK-LABEL: define void @sincos_v4f32
343; CHECK-SAME: (<4 x float> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
344; CHECK-NEXT:  entry:
345; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <4 x float>, align 16, addrspace(5)
346; CHECK-NEXT:    [[TMP0:%.*]] = call contract <4 x float> @_Z6sincosDv4_fPU3AS5S_(<4 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])
347; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr addrspace(5) [[__SINCOS_]], align 16
348; CHECK-NEXT:    store <4 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 16
349; CHECK-NEXT:    store <4 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 16
350; CHECK-NEXT:    ret void
351;
352entry:
353  %call = tail call contract <4 x float> @_Z3sinDv4_f(<4 x float> %x)
354  store <4 x float> %call, ptr addrspace(1) %sin_out, align 16
355  %call1 = tail call contract <4 x float> @_Z3cosDv4_f(<4 x float> %x)
356  store <4 x float> %call1, ptr addrspace(1) %cos_out, align 16
357  ret void
358}
359
360define void @sincos_v8f32(<8 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
361; CHECK-LABEL: define void @sincos_v8f32
362; CHECK-SAME: (<8 x float> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 32)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 32)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
363; CHECK-NEXT:  entry:
364; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <8 x float>, align 32, addrspace(5)
365; CHECK-NEXT:    [[TMP0:%.*]] = call contract <8 x float> @_Z6sincosDv8_fPU3AS5S_(<8 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])
366; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x float>, ptr addrspace(5) [[__SINCOS_]], align 32
367; CHECK-NEXT:    store <8 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 32
368; CHECK-NEXT:    store <8 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 32
369; CHECK-NEXT:    ret void
370;
371entry:
372  %call = tail call contract <8 x float> @_Z3sinDv8_f(<8 x float> %x)
373  store <8 x float> %call, ptr addrspace(1) %sin_out, align 32
374  %call1 = tail call contract <8 x float> @_Z3cosDv8_f(<8 x float> %x)
375  store <8 x float> %call1, ptr addrspace(1) %cos_out, align 32
376  ret void
377}
378
379define void @sincos_v16f32(<16 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
380; CHECK-LABEL: define void @sincos_v16f32
381; CHECK-SAME: (<16 x float> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 64)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 64)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
382; CHECK-NEXT:  entry:
383; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <16 x float>, align 64, addrspace(5)
384; CHECK-NEXT:    [[TMP0:%.*]] = call contract <16 x float> @_Z6sincosDv16_fPU3AS5S_(<16 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])
385; CHECK-NEXT:    [[TMP1:%.*]] = load <16 x float>, ptr addrspace(5) [[__SINCOS_]], align 64
386; CHECK-NEXT:    store <16 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 64
387; CHECK-NEXT:    store <16 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 64
388; CHECK-NEXT:    ret void
389;
390entry:
391  %call = tail call contract <16 x float> @_Z3sinDv16_f(<16 x float> %x)
392  store <16 x float> %call, ptr addrspace(1) %sin_out, align 64
393  %call1 = tail call contract <16 x float> @_Z3cosDv16_f(<16 x float> %x)
394  store <16 x float> %call1, ptr addrspace(1) %cos_out, align 64
395  ret void
396}
397
398define void @sincos_f64_nocontract(double %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
399; CHECK-LABEL: define void @sincos_f64_nocontract
400; CHECK-SAME: (double [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
401; CHECK-NEXT:  entry:
402; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca double, align 8, addrspace(5)
403; CHECK-NEXT:    [[TMP0:%.*]] = call double @_Z6sincosdPU3AS5d(double [[X]], ptr addrspace(5) [[__SINCOS_]])
404; CHECK-NEXT:    [[TMP1:%.*]] = load double, ptr addrspace(5) [[__SINCOS_]], align 8
405; CHECK-NEXT:    store double [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8
406; CHECK-NEXT:    store double [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8
407; CHECK-NEXT:    ret void
408;
409entry:
410  %call = tail call double @_Z3sind(double %x)
411  store double %call, ptr addrspace(1) %sin_out, align 8
412  %call1 = tail call double @_Z3cosd(double %x)
413  store double %call1, ptr addrspace(1) %cos_out, align 8
414  ret void
415}
416
417
418define void @sincos_v2f64_nocontract(<2 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
419; CHECK-LABEL: define void @sincos_v2f64_nocontract
420; CHECK-SAME: (<2 x double> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
421; CHECK-NEXT:  entry:
422; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <2 x double>, align 16, addrspace(5)
423; CHECK-NEXT:    [[TMP0:%.*]] = call <2 x double> @_Z6sincosDv2_dPU3AS5S_(<2 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])
424; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr addrspace(5) [[__SINCOS_]], align 16
425; CHECK-NEXT:    store <2 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 16
426; CHECK-NEXT:    store <2 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 16
427; CHECK-NEXT:    ret void
428;
429entry:
430  %call = tail call <2 x double> @_Z3sinDv2_d(<2 x double> %x)
431  store <2 x double> %call, ptr addrspace(1) %sin_out, align 16
432  %call1 = tail call <2 x double> @_Z3cosDv2_d(<2 x double> %x)
433  store <2 x double> %call1, ptr addrspace(1) %cos_out, align 16
434  ret void
435}
436
437define void @sincos_f64(double %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
438; CHECK-LABEL: define void @sincos_f64
439; CHECK-SAME: (double [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
440; CHECK-NEXT:  entry:
441; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca double, align 8, addrspace(5)
442; CHECK-NEXT:    [[TMP0:%.*]] = call contract double @_Z6sincosdPU3AS5d(double [[X]], ptr addrspace(5) [[__SINCOS_]])
443; CHECK-NEXT:    [[TMP1:%.*]] = load double, ptr addrspace(5) [[__SINCOS_]], align 8
444; CHECK-NEXT:    store double [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8
445; CHECK-NEXT:    store double [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8
446; CHECK-NEXT:    ret void
447;
448entry:
449  %call = tail call contract double @_Z3sind(double %x)
450  store double %call, ptr addrspace(1) %sin_out, align 8
451  %call1 = tail call contract double @_Z3cosd(double %x)
452  store double %call1, ptr addrspace(1) %cos_out, align 8
453  ret void
454}
455
456define void @sincos_f64_order1(double %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
457; CHECK-LABEL: define void @sincos_f64_order1
458; CHECK-SAME: (double [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
459; CHECK-NEXT:  entry:
460; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca double, align 8, addrspace(5)
461; CHECK-NEXT:    [[TMP0:%.*]] = call contract double @_Z6sincosdPU3AS5d(double [[X]], ptr addrspace(5) [[__SINCOS_]])
462; CHECK-NEXT:    [[TMP1:%.*]] = load double, ptr addrspace(5) [[__SINCOS_]], align 8
463; CHECK-NEXT:    store double [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8
464; CHECK-NEXT:    store double [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8
465; CHECK-NEXT:    ret void
466;
467entry:
468  %call1 = tail call contract double @_Z3cosd(double %x)
469  store double %call1, ptr addrspace(1) %cos_out, align 8
470  %call = tail call contract double @_Z3sind(double %x)
471  store double %call, ptr addrspace(1) %sin_out, align 8
472  ret void
473}
474
475define void @sincos_v2f64(<2 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
476; CHECK-LABEL: define void @sincos_v2f64
477; CHECK-SAME: (<2 x double> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 16)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
478; CHECK-NEXT:  entry:
479; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <2 x double>, align 16, addrspace(5)
480; CHECK-NEXT:    [[TMP0:%.*]] = call contract <2 x double> @_Z6sincosDv2_dPU3AS5S_(<2 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])
481; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr addrspace(5) [[__SINCOS_]], align 16
482; CHECK-NEXT:    store <2 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 16
483; CHECK-NEXT:    store <2 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 16
484; CHECK-NEXT:    ret void
485;
486entry:
487  %call = tail call contract <2 x double> @_Z3sinDv2_d(<2 x double> %x)
488  store <2 x double> %call, ptr addrspace(1) %sin_out, align 16
489  %call1 = tail call contract <2 x double> @_Z3cosDv2_d(<2 x double> %x)
490  store <2 x double> %call1, ptr addrspace(1) %cos_out, align 16
491  ret void
492}
493
494define void @sincos_v3f64(<3 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
495; CHECK-LABEL: define void @sincos_v3f64
496; CHECK-SAME: (<3 x double> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 32)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 32)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
497; CHECK-NEXT:  entry:
498; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <3 x double>, align 32, addrspace(5)
499; CHECK-NEXT:    [[TMP0:%.*]] = call contract <3 x double> @_Z6sincosDv3_dPU3AS5S_(<3 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])
500; CHECK-NEXT:    [[TMP1:%.*]] = load <3 x double>, ptr addrspace(5) [[__SINCOS_]], align 32
501; CHECK-NEXT:    [[EXTRACTVEC2:%.*]] = shufflevector <3 x double> [[TMP0]], <3 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
502; CHECK-NEXT:    store <4 x double> [[EXTRACTVEC2]], ptr addrspace(1) [[SIN_OUT]], align 32
503; CHECK-NEXT:    [[EXTRACTVEC6:%.*]] = shufflevector <3 x double> [[TMP1]], <3 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
504; CHECK-NEXT:    store <4 x double> [[EXTRACTVEC6]], ptr addrspace(1) [[COS_OUT]], align 32
505; CHECK-NEXT:    ret void
506;
507entry:
508  %call = tail call contract <3 x double> @_Z3sinDv3_d(<3 x double> %x)
509  %extractVec2 = shufflevector <3 x double> %call, <3 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
510  store <4 x double> %extractVec2, ptr addrspace(1) %sin_out, align 32
511  %call5 = tail call contract <3 x double> @_Z3cosDv3_d(<3 x double> %x)
512  %extractVec6 = shufflevector <3 x double> %call5, <3 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
513  store <4 x double> %extractVec6, ptr addrspace(1) %cos_out, align 32
514  ret void
515}
516
517define void @sincos_v4f64(<4 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
518; CHECK-LABEL: define void @sincos_v4f64
519; CHECK-SAME: (<4 x double> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 32)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 32)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
520; CHECK-NEXT:  entry:
521; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <4 x double>, align 32, addrspace(5)
522; CHECK-NEXT:    [[TMP0:%.*]] = call contract <4 x double> @_Z6sincosDv4_dPU3AS5S_(<4 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])
523; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr addrspace(5) [[__SINCOS_]], align 32
524; CHECK-NEXT:    store <4 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 32
525; CHECK-NEXT:    store <4 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 32
526; CHECK-NEXT:    ret void
527;
528entry:
529  %call = tail call contract <4 x double> @_Z3sinDv4_d(<4 x double> %x)
530  store <4 x double> %call, ptr addrspace(1) %sin_out, align 32
531  %call1 = tail call contract <4 x double> @_Z3cosDv4_d(<4 x double> %x)
532  store <4 x double> %call1, ptr addrspace(1) %cos_out, align 32
533  ret void
534}
535
536define void @sincos_v8f64(<8 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
537; CHECK-LABEL: define void @sincos_v8f64
538; CHECK-SAME: (<8 x double> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 64)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 64)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
539; CHECK-NEXT:  entry:
540; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <8 x double>, align 64, addrspace(5)
541; CHECK-NEXT:    [[TMP0:%.*]] = call contract <8 x double> @_Z6sincosDv8_dPU3AS5S_(<8 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])
542; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x double>, ptr addrspace(5) [[__SINCOS_]], align 64
543; CHECK-NEXT:    store <8 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 64
544; CHECK-NEXT:    store <8 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 64
545; CHECK-NEXT:    ret void
546;
547entry:
548  %call = tail call contract <8 x double> @_Z3sinDv8_d(<8 x double> %x)
549  store <8 x double> %call, ptr addrspace(1) %sin_out, align 64
550  %call1 = tail call contract <8 x double> @_Z3cosDv8_d(<8 x double> %x)
551  store <8 x double> %call1, ptr addrspace(1) %cos_out, align 64
552  ret void
553}
554
555define void @sincos_v16f64(<16 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
556; CHECK-LABEL: define void @sincos_v16f64
557; CHECK-SAME: (<16 x double> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 128)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 128)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
558; CHECK-NEXT:  entry:
559; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <16 x double>, align 128, addrspace(5)
560; CHECK-NEXT:    [[TMP0:%.*]] = call contract <16 x double> @_Z6sincosDv16_dPU3AS5S_(<16 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])
561; CHECK-NEXT:    [[TMP1:%.*]] = load <16 x double>, ptr addrspace(5) [[__SINCOS_]], align 128
562; CHECK-NEXT:    store <16 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 128
563; CHECK-NEXT:    store <16 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 128
564; CHECK-NEXT:    ret void
565;
566entry:
567  %call = tail call contract <16 x double> @_Z3sinDv16_d(<16 x double> %x)
568  store <16 x double> %call, ptr addrspace(1) %sin_out, align 128
569  %call1 = tail call contract <16 x double> @_Z3cosDv16_d(<16 x double> %x)
570  store <16 x double> %call1, ptr addrspace(1) %cos_out, align 128
571  ret void
572}
573
574
575
576define void @sincos_f32_different_blocks(i1 %cond, float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
577; CHECK-LABEL: define void @sincos_f32_different_blocks
578; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], ptr addrspace(1) writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
579; CHECK-NEXT:  entry:
580; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
581; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
582; CHECK-NEXT:    br i1 [[COND]], label [[BB0:%.*]], label [[BB1:%.*]]
583; CHECK:       common.ret:
584; CHECK-NEXT:    ret void
585; CHECK:       bb0:
586; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
587; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
588; CHECK:       bb1:
589; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
590; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
591; CHECK-NEXT:    br label [[COMMON_RET]]
592;
593entry:
594  br i1 %cond, label %bb0, label %bb1
595
596bb0:
597  %call = tail call contract float @_Z3sinf(float %x)
598  store float %call, ptr addrspace(1) %sin_out, align 4
599  ret void
600
601bb1:
602  %call1 = tail call contract float @_Z3cosf(float %x)
603  store float %call1, ptr addrspace(1) %cos_out, align 4
604  ret void
605}
606
607; The sin and cos are in different blocks but always execute
608define void @sincos_f32_different_blocks_dominating_always_execute(i1 %cond, float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out, ptr addrspace(1) %other) {
609; CHECK-LABEL: define void @sincos_f32_different_blocks_dominating_always_execute
610; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]], ptr addrspace(1) writeonly captures(none) [[OTHER:%.*]]) local_unnamed_addr #[[ATTR3]] {
611; CHECK-NEXT:  entry:
612; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
613; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
614; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
615; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
616; CHECK-NEXT:    br i1 [[COND]], label [[BB0:%.*]], label [[BB1:%.*]]
617; CHECK:       bb0:
618; CHECK-NEXT:    store i32 0, ptr addrspace(1) [[OTHER]], align 4
619; CHECK-NEXT:    br label [[BB1]]
620; CHECK:       bb1:
621; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
622; CHECK-NEXT:    ret void
623;
624entry:
625  %call = tail call contract float @_Z3sinf(float %x)
626  store float %call, ptr addrspace(1) %sin_out, align 4
627  br i1 %cond, label %bb0, label %bb1
628
629bb0:
630  store i32 0, ptr addrspace(1) %other
631  br label %bb1
632
633bb1:
634  %call1 = tail call contract float @_Z3cosf(float %x)
635  store float %call1, ptr addrspace(1) %cos_out, align 4
636  ret void
637}
638
639; sin dominates cos but cos doesn't always execute.
640define void @sincos_f32_different_blocks_dominating_conditional_execute(i1 %cond, float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out, ptr addrspace(1) %other) {
641; CHECK-LABEL: define void @sincos_f32_different_blocks_dominating_conditional_execute
642; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]], ptr addrspace(1) readnone captures(none) [[OTHER:%.*]]) local_unnamed_addr #[[ATTR3]] {
643; CHECK-NEXT:  entry:
644; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
645; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
646; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
647; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
648; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[COND]], float [[TMP1]], float 0.000000e+00
649; CHECK-NEXT:    store float [[SPEC_SELECT]], ptr addrspace(1) [[COS_OUT]], align 4
650; CHECK-NEXT:    ret void
651;
652entry:
653  %call = tail call contract float @_Z3sinf(float %x)
654  store float %call, ptr addrspace(1) %sin_out, align 4
655  br i1 %cond, label %bb0, label %bb1
656
657bb0:
658  %call1 = tail call contract float @_Z3cosf(float %x)
659  br label %bb1
660
661bb1:
662  %phi = phi float [%call1, %bb0], [0.0, %entry]
663  store float %phi, ptr addrspace(1) %cos_out, align 4
664  ret void
665}
666
667define float @select_sin_or_cos_f32(i1 %cond, float %x) {
668; CHECK-LABEL: define float @select_sin_or_cos_f32
669; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) local_unnamed_addr #[[ATTR5:[0-9]+]] {
670; CHECK-NEXT:  entry:
671; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
672; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
673; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
674; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[TMP0]], float [[TMP1]]
675; CHECK-NEXT:    ret float [[SELECT]]
676;
677entry:
678  %sin = tail call contract float @_Z3sinf(float %x)
679  %cos = tail call contract float @_Z3cosf(float %x)
680  %select = select i1 %cond, float %sin, float %cos
681  ret float %select
682}
683
684declare void @func(ptr addrspace(1))
685
686define void @sincos_f32_value_is_instr(ptr addrspace(1) %value.ptr, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
687; CHECK-LABEL: define void @sincos_f32_value_is_instr
688; CHECK-SAME: (ptr addrspace(1) [[VALUE_PTR:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
689; CHECK-NEXT:  entry:
690; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
691; CHECK-NEXT:    tail call void @func(ptr addrspace(1) [[VALUE_PTR]])
692; CHECK-NEXT:    [[X:%.*]] = load float, ptr addrspace(1) [[VALUE_PTR]], align 4
693; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
694; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
695; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
696; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
697; CHECK-NEXT:    ret void
698;
699entry:
700  call void @func(ptr addrspace(1) %value.ptr)
701  %x = load float, ptr addrspace(1) %value.ptr
702  %call = tail call contract float @_Z3sinf(float %x)
703  store float %call, ptr addrspace(1) %sin_out, align 4
704  %call1 = tail call contract float @_Z3cosf(float %x)
705  store float %call1, ptr addrspace(1) %cos_out, align 4
706  ret void
707}
708
709define void @sincos_f32_value_is_same_constexpr(ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
710; CHECK-LABEL: define void @sincos_f32_value_is_same_constexpr
711; CHECK-SAME: (ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
712; CHECK-NEXT:  entry:
713; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
714; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float bitcast (i32 ptrtoint (ptr @func to i32) to float), ptr addrspace(5) [[__SINCOS_]])
715; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
716; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
717; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
718; CHECK-NEXT:    ret void
719;
720entry:
721  %call = tail call contract float @_Z3sinf(float bitcast (i32 ptrtoint (ptr @func to i32) to float))
722  store float %call, ptr addrspace(1) %sin_out, align 4
723  %call1 = tail call contract float @_Z3cosf(float bitcast (i32 ptrtoint (ptr @func to i32) to float))
724  store float %call1, ptr addrspace(1) %cos_out, align 4
725  ret void
726}
727
728define void @sincos_f32_value_is_different_constexpr(ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
729; CHECK-LABEL: define void @sincos_f32_value_is_different_constexpr
730; CHECK-SAME: (ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) #[[ATTR2]] {
731; CHECK-NEXT:  entry:
732; CHECK-NEXT:    [[CALL:%.*]] = tail call contract float @_Z3sinf(float bitcast (i32 ptrtoint (ptr @func to i32) to float))
733; CHECK-NEXT:    store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4
734; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract float @_Z3cosf(float bitcast (i32 ptrtoint (ptr @sincos_f32_value_is_different_constexpr to i32) to float))
735; CHECK-NEXT:    store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4
736; CHECK-NEXT:    ret void
737;
738entry:
739  %call = tail call contract float @_Z3sinf(float bitcast (i32 ptrtoint (ptr @func to i32) to float))
740  store float %call, ptr addrspace(1) %sin_out, align 4
741  %call1 = tail call contract float @_Z3cosf(float bitcast (i32 ptrtoint (ptr @sincos_f32_value_is_different_constexpr to i32) to float))
742  store float %call1, ptr addrspace(1) %cos_out, align 4
743  ret void
744}
745
746define void @sincos_f32_value_is_same_constantfp(ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
747; CHECK-LABEL: define void @sincos_f32_value_is_same_constantfp
748; CHECK-SAME: (ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
749; CHECK-NEXT:  entry:
750; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
751; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float 4.200000e+01, ptr addrspace(5) [[__SINCOS_]])
752; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
753; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
754; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
755; CHECK-NEXT:    ret void
756;
757entry:
758  %call = tail call contract float @_Z3sinf(float 42.0)
759  store float %call, ptr addrspace(1) %sin_out, align 4
760  %call1 = tail call contract float @_Z3cosf(float 42.0)
761  store float %call1, ptr addrspace(1) %cos_out, align 4
762  ret void
763}
764
765define void @sincos_f32_value_is_different_constantfp(ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
766; CHECK-LABEL: define void @sincos_f32_value_is_different_constantfp
767; CHECK-SAME: (ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
768; CHECK-NEXT:  entry:
769; CHECK-NEXT:    [[CALL:%.*]] = tail call contract float @_Z3sinf(float 4.200000e+01)
770; CHECK-NEXT:    store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4
771; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract float @_Z3cosf(float 4.250000e+01)
772; CHECK-NEXT:    store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4
773; CHECK-NEXT:    ret void
774;
775entry:
776  %call = tail call contract float @_Z3sinf(float 42.0)
777  store float %call, ptr addrspace(1) %sin_out, align 4
778  %call1 = tail call contract float @_Z3cosf(float 42.5)
779  store float %call1, ptr addrspace(1) %cos_out, align 4
780  ret void
781}
782
783define void @sincos_f32_different_args(float %x, float %y, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
784; CHECK-LABEL: define void @sincos_f32_different_args
785; CHECK-SAME: (float [[X:%.*]], float [[Y:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR2]] {
786; CHECK-NEXT:  entry:
787; CHECK-NEXT:    [[CALL:%.*]] = tail call contract float @_Z3sinf(float [[X]])
788; CHECK-NEXT:    store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4
789; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract float @_Z3cosf(float [[Y]])
790; CHECK-NEXT:    store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4
791; CHECK-NEXT:    ret void
792;
793entry:
794  %call = tail call contract float @_Z3sinf(float %x)
795  store float %call, ptr addrspace(1) %sin_out, align 4
796  %call1 = tail call contract float @_Z3cosf(float %y)
797  store float %call1, ptr addrspace(1) %cos_out, align 4
798  ret void
799}
800
801define void @sincos_f32_flag_intersect0(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
802; CHECK-LABEL: define void @sincos_f32_flag_intersect0
803; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
804; CHECK-NEXT:  entry:
805; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
806; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
807; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
808; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
809; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
810; CHECK-NEXT:    ret void
811;
812entry:
813  %call = tail call nnan contract float @_Z3sinf(float %x)
814  store float %call, ptr addrspace(1) %sin_out, align 4
815  %call1 = tail call ninf contract float @_Z3cosf(float %x)
816  store float %call1, ptr addrspace(1) %cos_out, align 4
817  ret void
818}
819
820define void @sincos_f32_flag_intersect1(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
821; CHECK-LABEL: define void @sincos_f32_flag_intersect1
822; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
823; CHECK-NEXT:  entry:
824; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
825; CHECK-NEXT:    [[TMP0:%.*]] = call nnan contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
826; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
827; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
828; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
829; CHECK-NEXT:    ret void
830;
831entry:
832  %call = tail call nnan nsz contract float @_Z3sinf(float %x)
833  store float %call, ptr addrspace(1) %sin_out, align 4
834  %call1 = tail call nnan ninf contract float @_Z3cosf(float %x)
835  store float %call1, ptr addrspace(1) %cos_out, align 4
836  ret void
837}
838
839define void @sincos_v2f32_flag_intersect1(<2 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
840; CHECK-LABEL: define void @sincos_v2f32_flag_intersect1
841; CHECK-SAME: (<2 x float> [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 8)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR4]] {
842; CHECK-NEXT:  entry:
843; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca <2 x float>, align 8, addrspace(5)
844; CHECK-NEXT:    [[TMP0:%.*]] = call nnan contract <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])
845; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x float>, ptr addrspace(5) [[__SINCOS_]], align 8
846; CHECK-NEXT:    store <2 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8
847; CHECK-NEXT:    store <2 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8
848; CHECK-NEXT:    ret void
849;
850entry:
851  %call = tail call contract ninf nnan <2 x float> @_Z3sinDv2_f(<2 x float> %x)
852  store <2 x float> %call, ptr addrspace(1) %sin_out, align 8
853  %call1 = tail call contract nsz nnan <2 x float> @_Z3cosDv2_f(<2 x float> %x)
854  store <2 x float> %call1, ptr addrspace(1) %cos_out, align 8
855  ret void
856}
857
858declare void @use_stack_ptrs(ptr addrspace(5), ptr addrspace(5))
859
860define void @sincos_f32_alloca_insertpt(float %x) {
861; CHECK-LABEL: define void @sincos_f32_alloca_insertpt
862; CHECK-SAME: (float [[X:%.*]]) local_unnamed_addr #[[ATTR4]] {
863; CHECK-NEXT:  entry:
864; CHECK-NEXT:    [[ALLOCA0:%.*]] = alloca i32, align 4, addrspace(5)
865; CHECK-NEXT:    [[ALLOCA1:%.*]] = alloca i32, align 4, addrspace(5)
866; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
867; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
868; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
869; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(5) [[ALLOCA0]], align 4
870; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(5) [[ALLOCA1]], align 4
871; CHECK-NEXT:    call void @use_stack_ptrs(ptr addrspace(5) [[ALLOCA0]], ptr addrspace(5) [[ALLOCA1]])
872; CHECK-NEXT:    ret void
873;
874entry:
875  %alloca0 = alloca i32, addrspace(5)
876  %alloca1 = alloca i32, addrspace(5)
877  %sin = tail call contract float @_Z3sinf(float %x)
878  %cos = tail call contract float @_Z3cosf(float %x)
879  store float %sin, ptr addrspace(5) %alloca0
880  store float %cos, ptr addrspace(5) %alloca1
881  call void @use_stack_ptrs(ptr addrspace(5) %alloca0, ptr addrspace(5) %alloca1)
882  ret void
883}
884
885define float @sincos_f32_unused_result_cos(float %x) {
886; CHECK-LABEL: define float @sincos_f32_unused_result_cos
887; CHECK-SAME: (float [[X:%.*]]) local_unnamed_addr #[[ATTR6:[0-9]+]] {
888; CHECK-NEXT:  entry:
889; CHECK-NEXT:    [[SIN:%.*]] = tail call contract float @_Z3sinf(float [[X]])
890; CHECK-NEXT:    ret float [[SIN]]
891;
892entry:
893  %alloca0 = alloca i32, addrspace(5)
894  %alloca1 = alloca i32, addrspace(5)
895  %sin = tail call contract float @_Z3sinf(float %x)
896  %dead = tail call contract float @_Z3cosf(float %x)
897  ret float %sin
898}
899
900define float @sincos_f32_unused_result_sin(float %x) {
901; CHECK-LABEL: define float @sincos_f32_unused_result_sin
902; CHECK-SAME: (float [[X:%.*]]) local_unnamed_addr #[[ATTR6]] {
903; CHECK-NEXT:  entry:
904; CHECK-NEXT:    [[COS:%.*]] = tail call contract float @_Z3cosf(float [[X]])
905; CHECK-NEXT:    ret float [[COS]]
906;
907entry:
908  %alloca0 = alloca i32, addrspace(5)
909  %alloca1 = alloca i32, addrspace(5)
910  %dead = tail call contract float @_Z3sinf(float %x)
911  %cos = tail call contract float @_Z3cosf(float %x)
912  ret float %cos
913}
914
915define void @sincos_f32_repeated_uses(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
916; CHECK-LABEL: define void @sincos_f32_repeated_uses
917; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) [[SIN_OUT:%.*]], ptr addrspace(1) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR7:[0-9]+]] {
918; CHECK-NEXT:  entry:
919; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
920; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
921; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
922; CHECK-NEXT:    store volatile float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
923; CHECK-NEXT:    store volatile float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
924; CHECK-NEXT:    store volatile float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
925; CHECK-NEXT:    store volatile float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
926; CHECK-NEXT:    store volatile float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
927; CHECK-NEXT:    ret void
928;
929entry:
930  %sin0 = tail call contract float @_Z3sinf(float %x)
931  store volatile float %sin0, ptr addrspace(1) %sin_out, align 4
932
933  %sin1 = tail call contract float @_Z3sinf(float %x)
934  store volatile float %sin1, ptr addrspace(1) %sin_out, align 4
935
936  %cos0 = tail call contract float @_Z3cosf(float %x)
937  store volatile float %cos0, ptr addrspace(1) %cos_out, align 4
938
939  %cos1 = tail call contract float @_Z3cosf(float %x)
940  store volatile float %cos1, ptr addrspace(1) %cos_out, align 4
941
942  %sin2 = tail call contract float @_Z3sinf(float %x)
943  store volatile float %sin2, ptr addrspace(1) %sin_out, align 4
944
945  ret void
946}
947
948define void @sin_f32_indirect_call_user(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out, ptr %func.ptr) {
949; CHECK-LABEL: define void @sin_f32_indirect_call_user
950; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]], ptr readonly captures(none) [[FUNC_PTR:%.*]]) local_unnamed_addr #[[ATTR4]] {
951; CHECK-NEXT:  entry:
952; CHECK-NEXT:    [[CALL:%.*]] = tail call contract float @_Z3sinf(float [[X]])
953; CHECK-NEXT:    store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4
954; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract float [[FUNC_PTR]](float [[X]])
955; CHECK-NEXT:    store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4
956; CHECK-NEXT:    ret void
957;
958entry:
959  %call = tail call contract float @_Z3sinf(float %x)
960  store float %call, ptr addrspace(1) %sin_out, align 4
961  %call1 = tail call contract float %func.ptr(float %x)
962  store float %call1, ptr addrspace(1) %cos_out, align 4
963  ret void
964}
965
966define void @cos_f32_indirect_call_user(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out, ptr %func.ptr) {
967; CHECK-LABEL: define void @cos_f32_indirect_call_user
968; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]], ptr readonly captures(none) [[FUNC_PTR:%.*]]) local_unnamed_addr #[[ATTR4]] {
969; CHECK-NEXT:  entry:
970; CHECK-NEXT:    [[CALL:%.*]] = tail call contract float @_Z3cosf(float [[X]])
971; CHECK-NEXT:    store float [[CALL]], ptr addrspace(1) [[COS_OUT]], align 4
972; CHECK-NEXT:    [[CALL1:%.*]] = tail call contract float [[FUNC_PTR]](float [[X]])
973; CHECK-NEXT:    store float [[CALL1]], ptr addrspace(1) [[SIN_OUT]], align 4
974; CHECK-NEXT:    ret void
975;
976entry:
977  %call = tail call contract float @_Z3cosf(float %x)
978  store float %call, ptr addrspace(1) %cos_out, align 4
979  %call1 = tail call contract float %func.ptr(float %x)
980  store float %call1, ptr addrspace(1) %sin_out, align 4
981  ret void
982}
983
984define void @sincos_f32_preserve_fpmath_0(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
985; CHECK-LABEL: define void @sincos_f32_preserve_fpmath_0
986; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
987; CHECK-NEXT:  entry:
988; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
989; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]]), !fpmath [[META5:![0-9]+]]
990; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
991; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
992; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
993; CHECK-NEXT:    ret void
994;
995entry:
996  %call = tail call contract float @_Z3sinf(float %x), !fpmath !5
997  store float %call, ptr addrspace(1) %sin_out, align 4
998  %call1 = tail call contract float @_Z3cosf(float %x), !fpmath !5
999  store float %call1, ptr addrspace(1) %cos_out, align 4
1000  ret void
1001}
1002
1003define void @sincos_f32_preserve_fpmath_1(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
1004; CHECK-LABEL: define void @sincos_f32_preserve_fpmath_1
1005; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1006; CHECK-NEXT:  entry:
1007; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
1008; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]]), !fpmath [[META6:![0-9]+]]
1009; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
1010; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
1011; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
1012; CHECK-NEXT:    ret void
1013;
1014entry:
1015  %call = tail call contract float @_Z3sinf(float %x), !fpmath !5
1016  store float %call, ptr addrspace(1) %sin_out, align 4
1017  %call1 = tail call contract float @_Z3cosf(float %x), !fpmath !6
1018  store float %call1, ptr addrspace(1) %cos_out, align 4
1019  ret void
1020}
1021
1022; Should drop the metadata
1023define void @sincos_f32_drop_fpmath(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {
1024; CHECK-LABEL: define void @sincos_f32_drop_fpmath
1025; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1026; CHECK-NEXT:  entry:
1027; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
1028; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
1029; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
1030; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
1031; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
1032; CHECK-NEXT:    ret void
1033;
1034entry:
1035  %call = tail call contract float @_Z3sinf(float %x), !fpmath !5
1036  store float %call, ptr addrspace(1) %sin_out, align 4
1037  %call1 = tail call contract float @_Z3cosf(float %x)
1038  store float %call1, ptr addrspace(1) %cos_out, align 4
1039  ret void
1040}
1041
1042define void @sincos_f32_debuginfo(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) !dbg !15 {
1043; CHECK-LABEL: define void @sincos_f32_debuginfo
1044; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] !dbg [[DBG7:![0-9]+]] {
1045; CHECK-NEXT:  entry:
1046; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5), !dbg [[DBG14:![0-9]+]]
1047; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]]), !dbg [[DBG14]]
1048; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4, !dbg [[DBG14]]
1049; CHECK-NEXT:      #dbg_value(float [[TMP0]], [[META11:![0-9]+]], !DIExpression(), [[META15:![0-9]+]])
1050; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4, !dbg [[DBG16:![0-9]+]]
1051; CHECK-NEXT:      #dbg_value(float [[TMP1]], [[META13:![0-9]+]], !DIExpression(), [[META17:![0-9]+]])
1052; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4, !dbg [[DBG18:![0-9]+]]
1053; CHECK-NEXT:    ret void, !dbg [[DBG19:![0-9]+]]
1054;
1055entry:
1056  %call = tail call contract float @_Z3sinf(float %x), !dbg !19
1057  call void @llvm.dbg.value(metadata float %call, metadata !17, metadata !DIExpression()), !dbg !19
1058  store float %call, ptr addrspace(1) %sin_out, align 4, !dbg !20
1059  %call1 = tail call contract float @_Z3cosf(float %x), !dbg !21
1060  call void @llvm.dbg.value(metadata float %call1, metadata !18, metadata !DIExpression()), !dbg !21
1061  store float %call1, ptr addrspace(1) %cos_out, align 4, !dbg !22
1062  ret void, !dbg !23
1063}
1064
1065define float @sin_sincos_private_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
1066; CHECK-LABEL: define float @sin_sincos_private_f32
1067; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1068; CHECK-NEXT:  entry:
1069; CHECK-NEXT:    [[COS_TMP:%.*]] = alloca float, align 4, addrspace(5)
1070; CHECK-NEXT:    [[SIN0:%.*]] = tail call nnan ninf nsz contract float @_Z3sinf(float [[X]]), !fpmath [[META5]]
1071; CHECK-NEXT:    store float [[SIN0]], ptr addrspace(1) [[SIN_OUT]], align 4
1072; CHECK-NEXT:    [[SIN1:%.*]] = call nnan contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP]]), !fpmath [[META6]]
1073; CHECK-NEXT:    [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP]], align 4
1074; CHECK-NEXT:    store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 4
1075; CHECK-NEXT:    ret float [[SIN1]]
1076;
1077entry:
1078  %cos.tmp = alloca float, addrspace(5)
1079  %sin0 = tail call nsz ninf nnan contract float @_Z3sinf(float %x), !fpmath !5
1080  store float %sin0, ptr addrspace(1) %sin_out, align 4
1081  %sin1 = call contract nnan float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp), !fpmath !6
1082  %cos1 = load float, ptr addrspace(5) %cos.tmp
1083  store float %cos1, ptr addrspace(1) %cos_out, align 4
1084  ret float %sin1
1085}
1086
1087define float @sin_sincos_generic_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
1088; CHECK-LABEL: define float @sin_sincos_generic_f32
1089; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1090; CHECK-NEXT:  entry:
1091; CHECK-NEXT:    [[COS_TMP:%.*]] = alloca float, align 4, addrspace(5)
1092; CHECK-NEXT:    [[SIN0:%.*]] = tail call nsz contract float @_Z3sinf(float [[X]]), !fpmath [[META5]]
1093; CHECK-NEXT:    store float [[SIN0]], ptr addrspace(1) [[SIN_OUT]], align 4
1094; CHECK-NEXT:    [[COS_TMP_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP]] to ptr
1095; CHECK-NEXT:    [[SIN1:%.*]] = call ninf nsz contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP_CAST]]), !fpmath [[META6]]
1096; CHECK-NEXT:    [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP]], align 4
1097; CHECK-NEXT:    store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 4
1098; CHECK-NEXT:    ret float [[SIN1]]
1099;
1100entry:
1101  %cos.tmp = alloca float, addrspace(5)
1102  %sin0 = tail call nsz contract float @_Z3sinf(float %x), !fpmath !5
1103  store float %sin0, ptr addrspace(1) %sin_out, align 4
1104  %cos.tmp.cast = addrspacecast ptr addrspace(5) %cos.tmp to ptr
1105  %sin1 = call contract nsz ninf float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp.cast), !fpmath !6
1106  %cos1 = load float, ptr addrspace(5) %cos.tmp
1107  store float %cos1, ptr addrspace(1) %cos_out, align 4
1108  ret float %sin1
1109}
1110
1111define float @cos_sincos_private_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
1112; CHECK-LABEL: define float @cos_sincos_private_f32
1113; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) readnone captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1114; CHECK-NEXT:  entry:
1115; CHECK-NEXT:    [[COS_TMP:%.*]] = alloca float, align 4, addrspace(5)
1116; CHECK-NEXT:    [[COS0:%.*]] = tail call contract float @_Z3cosf(float [[X]])
1117; CHECK-NEXT:    store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 4
1118; CHECK-NEXT:    [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP]])
1119; CHECK-NEXT:    [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP]], align 4
1120; CHECK-NEXT:    store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 4
1121; CHECK-NEXT:    ret float [[SIN1]]
1122;
1123entry:
1124  %cos.tmp = alloca float, addrspace(5)
1125  %cos0 = tail call contract float @_Z3cosf(float %x)
1126  store float %cos0, ptr addrspace(1) %cos_out, align 4
1127  %sin1 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp)
1128  %cos1 = load float, ptr addrspace(5) %cos.tmp
1129  store float %cos1, ptr addrspace(1) %cos_out, align 4
1130  ret float %sin1
1131}
1132
1133define float @cos_sincos_generic_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
1134; CHECK-LABEL: define float @cos_sincos_generic_f32
1135; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) readnone captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1136; CHECK-NEXT:  entry:
1137; CHECK-NEXT:    [[COS_TMP:%.*]] = alloca float, align 4, addrspace(5)
1138; CHECK-NEXT:    [[COS0:%.*]] = tail call contract float @_Z3cosf(float [[X]])
1139; CHECK-NEXT:    store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 4
1140; CHECK-NEXT:    [[COS_TMP_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP]] to ptr
1141; CHECK-NEXT:    [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP_CAST]])
1142; CHECK-NEXT:    [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP]], align 4
1143; CHECK-NEXT:    store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 4
1144; CHECK-NEXT:    ret float [[SIN1]]
1145;
1146entry:
1147  %cos.tmp = alloca float, addrspace(5)
1148  %cos0 = tail call contract float @_Z3cosf(float %x)
1149  store float %cos0, ptr addrspace(1) %cos_out, align 4
1150  %cos.tmp.cast = addrspacecast ptr addrspace(5) %cos.tmp to ptr
1151  %sin1 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp.cast)
1152  %cos1 = load float, ptr addrspace(5) %cos.tmp
1153  store float %cos1, ptr addrspace(1) %cos_out, align 4
1154  ret float %sin1
1155}
1156
1157define float @sincos_private_f32_x2(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
1158; CHECK-LABEL: define float @sincos_private_f32_x2
1159; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) readnone captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1160; CHECK-NEXT:  entry:
1161; CHECK-NEXT:    [[COS_TMP0:%.*]] = alloca float, align 4, addrspace(5)
1162; CHECK-NEXT:    [[COS_TMP1:%.*]] = alloca float, align 4, addrspace(5)
1163; CHECK-NEXT:    [[SIN0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP0]])
1164; CHECK-NEXT:    [[COS0:%.*]] = load float, ptr addrspace(5) [[COS_TMP0]], align 4
1165; CHECK-NEXT:    store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 4
1166; CHECK-NEXT:    [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP1]])
1167; CHECK-NEXT:    [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP1]], align 4
1168; CHECK-NEXT:    store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 4
1169; CHECK-NEXT:    ret float [[SIN1]]
1170;
1171entry:
1172  %cos.tmp0 = alloca float, addrspace(5)
1173  %cos.tmp1 = alloca float, addrspace(5)
1174
1175  %sin0 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp0)
1176  %cos0 = load float, ptr addrspace(5) %cos.tmp0
1177  store float %cos0, ptr addrspace(1) %cos_out, align 4
1178
1179  %sin1 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp1)
1180  %cos1 = load float, ptr addrspace(5) %cos.tmp1
1181  store float %cos1, ptr addrspace(1) %cos_out, align 4
1182  ret float %sin1
1183}
1184
1185define float @sincos_generic_f32_x2(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
1186; CHECK-LABEL: define float @sincos_generic_f32_x2
1187; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) readnone captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1188; CHECK-NEXT:  entry:
1189; CHECK-NEXT:    [[COS_TMP0:%.*]] = alloca float, align 4, addrspace(5)
1190; CHECK-NEXT:    [[COS_TMP1:%.*]] = alloca float, align 4, addrspace(5)
1191; CHECK-NEXT:    [[COS_TMP0_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP0]] to ptr
1192; CHECK-NEXT:    [[SIN0:%.*]] = call contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP0_CAST]])
1193; CHECK-NEXT:    [[COS0:%.*]] = load float, ptr addrspace(5) [[COS_TMP0]], align 4
1194; CHECK-NEXT:    store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 4
1195; CHECK-NEXT:    [[COS_TMP1_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP1]] to ptr
1196; CHECK-NEXT:    [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP1_CAST]])
1197; CHECK-NEXT:    store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 4
1198; CHECK-NEXT:    ret float [[SIN1]]
1199;
1200entry:
1201  %cos.tmp0 = alloca float, addrspace(5)
1202  %cos.tmp1 = alloca float, addrspace(5)
1203  %cos.tmp0.cast = addrspacecast ptr addrspace(5) %cos.tmp0 to ptr
1204  %sin0 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp0.cast)
1205  %cos0 = load float, ptr addrspace(5) %cos.tmp0
1206  store float %cos0, ptr addrspace(1) %cos_out, align 4
1207  %cos.tmp1.cast = addrspacecast ptr addrspace(5) %cos.tmp1 to ptr
1208  %sin1 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp1.cast)
1209  %cos1 = load float, ptr addrspace(5) %cos.tmp0
1210  store float %cos1, ptr addrspace(1) %cos_out, align 4
1211  ret float %sin1
1212}
1213
1214define float @sincos_generic_private_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
1215; CHECK-LABEL: define float @sincos_generic_private_f32
1216; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) readnone captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1217; CHECK-NEXT:  entry:
1218; CHECK-NEXT:    [[COS_TMP0:%.*]] = alloca float, align 4, addrspace(5)
1219; CHECK-NEXT:    [[COS_TMP1:%.*]] = alloca float, align 4, addrspace(5)
1220; CHECK-NEXT:    [[SIN0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP0]])
1221; CHECK-NEXT:    [[COS0:%.*]] = load float, ptr addrspace(5) [[COS_TMP0]], align 4
1222; CHECK-NEXT:    store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 4
1223; CHECK-NEXT:    [[COS_TMP1_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP1]] to ptr
1224; CHECK-NEXT:    [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP1_CAST]])
1225; CHECK-NEXT:    store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 4
1226; CHECK-NEXT:    ret float [[SIN1]]
1227;
1228entry:
1229  %cos.tmp0 = alloca float, addrspace(5)
1230  %cos.tmp1 = alloca float, addrspace(5)
1231  %sin0 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp0)
1232  %cos0 = load float, ptr addrspace(5) %cos.tmp0
1233  store float %cos0, ptr addrspace(1) %cos_out, align 4
1234  %cos.tmp1.cast = addrspacecast ptr addrspace(5) %cos.tmp1 to ptr
1235  %sin1 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp1.cast)
1236  %cos1 = load float, ptr addrspace(5) %cos.tmp0
1237  store float %cos1, ptr addrspace(1) %cos_out, align 4
1238  ret float %sin1
1239}
1240
1241define float @sincos_mixed_sin_cos_generic_private_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {
1242; CHECK-LABEL: define float @sincos_mixed_sin_cos_generic_private_f32
1243; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[SIN_OUT:%.*]], ptr addrspace(1) writeonly captures(none) initializes((0, 4)) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR3]] {
1244; CHECK-NEXT:  entry:
1245; CHECK-NEXT:    [[COS_TMP0:%.*]] = alloca float, align 4, addrspace(5)
1246; CHECK-NEXT:    [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)
1247; CHECK-NEXT:    [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])
1248; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4
1249; CHECK-NEXT:    [[SIN0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP0]])
1250; CHECK-NEXT:    store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4
1251; CHECK-NEXT:    store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4
1252; CHECK-NEXT:    [[COS2:%.*]] = load float, ptr addrspace(5) [[COS_TMP0]], align 4
1253; CHECK-NEXT:    store float [[COS2]], ptr addrspace(1) [[COS_OUT]], align 4
1254; CHECK-NEXT:    ret float [[TMP0]]
1255;
1256entry:
1257  %cos.tmp0 = alloca float, addrspace(5)
1258  %cos.tmp1 = alloca float, addrspace(5)
1259  %sin0 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp0)
1260  %sin1 = call contract float @_Z3sinf(float %x)
1261  store float %sin1, ptr addrspace(1) %sin_out
1262  %cos0 = load float, ptr addrspace(5) %cos.tmp0
1263  store float %cos0, ptr addrspace(1) %cos_out, align 4
1264  %cos.tmp1.cast = addrspacecast ptr addrspace(5) %cos.tmp1 to ptr
1265  %cos1 = call contract float @_Z3cosf(float %x)
1266  store float %cos1, ptr addrspace(1) %cos_out, align 4
1267  %sin2 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp1.cast)
1268  %cos2 = load float, ptr addrspace(5) %cos.tmp0
1269  store float %cos2, ptr addrspace(1) %cos_out, align 4
1270  ret float %sin2
1271}
1272
1273declare void @llvm.dbg.value(metadata, metadata, metadata) #0
1274
1275attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
1276attributes #1 = { argmemonly nounwind willreturn }
1277
1278!llvm.dbg.cu = !{!0}
1279!llvm.debugify = !{!2, !3}
1280!llvm.module.flags = !{!4}
1281
1282!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
1283!1 = !DIFile(filename: "/tmp/arst.ll", directory: "/")
1284!2 = !{i32 10}
1285!3 = !{i32 4}
1286!4 = !{i32 2, !"Debug Info Version", i32 3}
1287!5 = !{float 4.000000e+00}
1288!6 = !{float 2.000000e+00}
1289!7 = !DILocation(line: 5, column: 1, scope: !8)
1290!8 = distinct !DISubprogram(name: "sincos_f32_preserve_fpmath_1", linkageName: "sincos_f32_preserve_fpmath_1", scope: null, file: !1, line: 1, type: !9, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11)
1291!9 = !DISubroutineType(types: !10)
1292!10 = !{}
1293!11 = !{!12, !14}
1294!12 = !DILocalVariable(name: "1", scope: !8, file: !1, line: 1, type: !13)
1295!13 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
1296!14 = !DILocalVariable(name: "2", scope: !8, file: !1, line: 3, type: !13)
1297!15 = distinct !DISubprogram(name: "sincos_f32_debuginfo", linkageName: "sincos_f32_debuginfo", scope: null, file: !1, line: 6, type: !9, scopeLine: 6, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !16)
1298!16 = !{!17, !18}
1299!17 = !DILocalVariable(name: "3", scope: !15, file: !1, line: 6, type: !13)
1300!18 = !DILocalVariable(name: "4", scope: !15, file: !1, line: 8, type: !13)
1301!19 = !DILocation(line: 6, column: 1, scope: !15)
1302!20 = !DILocation(line: 7, column: 1, scope: !15)
1303!21 = !DILocation(line: 8, column: 1, scope: !15)
1304!22 = !DILocation(line: 9, column: 1, scope: !15)
1305!23 = !DILocation(line: 10, column: 1, scope: !15)
1306