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