1303 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -O1 -mtriple=amdgcn-- -amdgpu-simplify-libcall=1 -amdgpu-prelink < %s | FileCheck %s3 4declare float @_Z3sinf(float) #05declare float @_Z3cosf(float) #06declare <2 x float> @_Z3sinDv2_f(<2 x float>) #07declare <2 x float> @_Z3cosDv2_f(<2 x float>) #08declare <3 x float> @_Z3sinDv3_f(<3 x float>) #09declare <3 x float> @_Z3cosDv3_f(<3 x float>) #010declare <4 x float> @_Z3sinDv4_f(<4 x float>) #011declare <4 x float> @_Z3cosDv4_f(<4 x float>) #012declare <8 x float> @_Z3sinDv8_f(<8 x float>) #013declare <8 x float> @_Z3cosDv8_f(<8 x float>) #014declare <16 x float> @_Z3sinDv16_f(<16 x float>) #015declare <16 x float> @_Z3cosDv16_f(<16 x float>) #016 17 18declare half @_Z3sinDh(half) #019declare half @_Z3cosDh(half) #020declare <2 x half> @_Z3sinDv2_Dh(<2 x half>) #021declare <2 x half> @_Z3cosDv2_Dh(<2 x half>) #022declare <3 x half> @_Z3sinDv3_Dh(<3 x half>) #023declare <3 x half> @_Z3cosDv3_Dh(<3 x half>) #024declare <4 x half> @_Z3sinDv4_Dh(<4 x half>) #025declare <4 x half> @_Z3cosDv4_Dh(<4 x half>) #026declare <8 x half> @_Z3sinDv8_Dh(<8 x half>) #027declare <8 x half> @_Z3cosDv8_Dh(<8 x half>) #028declare <16 x half> @_Z3sinDv16_Dh(<16 x half>) #029declare <16 x half> @_Z3cosDv16_Dh(<16 x half>) #030 31 32declare double @_Z3sind(double) #033declare double @_Z3cosd(double) #034declare <2 x double> @_Z3sinDv2_d(<2 x double>) #035declare <2 x double> @_Z3cosDv2_d(<2 x double>) #036declare <3 x double> @_Z3sinDv3_d(<3 x double>) #037declare <3 x double> @_Z3cosDv3_d(<3 x double>) #038declare <4 x double> @_Z3sinDv4_d(<4 x double>) #039declare <4 x double> @_Z3cosDv4_d(<4 x double>) #040declare <8 x double> @_Z3sinDv8_d(<8 x double>) #041declare <8 x double> @_Z3cosDv8_d(<8 x double>) #042declare <16 x double> @_Z3sinDv16_d(<16 x double>) #043declare <16 x double> @_Z3cosDv16_d(<16 x double>) #044 45declare float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) writeonly %ptr) #146declare float @_Z6sincosfPU3AS0f(float %x, ptr writeonly %ptr) #147 48define void @sincos_f16_nocontract(half %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {49; CHECK-LABEL: define void @sincos_f16_nocontract50; 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]+]] {51; CHECK-NEXT: entry:52; CHECK-NEXT: [[CALL:%.*]] = tail call half @_Z3sinDh(half [[X]])53; CHECK-NEXT: store half [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 254; CHECK-NEXT: [[CALL1:%.*]] = tail call half @_Z3cosDh(half [[X]])55; CHECK-NEXT: store half [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 256; CHECK-NEXT: ret void57;58entry:59 %call = tail call half @_Z3sinDh(half %x)60 store half %call, ptr addrspace(1) %sin_out, align 261 %call1 = tail call half @_Z3cosDh(half %x)62 store half %call1, ptr addrspace(1) %cos_out, align 263 ret void64}65 66 67define void @sincos_v2f16_nocontract(<2 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {68; CHECK-LABEL: define void @sincos_v2f16_nocontract69; 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]] {70; CHECK-NEXT: entry:71; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x half> @_Z3sinDv2_Dh(<2 x half> [[X]])72; CHECK-NEXT: store <2 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 473; CHECK-NEXT: [[CALL1:%.*]] = tail call <2 x half> @_Z3cosDv2_Dh(<2 x half> [[X]])74; CHECK-NEXT: store <2 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 475; CHECK-NEXT: ret void76;77entry:78 %call = tail call <2 x half> @_Z3sinDv2_Dh(<2 x half> %x)79 store <2 x half> %call, ptr addrspace(1) %sin_out, align 480 %call1 = tail call <2 x half> @_Z3cosDv2_Dh(<2 x half> %x)81 store <2 x half> %call1, ptr addrspace(1) %cos_out, align 482 ret void83}84 85 86define void @sincos_f16(half %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {87; CHECK-LABEL: define void @sincos_f1688; 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]] {89; CHECK-NEXT: entry:90; CHECK-NEXT: [[CALL:%.*]] = tail call contract half @_Z3sinDh(half [[X]])91; CHECK-NEXT: store half [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 292; CHECK-NEXT: [[CALL1:%.*]] = tail call contract half @_Z3cosDh(half [[X]])93; CHECK-NEXT: store half [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 294; CHECK-NEXT: ret void95;96entry:97 %call = tail call contract half @_Z3sinDh(half %x)98 store half %call, ptr addrspace(1) %sin_out, align 299 %call1 = tail call contract half @_Z3cosDh(half %x)100 store half %call1, ptr addrspace(1) %cos_out, align 2101 ret void102}103 104define void @sincos_f16_order1(half %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {105; CHECK-LABEL: define void @sincos_f16_order1106; 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]] {107; CHECK-NEXT: entry:108; CHECK-NEXT: [[CALL1:%.*]] = tail call contract half @_Z3cosDh(half [[X]])109; CHECK-NEXT: store half [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 2110; CHECK-NEXT: [[CALL:%.*]] = tail call contract half @_Z3sinDh(half [[X]])111; CHECK-NEXT: store half [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 2112; CHECK-NEXT: ret void113;114entry:115 %call1 = tail call contract half @_Z3cosDh(half %x)116 store half %call1, ptr addrspace(1) %cos_out, align 2117 %call = tail call contract half @_Z3sinDh(half %x)118 store half %call, ptr addrspace(1) %sin_out, align 2119 ret void120}121 122define void @sincos_v2f16(<2 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {123; CHECK-LABEL: define void @sincos_v2f16124; 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]] {125; CHECK-NEXT: entry:126; CHECK-NEXT: [[CALL:%.*]] = tail call contract <2 x half> @_Z3sinDv2_Dh(<2 x half> [[X]])127; CHECK-NEXT: store <2 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4128; CHECK-NEXT: [[CALL1:%.*]] = tail call contract <2 x half> @_Z3cosDv2_Dh(<2 x half> [[X]])129; CHECK-NEXT: store <2 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4130; CHECK-NEXT: ret void131;132entry:133 %call = tail call contract <2 x half> @_Z3sinDv2_Dh(<2 x half> %x)134 store <2 x half> %call, ptr addrspace(1) %sin_out, align 4135 %call1 = tail call contract <2 x half> @_Z3cosDv2_Dh(<2 x half> %x)136 store <2 x half> %call1, ptr addrspace(1) %cos_out, align 4137 ret void138}139 140define void @sincos_v3f16(<3 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {141; CHECK-LABEL: define void @sincos_v3f16142; 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]] {143; CHECK-NEXT: entry:144; CHECK-NEXT: [[CALL:%.*]] = tail call contract <3 x half> @_Z3sinDv3_Dh(<3 x half> [[X]])145; CHECK-NEXT: [[EXTRACTVEC2:%.*]] = shufflevector <3 x half> [[CALL]], <3 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>146; CHECK-NEXT: store <4 x half> [[EXTRACTVEC2]], ptr addrspace(1) [[SIN_OUT]], align 8147; CHECK-NEXT: [[CALL5:%.*]] = tail call contract <3 x half> @_Z3cosDv3_Dh(<3 x half> [[X]])148; CHECK-NEXT: [[EXTRACTVEC6:%.*]] = shufflevector <3 x half> [[CALL5]], <3 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>149; CHECK-NEXT: store <4 x half> [[EXTRACTVEC6]], ptr addrspace(1) [[COS_OUT]], align 8150; CHECK-NEXT: ret void151;152entry:153 %call = tail call contract <3 x half> @_Z3sinDv3_Dh(<3 x half> %x)154 %extractVec2 = shufflevector <3 x half> %call, <3 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>155 store <4 x half> %extractVec2, ptr addrspace(1) %sin_out, align 8156 %call5 = tail call contract <3 x half> @_Z3cosDv3_Dh(<3 x half> %x)157 %extractVec6 = shufflevector <3 x half> %call5, <3 x half> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>158 store <4 x half> %extractVec6, ptr addrspace(1) %cos_out, align 8159 ret void160}161 162 163define void @sincos_v4f16(<4 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {164; CHECK-LABEL: define void @sincos_v4f16165; 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]] {166; CHECK-NEXT: entry:167; CHECK-NEXT: [[CALL:%.*]] = tail call contract <4 x half> @_Z3sinDv4_Dh(<4 x half> [[X]])168; CHECK-NEXT: store <4 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 8169; CHECK-NEXT: [[CALL1:%.*]] = tail call contract <4 x half> @_Z3cosDv4_Dh(<4 x half> [[X]])170; CHECK-NEXT: store <4 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 8171; CHECK-NEXT: ret void172;173entry:174 %call = tail call contract <4 x half> @_Z3sinDv4_Dh(<4 x half> %x)175 store <4 x half> %call, ptr addrspace(1) %sin_out, align 8176 %call1 = tail call contract <4 x half> @_Z3cosDv4_Dh(<4 x half> %x)177 store <4 x half> %call1, ptr addrspace(1) %cos_out, align 8178 ret void179}180 181define void @sincos_v8f16(<8 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {182; CHECK-LABEL: define void @sincos_v8f16183; 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]] {184; CHECK-NEXT: entry:185; CHECK-NEXT: [[CALL:%.*]] = tail call contract <8 x half> @_Z3sinDv8_Dh(<8 x half> [[X]])186; CHECK-NEXT: store <8 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 16187; CHECK-NEXT: [[CALL1:%.*]] = tail call contract <8 x half> @_Z3cosDv8_Dh(<8 x half> [[X]])188; CHECK-NEXT: store <8 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 16189; CHECK-NEXT: ret void190;191entry:192 %call = tail call contract <8 x half> @_Z3sinDv8_Dh(<8 x half> %x)193 store <8 x half> %call, ptr addrspace(1) %sin_out, align 16194 %call1 = tail call contract <8 x half> @_Z3cosDv8_Dh(<8 x half> %x)195 store <8 x half> %call1, ptr addrspace(1) %cos_out, align 16196 ret void197}198 199 200define void @sincos_v16f16(<16 x half> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {201; CHECK-LABEL: define void @sincos_v16f16202; 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]] {203; CHECK-NEXT: entry:204; CHECK-NEXT: [[CALL:%.*]] = tail call contract <16 x half> @_Z3sinDv16_Dh(<16 x half> [[X]])205; CHECK-NEXT: store <16 x half> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 32206; CHECK-NEXT: [[CALL1:%.*]] = tail call contract <16 x half> @_Z3cosDv16_Dh(<16 x half> [[X]])207; CHECK-NEXT: store <16 x half> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 32208; CHECK-NEXT: ret void209;210entry:211 %call = tail call contract <16 x half> @_Z3sinDv16_Dh(<16 x half> %x)212 store <16 x half> %call, ptr addrspace(1) %sin_out, align 32213 %call1 = tail call contract <16 x half> @_Z3cosDv16_Dh(<16 x half> %x)214 store <16 x half> %call1, ptr addrspace(1) %cos_out, align 32215 ret void216}217 218 219define void @sincos_f32_nocontract(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {220; CHECK-LABEL: define void @sincos_f32_nocontract221; 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]+]] {222; CHECK-NEXT: entry:223; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)224; CHECK-NEXT: [[TMP0:%.*]] = call float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])225; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4226; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4227; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4228; CHECK-NEXT: ret void229;230entry:231 %call = tail call float @_Z3sinf(float %x)232 store float %call, ptr addrspace(1) %sin_out, align 4233 %call1 = tail call float @_Z3cosf(float %x)234 store float %call1, ptr addrspace(1) %cos_out, align 4235 ret void236}237 238 239define void @sincos_v2f32_nocontract(<2 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {240; CHECK-LABEL: define void @sincos_v2f32_nocontract241; 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]+]] {242; CHECK-NEXT: entry:243; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <2 x float>, align 8, addrspace(5)244; CHECK-NEXT: [[TMP0:%.*]] = call <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])245; CHECK-NEXT: [[TMP1:%.*]] = load <2 x float>, ptr addrspace(5) [[__SINCOS_]], align 8246; CHECK-NEXT: store <2 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8247; CHECK-NEXT: store <2 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8248; CHECK-NEXT: ret void249;250entry:251 %call = tail call <2 x float> @_Z3sinDv2_f(<2 x float> %x)252 store <2 x float> %call, ptr addrspace(1) %sin_out, align 8253 %call1 = tail call <2 x float> @_Z3cosDv2_f(<2 x float> %x)254 store <2 x float> %call1, ptr addrspace(1) %cos_out, align 8255 ret void256}257 258 259define void @sincos_f32(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {260; CHECK-LABEL: define void @sincos_f32261; 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]] {262; CHECK-NEXT: entry:263; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)264; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])265; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4266; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4267; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4268; CHECK-NEXT: ret void269;270entry:271 %call = tail call contract float @_Z3sinf(float %x)272 store float %call, ptr addrspace(1) %sin_out, align 4273 %call1 = tail call contract float @_Z3cosf(float %x)274 store float %call1, ptr addrspace(1) %cos_out, align 4275 ret void276}277 278define void @sincos_f32_order1(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {279; CHECK-LABEL: define void @sincos_f32_order1280; 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]] {281; CHECK-NEXT: entry:282; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)283; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])284; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4285; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4286; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4287; CHECK-NEXT: ret void288;289entry:290 %call1 = tail call contract float @_Z3cosf(float %x)291 store float %call1, ptr addrspace(1) %cos_out, align 4292 %call = tail call contract float @_Z3sinf(float %x)293 store float %call, ptr addrspace(1) %sin_out, align 4294 ret void295}296 297define void @sincos_v2f32(<2 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {298; CHECK-LABEL: define void @sincos_v2f32299; 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]] {300; CHECK-NEXT: entry:301; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <2 x float>, align 8, addrspace(5)302; CHECK-NEXT: [[TMP0:%.*]] = call contract <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])303; CHECK-NEXT: [[TMP1:%.*]] = load <2 x float>, ptr addrspace(5) [[__SINCOS_]], align 8304; CHECK-NEXT: store <2 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8305; CHECK-NEXT: store <2 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8306; CHECK-NEXT: ret void307;308entry:309 %call = tail call contract <2 x float> @_Z3sinDv2_f(<2 x float> %x)310 store <2 x float> %call, ptr addrspace(1) %sin_out, align 8311 %call1 = tail call contract <2 x float> @_Z3cosDv2_f(<2 x float> %x)312 store <2 x float> %call1, ptr addrspace(1) %cos_out, align 8313 ret void314}315 316define void @sincos_v3f32(<3 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {317; CHECK-LABEL: define void @sincos_v3f32318; 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]] {319; CHECK-NEXT: entry:320; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <3 x float>, align 16, addrspace(5)321; CHECK-NEXT: [[TMP0:%.*]] = call contract <3 x float> @_Z6sincosDv3_fPU3AS5S_(<3 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])322; CHECK-NEXT: [[TMP1:%.*]] = load <3 x float>, ptr addrspace(5) [[__SINCOS_]], align 16323; CHECK-NEXT: [[EXTRACTVEC2:%.*]] = shufflevector <3 x float> [[TMP0]], <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>324; CHECK-NEXT: store <4 x float> [[EXTRACTVEC2]], ptr addrspace(1) [[SIN_OUT]], align 16325; CHECK-NEXT: [[EXTRACTVEC6:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>326; CHECK-NEXT: store <4 x float> [[EXTRACTVEC6]], ptr addrspace(1) [[COS_OUT]], align 16327; CHECK-NEXT: ret void328;329entry:330 %call = tail call contract <3 x float> @_Z3sinDv3_f(<3 x float> %x)331 %extractVec2 = shufflevector <3 x float> %call, <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>332 store <4 x float> %extractVec2, ptr addrspace(1) %sin_out, align 16333 %call5 = tail call contract <3 x float> @_Z3cosDv3_f(<3 x float> %x)334 %extractVec6 = shufflevector <3 x float> %call5, <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>335 store <4 x float> %extractVec6, ptr addrspace(1) %cos_out, align 16336 ret void337}338 339define void @sincos_v4f32(<4 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {340; CHECK-LABEL: define void @sincos_v4f32341; 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]] {342; CHECK-NEXT: entry:343; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <4 x float>, align 16, addrspace(5)344; CHECK-NEXT: [[TMP0:%.*]] = call contract <4 x float> @_Z6sincosDv4_fPU3AS5S_(<4 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])345; CHECK-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr addrspace(5) [[__SINCOS_]], align 16346; CHECK-NEXT: store <4 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 16347; CHECK-NEXT: store <4 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 16348; CHECK-NEXT: ret void349;350entry:351 %call = tail call contract <4 x float> @_Z3sinDv4_f(<4 x float> %x)352 store <4 x float> %call, ptr addrspace(1) %sin_out, align 16353 %call1 = tail call contract <4 x float> @_Z3cosDv4_f(<4 x float> %x)354 store <4 x float> %call1, ptr addrspace(1) %cos_out, align 16355 ret void356}357 358define void @sincos_v8f32(<8 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {359; CHECK-LABEL: define void @sincos_v8f32360; 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]] {361; CHECK-NEXT: entry:362; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <8 x float>, align 32, addrspace(5)363; CHECK-NEXT: [[TMP0:%.*]] = call contract <8 x float> @_Z6sincosDv8_fPU3AS5S_(<8 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])364; CHECK-NEXT: [[TMP1:%.*]] = load <8 x float>, ptr addrspace(5) [[__SINCOS_]], align 32365; CHECK-NEXT: store <8 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 32366; CHECK-NEXT: store <8 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 32367; CHECK-NEXT: ret void368;369entry:370 %call = tail call contract <8 x float> @_Z3sinDv8_f(<8 x float> %x)371 store <8 x float> %call, ptr addrspace(1) %sin_out, align 32372 %call1 = tail call contract <8 x float> @_Z3cosDv8_f(<8 x float> %x)373 store <8 x float> %call1, ptr addrspace(1) %cos_out, align 32374 ret void375}376 377define void @sincos_v16f32(<16 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {378; CHECK-LABEL: define void @sincos_v16f32379; 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]] {380; CHECK-NEXT: entry:381; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <16 x float>, align 64, addrspace(5)382; CHECK-NEXT: [[TMP0:%.*]] = call contract <16 x float> @_Z6sincosDv16_fPU3AS5S_(<16 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])383; CHECK-NEXT: [[TMP1:%.*]] = load <16 x float>, ptr addrspace(5) [[__SINCOS_]], align 64384; CHECK-NEXT: store <16 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 64385; CHECK-NEXT: store <16 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 64386; CHECK-NEXT: ret void387;388entry:389 %call = tail call contract <16 x float> @_Z3sinDv16_f(<16 x float> %x)390 store <16 x float> %call, ptr addrspace(1) %sin_out, align 64391 %call1 = tail call contract <16 x float> @_Z3cosDv16_f(<16 x float> %x)392 store <16 x float> %call1, ptr addrspace(1) %cos_out, align 64393 ret void394}395 396define void @sincos_f64_nocontract(double %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {397; CHECK-LABEL: define void @sincos_f64_nocontract398; 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]] {399; CHECK-NEXT: entry:400; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca double, align 8, addrspace(5)401; CHECK-NEXT: [[TMP0:%.*]] = call double @_Z6sincosdPU3AS5d(double [[X]], ptr addrspace(5) [[__SINCOS_]])402; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr addrspace(5) [[__SINCOS_]], align 8403; CHECK-NEXT: store double [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8404; CHECK-NEXT: store double [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8405; CHECK-NEXT: ret void406;407entry:408 %call = tail call double @_Z3sind(double %x)409 store double %call, ptr addrspace(1) %sin_out, align 8410 %call1 = tail call double @_Z3cosd(double %x)411 store double %call1, ptr addrspace(1) %cos_out, align 8412 ret void413}414 415 416define void @sincos_v2f64_nocontract(<2 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {417; CHECK-LABEL: define void @sincos_v2f64_nocontract418; 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]] {419; CHECK-NEXT: entry:420; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <2 x double>, align 16, addrspace(5)421; CHECK-NEXT: [[TMP0:%.*]] = call <2 x double> @_Z6sincosDv2_dPU3AS5S_(<2 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])422; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr addrspace(5) [[__SINCOS_]], align 16423; CHECK-NEXT: store <2 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 16424; CHECK-NEXT: store <2 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 16425; CHECK-NEXT: ret void426;427entry:428 %call = tail call <2 x double> @_Z3sinDv2_d(<2 x double> %x)429 store <2 x double> %call, ptr addrspace(1) %sin_out, align 16430 %call1 = tail call <2 x double> @_Z3cosDv2_d(<2 x double> %x)431 store <2 x double> %call1, ptr addrspace(1) %cos_out, align 16432 ret void433}434 435define void @sincos_f64(double %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {436; CHECK-LABEL: define void @sincos_f64437; 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]] {438; CHECK-NEXT: entry:439; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca double, align 8, addrspace(5)440; CHECK-NEXT: [[TMP0:%.*]] = call contract double @_Z6sincosdPU3AS5d(double [[X]], ptr addrspace(5) [[__SINCOS_]])441; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr addrspace(5) [[__SINCOS_]], align 8442; CHECK-NEXT: store double [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8443; CHECK-NEXT: store double [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8444; CHECK-NEXT: ret void445;446entry:447 %call = tail call contract double @_Z3sind(double %x)448 store double %call, ptr addrspace(1) %sin_out, align 8449 %call1 = tail call contract double @_Z3cosd(double %x)450 store double %call1, ptr addrspace(1) %cos_out, align 8451 ret void452}453 454define void @sincos_f64_order1(double %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {455; CHECK-LABEL: define void @sincos_f64_order1456; 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]] {457; CHECK-NEXT: entry:458; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca double, align 8, addrspace(5)459; CHECK-NEXT: [[TMP0:%.*]] = call contract double @_Z6sincosdPU3AS5d(double [[X]], ptr addrspace(5) [[__SINCOS_]])460; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr addrspace(5) [[__SINCOS_]], align 8461; CHECK-NEXT: store double [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8462; CHECK-NEXT: store double [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8463; CHECK-NEXT: ret void464;465entry:466 %call1 = tail call contract double @_Z3cosd(double %x)467 store double %call1, ptr addrspace(1) %cos_out, align 8468 %call = tail call contract double @_Z3sind(double %x)469 store double %call, ptr addrspace(1) %sin_out, align 8470 ret void471}472 473define void @sincos_v2f64(<2 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {474; CHECK-LABEL: define void @sincos_v2f64475; 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]] {476; CHECK-NEXT: entry:477; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <2 x double>, align 16, addrspace(5)478; CHECK-NEXT: [[TMP0:%.*]] = call contract <2 x double> @_Z6sincosDv2_dPU3AS5S_(<2 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])479; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr addrspace(5) [[__SINCOS_]], align 16480; CHECK-NEXT: store <2 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 16481; CHECK-NEXT: store <2 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 16482; CHECK-NEXT: ret void483;484entry:485 %call = tail call contract <2 x double> @_Z3sinDv2_d(<2 x double> %x)486 store <2 x double> %call, ptr addrspace(1) %sin_out, align 16487 %call1 = tail call contract <2 x double> @_Z3cosDv2_d(<2 x double> %x)488 store <2 x double> %call1, ptr addrspace(1) %cos_out, align 16489 ret void490}491 492define void @sincos_v3f64(<3 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {493; CHECK-LABEL: define void @sincos_v3f64494; 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]] {495; CHECK-NEXT: entry:496; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <3 x double>, align 32, addrspace(5)497; CHECK-NEXT: [[TMP0:%.*]] = call contract <3 x double> @_Z6sincosDv3_dPU3AS5S_(<3 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])498; CHECK-NEXT: [[TMP1:%.*]] = load <3 x double>, ptr addrspace(5) [[__SINCOS_]], align 32499; CHECK-NEXT: [[EXTRACTVEC2:%.*]] = shufflevector <3 x double> [[TMP0]], <3 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>500; CHECK-NEXT: store <4 x double> [[EXTRACTVEC2]], ptr addrspace(1) [[SIN_OUT]], align 32501; CHECK-NEXT: [[EXTRACTVEC6:%.*]] = shufflevector <3 x double> [[TMP1]], <3 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>502; CHECK-NEXT: store <4 x double> [[EXTRACTVEC6]], ptr addrspace(1) [[COS_OUT]], align 32503; CHECK-NEXT: ret void504;505entry:506 %call = tail call contract <3 x double> @_Z3sinDv3_d(<3 x double> %x)507 %extractVec2 = shufflevector <3 x double> %call, <3 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>508 store <4 x double> %extractVec2, ptr addrspace(1) %sin_out, align 32509 %call5 = tail call contract <3 x double> @_Z3cosDv3_d(<3 x double> %x)510 %extractVec6 = shufflevector <3 x double> %call5, <3 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>511 store <4 x double> %extractVec6, ptr addrspace(1) %cos_out, align 32512 ret void513}514 515define void @sincos_v4f64(<4 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {516; CHECK-LABEL: define void @sincos_v4f64517; 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]] {518; CHECK-NEXT: entry:519; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <4 x double>, align 32, addrspace(5)520; CHECK-NEXT: [[TMP0:%.*]] = call contract <4 x double> @_Z6sincosDv4_dPU3AS5S_(<4 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])521; CHECK-NEXT: [[TMP1:%.*]] = load <4 x double>, ptr addrspace(5) [[__SINCOS_]], align 32522; CHECK-NEXT: store <4 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 32523; CHECK-NEXT: store <4 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 32524; CHECK-NEXT: ret void525;526entry:527 %call = tail call contract <4 x double> @_Z3sinDv4_d(<4 x double> %x)528 store <4 x double> %call, ptr addrspace(1) %sin_out, align 32529 %call1 = tail call contract <4 x double> @_Z3cosDv4_d(<4 x double> %x)530 store <4 x double> %call1, ptr addrspace(1) %cos_out, align 32531 ret void532}533 534define void @sincos_v8f64(<8 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {535; CHECK-LABEL: define void @sincos_v8f64536; 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]] {537; CHECK-NEXT: entry:538; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <8 x double>, align 64, addrspace(5)539; CHECK-NEXT: [[TMP0:%.*]] = call contract <8 x double> @_Z6sincosDv8_dPU3AS5S_(<8 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])540; CHECK-NEXT: [[TMP1:%.*]] = load <8 x double>, ptr addrspace(5) [[__SINCOS_]], align 64541; CHECK-NEXT: store <8 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 64542; CHECK-NEXT: store <8 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 64543; CHECK-NEXT: ret void544;545entry:546 %call = tail call contract <8 x double> @_Z3sinDv8_d(<8 x double> %x)547 store <8 x double> %call, ptr addrspace(1) %sin_out, align 64548 %call1 = tail call contract <8 x double> @_Z3cosDv8_d(<8 x double> %x)549 store <8 x double> %call1, ptr addrspace(1) %cos_out, align 64550 ret void551}552 553define void @sincos_v16f64(<16 x double> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {554; CHECK-LABEL: define void @sincos_v16f64555; 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]] {556; CHECK-NEXT: entry:557; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <16 x double>, align 128, addrspace(5)558; CHECK-NEXT: [[TMP0:%.*]] = call contract <16 x double> @_Z6sincosDv16_dPU3AS5S_(<16 x double> [[X]], ptr addrspace(5) [[__SINCOS_]])559; CHECK-NEXT: [[TMP1:%.*]] = load <16 x double>, ptr addrspace(5) [[__SINCOS_]], align 128560; CHECK-NEXT: store <16 x double> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 128561; CHECK-NEXT: store <16 x double> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 128562; CHECK-NEXT: ret void563;564entry:565 %call = tail call contract <16 x double> @_Z3sinDv16_d(<16 x double> %x)566 store <16 x double> %call, ptr addrspace(1) %sin_out, align 128567 %call1 = tail call contract <16 x double> @_Z3cosDv16_d(<16 x double> %x)568 store <16 x double> %call1, ptr addrspace(1) %cos_out, align 128569 ret void570}571 572 573 574define void @sincos_f32_different_blocks(i1 %cond, float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {575; CHECK-LABEL: define void @sincos_f32_different_blocks576; 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]] {577; CHECK-NEXT: entry:578; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)579; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])580; CHECK-NEXT: br i1 [[COND]], label [[BB0:%.*]], label [[BB1:%.*]]581; CHECK: common.ret:582; CHECK-NEXT: ret void583; CHECK: bb0:584; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4585; CHECK-NEXT: br label [[COMMON_RET:%.*]]586; CHECK: bb1:587; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4588; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4589; CHECK-NEXT: br label [[COMMON_RET]]590;591entry:592 br i1 %cond, label %bb0, label %bb1593 594bb0:595 %call = tail call contract float @_Z3sinf(float %x)596 store float %call, ptr addrspace(1) %sin_out, align 4597 ret void598 599bb1:600 %call1 = tail call contract float @_Z3cosf(float %x)601 store float %call1, ptr addrspace(1) %cos_out, align 4602 ret void603}604 605; The sin and cos are in different blocks but always execute606define 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) {607; CHECK-LABEL: define void @sincos_f32_different_blocks_dominating_always_execute608; 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]] {609; CHECK-NEXT: entry:610; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)611; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])612; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4613; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4614; CHECK-NEXT: br i1 [[COND]], label [[BB0:%.*]], label [[BB1:%.*]]615; CHECK: bb0:616; CHECK-NEXT: store i32 0, ptr addrspace(1) [[OTHER]], align 4617; CHECK-NEXT: br label [[BB1]]618; CHECK: bb1:619; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4620; CHECK-NEXT: ret void621;622entry:623 %call = tail call contract float @_Z3sinf(float %x)624 store float %call, ptr addrspace(1) %sin_out, align 4625 br i1 %cond, label %bb0, label %bb1626 627bb0:628 store i32 0, ptr addrspace(1) %other629 br label %bb1630 631bb1:632 %call1 = tail call contract float @_Z3cosf(float %x)633 store float %call1, ptr addrspace(1) %cos_out, align 4634 ret void635}636 637; sin dominates cos but cos doesn't always execute.638define 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) {639; CHECK-LABEL: define void @sincos_f32_different_blocks_dominating_conditional_execute640; 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]] {641; CHECK-NEXT: entry:642; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)643; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])644; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4645; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4646; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[COND]], float [[TMP1]], float 0.000000e+00647; CHECK-NEXT: store float [[SPEC_SELECT]], ptr addrspace(1) [[COS_OUT]], align 4648; CHECK-NEXT: ret void649;650entry:651 %call = tail call contract float @_Z3sinf(float %x)652 store float %call, ptr addrspace(1) %sin_out, align 4653 br i1 %cond, label %bb0, label %bb1654 655bb0:656 %call1 = tail call contract float @_Z3cosf(float %x)657 br label %bb1658 659bb1:660 %phi = phi float [%call1, %bb0], [0.0, %entry]661 store float %phi, ptr addrspace(1) %cos_out, align 4662 ret void663}664 665define float @select_sin_or_cos_f32(i1 %cond, float %x) {666; CHECK-LABEL: define float @select_sin_or_cos_f32667; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) local_unnamed_addr #[[ATTR5:[0-9]+]] {668; CHECK-NEXT: entry:669; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)670; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])671; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4672; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[TMP0]], float [[TMP1]]673; CHECK-NEXT: ret float [[SELECT]]674;675entry:676 %sin = tail call contract float @_Z3sinf(float %x)677 %cos = tail call contract float @_Z3cosf(float %x)678 %select = select i1 %cond, float %sin, float %cos679 ret float %select680}681 682declare void @func(ptr addrspace(1))683 684define 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) {685; CHECK-LABEL: define void @sincos_f32_value_is_instr686; 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]] {687; CHECK-NEXT: entry:688; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)689; CHECK-NEXT: tail call void @func(ptr addrspace(1) [[VALUE_PTR]])690; CHECK-NEXT: [[X:%.*]] = load float, ptr addrspace(1) [[VALUE_PTR]], align 4691; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])692; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4693; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4694; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4695; CHECK-NEXT: ret void696;697entry:698 call void @func(ptr addrspace(1) %value.ptr)699 %x = load float, ptr addrspace(1) %value.ptr700 %call = tail call contract float @_Z3sinf(float %x)701 store float %call, ptr addrspace(1) %sin_out, align 4702 %call1 = tail call contract float @_Z3cosf(float %x)703 store float %call1, ptr addrspace(1) %cos_out, align 4704 ret void705}706 707define void @sincos_f32_value_is_same_constexpr(ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {708; CHECK-LABEL: define void @sincos_f32_value_is_same_constexpr709; 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]] {710; CHECK-NEXT: entry:711; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)712; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float bitcast (i32 ptrtoint (ptr @func to i32) to float), ptr addrspace(5) [[__SINCOS_]])713; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4714; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4715; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4716; CHECK-NEXT: ret void717;718entry:719 %call = tail call contract float @_Z3sinf(float bitcast (i32 ptrtoint (ptr @func to i32) to float))720 store float %call, ptr addrspace(1) %sin_out, align 4721 %call1 = tail call contract float @_Z3cosf(float bitcast (i32 ptrtoint (ptr @func to i32) to float))722 store float %call1, ptr addrspace(1) %cos_out, align 4723 ret void724}725 726define void @sincos_f32_value_is_different_constexpr(ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {727; CHECK-LABEL: define void @sincos_f32_value_is_different_constexpr728; 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]] {729; CHECK-NEXT: entry:730; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3sinf(float bitcast (i32 ptrtoint (ptr @func to i32) to float))731; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4732; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float bitcast (i32 ptrtoint (ptr @sincos_f32_value_is_different_constexpr to i32) to float))733; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4734; CHECK-NEXT: ret void735;736entry:737 %call = tail call contract float @_Z3sinf(float bitcast (i32 ptrtoint (ptr @func to i32) to float))738 store float %call, ptr addrspace(1) %sin_out, align 4739 %call1 = tail call contract float @_Z3cosf(float bitcast (i32 ptrtoint (ptr @sincos_f32_value_is_different_constexpr to i32) to float))740 store float %call1, ptr addrspace(1) %cos_out, align 4741 ret void742}743 744define void @sincos_f32_value_is_same_constantfp(ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {745; CHECK-LABEL: define void @sincos_f32_value_is_same_constantfp746; 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]] {747; CHECK-NEXT: entry:748; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3sinf(float 4.200000e+01)749; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4750; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float 4.200000e+01)751; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4752; CHECK-NEXT: ret void753;754entry:755 %call = tail call contract float @_Z3sinf(float 42.0)756 store float %call, ptr addrspace(1) %sin_out, align 4757 %call1 = tail call contract float @_Z3cosf(float 42.0)758 store float %call1, ptr addrspace(1) %cos_out, align 4759 ret void760}761 762define void @sincos_f32_value_is_different_constantfp(ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {763; CHECK-LABEL: define void @sincos_f32_value_is_different_constantfp764; 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]] {765; CHECK-NEXT: entry:766; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3sinf(float 4.200000e+01)767; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4768; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float 4.250000e+01)769; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4770; CHECK-NEXT: ret void771;772entry:773 %call = tail call contract float @_Z3sinf(float 42.0)774 store float %call, ptr addrspace(1) %sin_out, align 4775 %call1 = tail call contract float @_Z3cosf(float 42.5)776 store float %call1, ptr addrspace(1) %cos_out, align 4777 ret void778}779 780define void @sincos_f32_different_args(float %x, float %y, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {781; CHECK-LABEL: define void @sincos_f32_different_args782; 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]] {783; CHECK-NEXT: entry:784; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3sinf(float [[X]])785; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4786; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float [[Y]])787; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4788; CHECK-NEXT: ret void789;790entry:791 %call = tail call contract float @_Z3sinf(float %x)792 store float %call, ptr addrspace(1) %sin_out, align 4793 %call1 = tail call contract float @_Z3cosf(float %y)794 store float %call1, ptr addrspace(1) %cos_out, align 4795 ret void796}797 798define void @sincos_f32_flag_intersect0(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {799; CHECK-LABEL: define void @sincos_f32_flag_intersect0800; 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]] {801; CHECK-NEXT: entry:802; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)803; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])804; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4805; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4806; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4807; CHECK-NEXT: ret void808;809entry:810 %call = tail call nnan contract float @_Z3sinf(float %x)811 store float %call, ptr addrspace(1) %sin_out, align 4812 %call1 = tail call ninf contract float @_Z3cosf(float %x)813 store float %call1, ptr addrspace(1) %cos_out, align 4814 ret void815}816 817define void @sincos_f32_flag_intersect1(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {818; CHECK-LABEL: define void @sincos_f32_flag_intersect1819; 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]] {820; CHECK-NEXT: entry:821; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)822; CHECK-NEXT: [[TMP0:%.*]] = call nnan contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])823; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4824; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4825; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4826; CHECK-NEXT: ret void827;828entry:829 %call = tail call nnan nsz contract float @_Z3sinf(float %x)830 store float %call, ptr addrspace(1) %sin_out, align 4831 %call1 = tail call nnan ninf contract float @_Z3cosf(float %x)832 store float %call1, ptr addrspace(1) %cos_out, align 4833 ret void834}835 836define void @sincos_v2f32_flag_intersect1(<2 x float> %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {837; CHECK-LABEL: define void @sincos_v2f32_flag_intersect1838; 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]] {839; CHECK-NEXT: entry:840; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <2 x float>, align 8, addrspace(5)841; CHECK-NEXT: [[TMP0:%.*]] = call nnan contract <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])842; CHECK-NEXT: [[TMP1:%.*]] = load <2 x float>, ptr addrspace(5) [[__SINCOS_]], align 8843; CHECK-NEXT: store <2 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 8844; CHECK-NEXT: store <2 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 8845; CHECK-NEXT: ret void846;847entry:848 %call = tail call contract ninf nnan <2 x float> @_Z3sinDv2_f(<2 x float> %x)849 store <2 x float> %call, ptr addrspace(1) %sin_out, align 8850 %call1 = tail call contract nsz nnan <2 x float> @_Z3cosDv2_f(<2 x float> %x)851 store <2 x float> %call1, ptr addrspace(1) %cos_out, align 8852 ret void853}854 855declare void @use_stack_ptrs(ptr addrspace(5), ptr addrspace(5))856 857define void @sincos_f32_alloca_insertpt(float %x) {858; CHECK-LABEL: define void @sincos_f32_alloca_insertpt859; CHECK-SAME: (float [[X:%.*]]) local_unnamed_addr #[[ATTR4]] {860; CHECK-NEXT: entry:861; CHECK-NEXT: [[ALLOCA0:%.*]] = alloca i32, align 4, addrspace(5)862; CHECK-NEXT: [[ALLOCA1:%.*]] = alloca i32, align 4, addrspace(5)863; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)864; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])865; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4866; CHECK-NEXT: store float [[TMP0]], ptr addrspace(5) [[ALLOCA0]], align 4867; CHECK-NEXT: store float [[TMP1]], ptr addrspace(5) [[ALLOCA1]], align 4868; CHECK-NEXT: call void @use_stack_ptrs(ptr addrspace(5) [[ALLOCA0]], ptr addrspace(5) [[ALLOCA1]])869; CHECK-NEXT: ret void870;871entry:872 %alloca0 = alloca i32, addrspace(5)873 %alloca1 = alloca i32, addrspace(5)874 %sin = tail call contract float @_Z3sinf(float %x)875 %cos = tail call contract float @_Z3cosf(float %x)876 store float %sin, ptr addrspace(5) %alloca0877 store float %cos, ptr addrspace(5) %alloca1878 call void @use_stack_ptrs(ptr addrspace(5) %alloca0, ptr addrspace(5) %alloca1)879 ret void880}881 882define float @sincos_f32_unused_result_cos(float %x) {883; CHECK-LABEL: define float @sincos_f32_unused_result_cos884; CHECK-SAME: (float [[X:%.*]]) local_unnamed_addr #[[ATTR6:[0-9]+]] {885; CHECK-NEXT: entry:886; CHECK-NEXT: [[SIN:%.*]] = tail call contract float @_Z3sinf(float [[X]])887; CHECK-NEXT: ret float [[SIN]]888;889entry:890 %alloca0 = alloca i32, addrspace(5)891 %alloca1 = alloca i32, addrspace(5)892 %sin = tail call contract float @_Z3sinf(float %x)893 %dead = tail call contract float @_Z3cosf(float %x)894 ret float %sin895}896 897define float @sincos_f32_unused_result_sin(float %x) {898; CHECK-LABEL: define float @sincos_f32_unused_result_sin899; CHECK-SAME: (float [[X:%.*]]) local_unnamed_addr #[[ATTR6]] {900; CHECK-NEXT: entry:901; CHECK-NEXT: [[COS:%.*]] = tail call contract float @_Z3cosf(float [[X]])902; CHECK-NEXT: ret float [[COS]]903;904entry:905 %alloca0 = alloca i32, addrspace(5)906 %alloca1 = alloca i32, addrspace(5)907 %dead = tail call contract float @_Z3sinf(float %x)908 %cos = tail call contract float @_Z3cosf(float %x)909 ret float %cos910}911 912define void @sincos_f32_repeated_uses(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {913; CHECK-LABEL: define void @sincos_f32_repeated_uses914; CHECK-SAME: (float [[X:%.*]], ptr addrspace(1) [[SIN_OUT:%.*]], ptr addrspace(1) [[COS_OUT:%.*]]) local_unnamed_addr #[[ATTR7:[0-9]+]] {915; CHECK-NEXT: entry:916; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)917; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])918; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4919; CHECK-NEXT: store volatile float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4920; CHECK-NEXT: store volatile float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4921; CHECK-NEXT: store volatile float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4922; CHECK-NEXT: store volatile float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4923; CHECK-NEXT: store volatile float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4924; CHECK-NEXT: ret void925;926entry:927 %sin0 = tail call contract float @_Z3sinf(float %x)928 store volatile float %sin0, ptr addrspace(1) %sin_out, align 4929 930 %sin1 = tail call contract float @_Z3sinf(float %x)931 store volatile float %sin1, ptr addrspace(1) %sin_out, align 4932 933 %cos0 = tail call contract float @_Z3cosf(float %x)934 store volatile float %cos0, ptr addrspace(1) %cos_out, align 4935 936 %cos1 = tail call contract float @_Z3cosf(float %x)937 store volatile float %cos1, ptr addrspace(1) %cos_out, align 4938 939 %sin2 = tail call contract float @_Z3sinf(float %x)940 store volatile float %sin2, ptr addrspace(1) %sin_out, align 4941 942 ret void943}944 945define 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) {946; CHECK-LABEL: define void @sin_f32_indirect_call_user947; 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]] {948; CHECK-NEXT: entry:949; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3sinf(float [[X]])950; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4951; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float [[FUNC_PTR]](float [[X]])952; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4953; CHECK-NEXT: ret void954;955entry:956 %call = tail call contract float @_Z3sinf(float %x)957 store float %call, ptr addrspace(1) %sin_out, align 4958 %call1 = tail call contract float %func.ptr(float %x)959 store float %call1, ptr addrspace(1) %cos_out, align 4960 ret void961}962 963define 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) {964; CHECK-LABEL: define void @cos_f32_indirect_call_user965; 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]] {966; CHECK-NEXT: entry:967; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3cosf(float [[X]])968; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[COS_OUT]], align 4969; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float [[FUNC_PTR]](float [[X]])970; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[SIN_OUT]], align 4971; CHECK-NEXT: ret void972;973entry:974 %call = tail call contract float @_Z3cosf(float %x)975 store float %call, ptr addrspace(1) %cos_out, align 4976 %call1 = tail call contract float %func.ptr(float %x)977 store float %call1, ptr addrspace(1) %sin_out, align 4978 ret void979}980 981define void @sincos_f32_preserve_fpmath_0(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {982; CHECK-LABEL: define void @sincos_f32_preserve_fpmath_0983; 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]] {984; CHECK-NEXT: entry:985; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)986; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]]), !fpmath [[META5:![0-9]+]]987; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4988; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4989; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4990; CHECK-NEXT: ret void991;992entry:993 %call = tail call contract float @_Z3sinf(float %x), !fpmath !5994 store float %call, ptr addrspace(1) %sin_out, align 4995 %call1 = tail call contract float @_Z3cosf(float %x), !fpmath !5996 store float %call1, ptr addrspace(1) %cos_out, align 4997 ret void998}999 1000define void @sincos_f32_preserve_fpmath_1(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {1001; CHECK-LABEL: define void @sincos_f32_preserve_fpmath_11002; 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]] {1003; CHECK-NEXT: entry:1004; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)1005; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]]), !fpmath [[META6:![0-9]+]]1006; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 41007; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 41008; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 41009; CHECK-NEXT: ret void1010;1011entry:1012 %call = tail call contract float @_Z3sinf(float %x), !fpmath !51013 store float %call, ptr addrspace(1) %sin_out, align 41014 %call1 = tail call contract float @_Z3cosf(float %x), !fpmath !61015 store float %call1, ptr addrspace(1) %cos_out, align 41016 ret void1017}1018 1019; Should drop the metadata1020define void @sincos_f32_drop_fpmath(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) {1021; CHECK-LABEL: define void @sincos_f32_drop_fpmath1022; 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]] {1023; CHECK-NEXT: entry:1024; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)1025; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])1026; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 41027; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 41028; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 41029; CHECK-NEXT: ret void1030;1031entry:1032 %call = tail call contract float @_Z3sinf(float %x), !fpmath !51033 store float %call, ptr addrspace(1) %sin_out, align 41034 %call1 = tail call contract float @_Z3cosf(float %x)1035 store float %call1, ptr addrspace(1) %cos_out, align 41036 ret void1037}1038 1039define void @sincos_f32_debuginfo(float %x, ptr addrspace(1) nocapture writeonly %sin_out, ptr addrspace(1) nocapture writeonly %cos_out) !dbg !15 {1040; CHECK-LABEL: define void @sincos_f32_debuginfo1041; 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]+]] {1042; CHECK-NEXT: entry:1043; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5), !dbg [[DBG14:![0-9]+]]1044; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]]), !dbg [[DBG14]]1045; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 4, !dbg [[DBG14]]1046; CHECK-NEXT: #dbg_value(float [[TMP0]], [[META11:![0-9]+]], !DIExpression(), [[META15:![0-9]+]])1047; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 4, !dbg [[DBG16:![0-9]+]]1048; CHECK-NEXT: #dbg_value(float [[TMP1]], [[META13:![0-9]+]], !DIExpression(), [[META17:![0-9]+]])1049; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 4, !dbg [[DBG18:![0-9]+]]1050; CHECK-NEXT: ret void, !dbg [[DBG19:![0-9]+]]1051;1052entry:1053 %call = tail call contract float @_Z3sinf(float %x), !dbg !191054 call void @llvm.dbg.value(metadata float %call, metadata !17, metadata !DIExpression()), !dbg !191055 store float %call, ptr addrspace(1) %sin_out, align 4, !dbg !201056 %call1 = tail call contract float @_Z3cosf(float %x), !dbg !211057 call void @llvm.dbg.value(metadata float %call1, metadata !18, metadata !DIExpression()), !dbg !211058 store float %call1, ptr addrspace(1) %cos_out, align 4, !dbg !221059 ret void, !dbg !231060}1061 1062define float @sin_sincos_private_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {1063; CHECK-LABEL: define float @sin_sincos_private_f321064; 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]] {1065; CHECK-NEXT: entry:1066; CHECK-NEXT: [[COS_TMP:%.*]] = alloca float, align 4, addrspace(5)1067; CHECK-NEXT: [[SIN0:%.*]] = tail call nnan ninf nsz contract float @_Z3sinf(float [[X]]), !fpmath [[META5]]1068; CHECK-NEXT: store float [[SIN0]], ptr addrspace(1) [[SIN_OUT]], align 41069; CHECK-NEXT: [[SIN1:%.*]] = call nnan contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP]]), !fpmath [[META6]]1070; CHECK-NEXT: [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP]], align 41071; CHECK-NEXT: store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 41072; CHECK-NEXT: ret float [[SIN1]]1073;1074entry:1075 %cos.tmp = alloca float, addrspace(5)1076 %sin0 = tail call nsz ninf nnan contract float @_Z3sinf(float %x), !fpmath !51077 store float %sin0, ptr addrspace(1) %sin_out, align 41078 %sin1 = call contract nnan float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp), !fpmath !61079 %cos1 = load float, ptr addrspace(5) %cos.tmp1080 store float %cos1, ptr addrspace(1) %cos_out, align 41081 ret float %sin11082}1083 1084define float @sin_sincos_generic_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {1085; CHECK-LABEL: define float @sin_sincos_generic_f321086; 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]] {1087; CHECK-NEXT: entry:1088; CHECK-NEXT: [[COS_TMP:%.*]] = alloca float, align 4, addrspace(5)1089; CHECK-NEXT: [[SIN0:%.*]] = tail call nsz contract float @_Z3sinf(float [[X]]), !fpmath [[META5]]1090; CHECK-NEXT: store float [[SIN0]], ptr addrspace(1) [[SIN_OUT]], align 41091; CHECK-NEXT: [[COS_TMP_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP]] to ptr1092; CHECK-NEXT: [[SIN1:%.*]] = call ninf nsz contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP_CAST]]), !fpmath [[META6]]1093; CHECK-NEXT: [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP]], align 41094; CHECK-NEXT: store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 41095; CHECK-NEXT: ret float [[SIN1]]1096;1097entry:1098 %cos.tmp = alloca float, addrspace(5)1099 %sin0 = tail call nsz contract float @_Z3sinf(float %x), !fpmath !51100 store float %sin0, ptr addrspace(1) %sin_out, align 41101 %cos.tmp.cast = addrspacecast ptr addrspace(5) %cos.tmp to ptr1102 %sin1 = call contract nsz ninf float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp.cast), !fpmath !61103 %cos1 = load float, ptr addrspace(5) %cos.tmp1104 store float %cos1, ptr addrspace(1) %cos_out, align 41105 ret float %sin11106}1107 1108define float @cos_sincos_private_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {1109; CHECK-LABEL: define float @cos_sincos_private_f321110; 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]] {1111; CHECK-NEXT: entry:1112; CHECK-NEXT: [[COS_TMP:%.*]] = alloca float, align 4, addrspace(5)1113; CHECK-NEXT: [[COS0:%.*]] = tail call contract float @_Z3cosf(float [[X]])1114; CHECK-NEXT: store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 41115; CHECK-NEXT: [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP]])1116; CHECK-NEXT: [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP]], align 41117; CHECK-NEXT: store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 41118; CHECK-NEXT: ret float [[SIN1]]1119;1120entry:1121 %cos.tmp = alloca float, addrspace(5)1122 %cos0 = tail call contract float @_Z3cosf(float %x)1123 store float %cos0, ptr addrspace(1) %cos_out, align 41124 %sin1 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp)1125 %cos1 = load float, ptr addrspace(5) %cos.tmp1126 store float %cos1, ptr addrspace(1) %cos_out, align 41127 ret float %sin11128}1129 1130define float @cos_sincos_generic_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {1131; CHECK-LABEL: define float @cos_sincos_generic_f321132; 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]] {1133; CHECK-NEXT: entry:1134; CHECK-NEXT: [[COS_TMP:%.*]] = alloca float, align 4, addrspace(5)1135; CHECK-NEXT: [[COS0:%.*]] = tail call contract float @_Z3cosf(float [[X]])1136; CHECK-NEXT: store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 41137; CHECK-NEXT: [[COS_TMP_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP]] to ptr1138; CHECK-NEXT: [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP_CAST]])1139; CHECK-NEXT: [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP]], align 41140; CHECK-NEXT: store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 41141; CHECK-NEXT: ret float [[SIN1]]1142;1143entry:1144 %cos.tmp = alloca float, addrspace(5)1145 %cos0 = tail call contract float @_Z3cosf(float %x)1146 store float %cos0, ptr addrspace(1) %cos_out, align 41147 %cos.tmp.cast = addrspacecast ptr addrspace(5) %cos.tmp to ptr1148 %sin1 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp.cast)1149 %cos1 = load float, ptr addrspace(5) %cos.tmp1150 store float %cos1, ptr addrspace(1) %cos_out, align 41151 ret float %sin11152}1153 1154define float @sincos_private_f32_x2(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {1155; CHECK-LABEL: define float @sincos_private_f32_x21156; 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]] {1157; CHECK-NEXT: entry:1158; CHECK-NEXT: [[COS_TMP0:%.*]] = alloca float, align 4, addrspace(5)1159; CHECK-NEXT: [[COS_TMP1:%.*]] = alloca float, align 4, addrspace(5)1160; CHECK-NEXT: [[SIN0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP0]])1161; CHECK-NEXT: [[COS0:%.*]] = load float, ptr addrspace(5) [[COS_TMP0]], align 41162; CHECK-NEXT: store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 41163; CHECK-NEXT: [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP1]])1164; CHECK-NEXT: [[COS1:%.*]] = load float, ptr addrspace(5) [[COS_TMP1]], align 41165; CHECK-NEXT: store float [[COS1]], ptr addrspace(1) [[COS_OUT]], align 41166; CHECK-NEXT: ret float [[SIN1]]1167;1168entry:1169 %cos.tmp0 = alloca float, addrspace(5)1170 %cos.tmp1 = alloca float, addrspace(5)1171 1172 %sin0 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp0)1173 %cos0 = load float, ptr addrspace(5) %cos.tmp01174 store float %cos0, ptr addrspace(1) %cos_out, align 41175 1176 %sin1 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp1)1177 %cos1 = load float, ptr addrspace(5) %cos.tmp11178 store float %cos1, ptr addrspace(1) %cos_out, align 41179 ret float %sin11180}1181 1182define float @sincos_generic_f32_x2(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {1183; CHECK-LABEL: define float @sincos_generic_f32_x21184; 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]] {1185; CHECK-NEXT: entry:1186; CHECK-NEXT: [[COS_TMP0:%.*]] = alloca float, align 4, addrspace(5)1187; CHECK-NEXT: [[COS_TMP1:%.*]] = alloca float, align 4, addrspace(5)1188; CHECK-NEXT: [[COS_TMP0_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP0]] to ptr1189; CHECK-NEXT: [[SIN0:%.*]] = call contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP0_CAST]])1190; CHECK-NEXT: [[COS0:%.*]] = load float, ptr addrspace(5) [[COS_TMP0]], align 41191; CHECK-NEXT: store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 41192; CHECK-NEXT: [[COS_TMP1_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP1]] to ptr1193; CHECK-NEXT: [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP1_CAST]])1194; CHECK-NEXT: store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 41195; CHECK-NEXT: ret float [[SIN1]]1196;1197entry:1198 %cos.tmp0 = alloca float, addrspace(5)1199 %cos.tmp1 = alloca float, addrspace(5)1200 %cos.tmp0.cast = addrspacecast ptr addrspace(5) %cos.tmp0 to ptr1201 %sin0 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp0.cast)1202 %cos0 = load float, ptr addrspace(5) %cos.tmp01203 store float %cos0, ptr addrspace(1) %cos_out, align 41204 %cos.tmp1.cast = addrspacecast ptr addrspace(5) %cos.tmp1 to ptr1205 %sin1 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp1.cast)1206 %cos1 = load float, ptr addrspace(5) %cos.tmp01207 store float %cos1, ptr addrspace(1) %cos_out, align 41208 ret float %sin11209}1210 1211define float @sincos_generic_private_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {1212; CHECK-LABEL: define float @sincos_generic_private_f321213; 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]] {1214; CHECK-NEXT: entry:1215; CHECK-NEXT: [[COS_TMP0:%.*]] = alloca float, align 4, addrspace(5)1216; CHECK-NEXT: [[COS_TMP1:%.*]] = alloca float, align 4, addrspace(5)1217; CHECK-NEXT: [[SIN0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP0]])1218; CHECK-NEXT: [[COS0:%.*]] = load float, ptr addrspace(5) [[COS_TMP0]], align 41219; CHECK-NEXT: store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 41220; CHECK-NEXT: [[COS_TMP1_CAST:%.*]] = addrspacecast ptr addrspace(5) [[COS_TMP1]] to ptr1221; CHECK-NEXT: [[SIN1:%.*]] = call contract float @_Z6sincosfPU3AS0f(float [[X]], ptr [[COS_TMP1_CAST]])1222; CHECK-NEXT: store float [[COS0]], ptr addrspace(1) [[COS_OUT]], align 41223; CHECK-NEXT: ret float [[SIN1]]1224;1225entry:1226 %cos.tmp0 = alloca float, addrspace(5)1227 %cos.tmp1 = alloca float, addrspace(5)1228 %sin0 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp0)1229 %cos0 = load float, ptr addrspace(5) %cos.tmp01230 store float %cos0, ptr addrspace(1) %cos_out, align 41231 %cos.tmp1.cast = addrspacecast ptr addrspace(5) %cos.tmp1 to ptr1232 %sin1 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp1.cast)1233 %cos1 = load float, ptr addrspace(5) %cos.tmp01234 store float %cos1, ptr addrspace(1) %cos_out, align 41235 ret float %sin11236}1237 1238define float @sincos_mixed_sin_cos_generic_private_f32(float %x, ptr addrspace(1) %sin_out, ptr addrspace(1) %cos_out) {1239; CHECK-LABEL: define float @sincos_mixed_sin_cos_generic_private_f321240; 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]] {1241; CHECK-NEXT: entry:1242; CHECK-NEXT: [[COS_TMP0:%.*]] = alloca float, align 4, addrspace(5)1243; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)1244; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])1245; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 41246; CHECK-NEXT: [[SIN0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[COS_TMP0]])1247; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 41248; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 41249; CHECK-NEXT: [[COS2:%.*]] = load float, ptr addrspace(5) [[COS_TMP0]], align 41250; CHECK-NEXT: store float [[COS2]], ptr addrspace(1) [[COS_OUT]], align 41251; CHECK-NEXT: ret float [[TMP0]]1252;1253entry:1254 %cos.tmp0 = alloca float, addrspace(5)1255 %cos.tmp1 = alloca float, addrspace(5)1256 %sin0 = call contract float @_Z6sincosfPU3AS5f(float %x, ptr addrspace(5) %cos.tmp0)1257 %sin1 = call contract float @_Z3sinf(float %x)1258 store float %sin1, ptr addrspace(1) %sin_out1259 %cos0 = load float, ptr addrspace(5) %cos.tmp01260 store float %cos0, ptr addrspace(1) %cos_out, align 41261 %cos.tmp1.cast = addrspacecast ptr addrspace(5) %cos.tmp1 to ptr1262 %cos1 = call contract float @_Z3cosf(float %x)1263 store float %cos1, ptr addrspace(1) %cos_out, align 41264 %sin2 = call contract float @_Z6sincosfPU3AS0f(float %x, ptr %cos.tmp1.cast)1265 %cos2 = load float, ptr addrspace(5) %cos.tmp01266 store float %cos2, ptr addrspace(1) %cos_out, align 41267 ret float %sin21268}1269 1270declare void @llvm.dbg.value(metadata, metadata, metadata) #01271 1272attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }1273attributes #1 = { argmemonly nounwind willreturn }1274 1275!llvm.dbg.cu = !{!0}1276!llvm.debugify = !{!2, !3}1277!llvm.module.flags = !{!4}1278 1279!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)1280!1 = !DIFile(filename: "/tmp/arst.ll", directory: "/")1281!2 = !{i32 10}1282!3 = !{i32 4}1283!4 = !{i32 2, !"Debug Info Version", i32 3}1284!5 = !{float 4.000000e+00}1285!6 = !{float 2.000000e+00}1286!7 = !DILocation(line: 5, column: 1, scope: !8)1287!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)1288!9 = !DISubroutineType(types: !10)1289!10 = !{}1290!11 = !{!12, !14}1291!12 = !DILocalVariable(name: "1", scope: !8, file: !1, line: 1, type: !13)1292!13 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)1293!14 = !DILocalVariable(name: "2", scope: !8, file: !1, line: 3, type: !13)1294!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)1295!16 = !{!17, !18}1296!17 = !DILocalVariable(name: "3", scope: !15, file: !1, line: 6, type: !13)1297!18 = !DILocalVariable(name: "4", scope: !15, file: !1, line: 8, type: !13)1298!19 = !DILocation(line: 6, column: 1, scope: !15)1299!20 = !DILocation(line: 7, column: 1, scope: !15)1300!21 = !DILocation(line: 8, column: 1, scope: !15)1301!22 = !DILocation(line: 9, column: 1, scope: !15)1302!23 = !DILocation(line: 10, column: 1, scope: !15)1303