170 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals --version 22; RUN: opt -S -mtriple=amdgcn-- -passes=amdgpu-simplifylib -amdgpu-prelink < %s | FileCheck %s3 4declare float @_Z3sinf(float noundef)5declare float @_Z3cosf(float noundef)6declare <2 x float> @_Z3sinDv2_f(<2 x float> noundef)7declare <2 x float> @_Z3cosDv2_f(<2 x float> noundef)8 9define void @sincos_f32_nobuiltin(float noundef %x, ptr addrspace(1) nocapture noundef writeonly %sin_out, ptr addrspace(1) nocapture noundef writeonly %cos_out) #0 {10; CHECK: Function Attrs: nobuiltin11; CHECK-LABEL: define void @sincos_f32_nobuiltin12; CHECK-SAME: (float noundef [[X:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[COS_OUT:%.*]]) #[[ATTR0:[0-9]+]] {13; CHECK-NEXT: entry:14; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)15; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])16; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 417; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 418; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float noundef [[X]])19; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 420; CHECK-NEXT: ret void21;22entry:23 %call = tail call contract float @_Z3sinf(float noundef %x)24 store float %call, ptr addrspace(1) %sin_out, align 425 %call1 = tail call contract float @_Z3cosf(float noundef %x)26 store float %call1, ptr addrspace(1) %cos_out, align 427 ret void28}29 30define void @sincos_v2f32_nobuiltin(<2 x float> noundef %x, ptr addrspace(1) nocapture noundef writeonly %sin_out, ptr addrspace(1) nocapture noundef writeonly %cos_out) #0 {31; CHECK: Function Attrs: nobuiltin32; CHECK-LABEL: define void @sincos_v2f32_nobuiltin33; CHECK-SAME: (<2 x float> noundef [[X:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[COS_OUT:%.*]]) #[[ATTR0]] {34; CHECK-NEXT: entry:35; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <2 x float>, align 8, addrspace(5)36; CHECK-NEXT: [[TMP0:%.*]] = call contract <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])37; CHECK-NEXT: [[TMP1:%.*]] = load <2 x float>, ptr addrspace(5) [[__SINCOS_]], align 838; CHECK-NEXT: store <2 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 839; CHECK-NEXT: [[CALL1:%.*]] = tail call contract <2 x float> @_Z3cosDv2_f(<2 x float> noundef [[X]])40; CHECK-NEXT: store <2 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 841; CHECK-NEXT: ret void42;43entry:44 %call = tail call contract <2 x float> @_Z3sinDv2_f(<2 x float> noundef %x)45 store <2 x float> %call, ptr addrspace(1) %sin_out, align 846 %call1 = tail call contract <2 x float> @_Z3cosDv2_f(<2 x float> noundef %x)47 store <2 x float> %call1, ptr addrspace(1) %cos_out, align 848 ret void49}50 51define void @sincos_f32_no_builtins(float noundef %x, ptr addrspace(1) nocapture noundef writeonly %sin_out, ptr addrspace(1) nocapture noundef writeonly %cos_out) #1 {52; CHECK-LABEL: define void @sincos_f32_no_builtins53; CHECK-SAME: (float noundef [[X:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[COS_OUT:%.*]]) #[[ATTR1:[0-9]+]] {54; CHECK-NEXT: entry:55; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca float, align 4, addrspace(5)56; CHECK-NEXT: [[TMP0:%.*]] = call contract float @_Z6sincosfPU3AS5f(float [[X]], ptr addrspace(5) [[__SINCOS_]])57; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr addrspace(5) [[__SINCOS_]], align 458; CHECK-NEXT: store float [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 459; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float noundef [[X]])60; CHECK-NEXT: store float [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 461; CHECK-NEXT: ret void62;63entry:64 %call = tail call contract float @_Z3sinf(float noundef %x)65 store float %call, ptr addrspace(1) %sin_out, align 466 %call1 = tail call contract float @_Z3cosf(float noundef %x)67 store float %call1, ptr addrspace(1) %cos_out, align 468 ret void69}70 71define void @sincos_v2f32_no_builtins(<2 x float> noundef %x, ptr addrspace(1) nocapture noundef writeonly %sin_out, ptr addrspace(1) nocapture noundef writeonly %cos_out) #1 {72; CHECK-LABEL: define void @sincos_v2f32_no_builtins73; CHECK-SAME: (<2 x float> noundef [[X:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[COS_OUT:%.*]]) #[[ATTR1]] {74; CHECK-NEXT: entry:75; CHECK-NEXT: [[__SINCOS_:%.*]] = alloca <2 x float>, align 8, addrspace(5)76; CHECK-NEXT: [[TMP0:%.*]] = call contract <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> [[X]], ptr addrspace(5) [[__SINCOS_]])77; CHECK-NEXT: [[TMP1:%.*]] = load <2 x float>, ptr addrspace(5) [[__SINCOS_]], align 878; CHECK-NEXT: store <2 x float> [[TMP0]], ptr addrspace(1) [[SIN_OUT]], align 879; CHECK-NEXT: [[CALL1:%.*]] = tail call contract <2 x float> @_Z3cosDv2_f(<2 x float> noundef [[X]])80; CHECK-NEXT: store <2 x float> [[TMP1]], ptr addrspace(1) [[COS_OUT]], align 881; CHECK-NEXT: ret void82;83entry:84 %call = tail call contract <2 x float> @_Z3sinDv2_f(<2 x float> noundef %x)85 store <2 x float> %call, ptr addrspace(1) %sin_out, align 886 %call1 = tail call contract <2 x float> @_Z3cosDv2_f(<2 x float> noundef %x)87 store <2 x float> %call1, ptr addrspace(1) %cos_out, align 888 ret void89}90 91define void @sincos_f32_nobuiltin_callsite(float noundef %x, ptr addrspace(1) nocapture noundef writeonly %sin_out, ptr addrspace(1) nocapture noundef writeonly %cos_out) {92; CHECK-LABEL: define void @sincos_f32_nobuiltin_callsite93; CHECK-SAME: (float noundef [[X:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[COS_OUT:%.*]]) {94; CHECK-NEXT: entry:95; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3sinf(float noundef [[X]]) #[[ATTR0]]96; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 497; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float noundef [[X]]) #[[ATTR0]]98; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 499; CHECK-NEXT: ret void100;101entry:102 %call = tail call contract float @_Z3sinf(float noundef %x) #0103 store float %call, ptr addrspace(1) %sin_out, align 4104 %call1 = tail call contract float @_Z3cosf(float noundef %x) #0105 store float %call1, ptr addrspace(1) %cos_out, align 4106 ret void107}108 109define void @sincos_f32_nobuiltin_callsite0(float noundef %x, ptr addrspace(1) nocapture noundef writeonly %sin_out, ptr addrspace(1) nocapture noundef writeonly %cos_out) {110; CHECK-LABEL: define void @sincos_f32_nobuiltin_callsite0111; CHECK-SAME: (float noundef [[X:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[COS_OUT:%.*]]) {112; CHECK-NEXT: entry:113; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3sinf(float noundef [[X]]) #[[ATTR0]]114; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4115; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float noundef [[X]])116; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4117; CHECK-NEXT: ret void118;119entry:120 %call = tail call contract float @_Z3sinf(float noundef %x) #0121 store float %call, ptr addrspace(1) %sin_out, align 4122 %call1 = tail call contract float @_Z3cosf(float noundef %x)123 store float %call1, ptr addrspace(1) %cos_out, align 4124 ret void125}126 127define void @sincos_f32_nobuiltin_callsite1(float noundef %x, ptr addrspace(1) nocapture noundef writeonly %sin_out, ptr addrspace(1) nocapture noundef writeonly %cos_out) {128; CHECK-LABEL: define void @sincos_f32_nobuiltin_callsite1129; CHECK-SAME: (float noundef [[X:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[COS_OUT:%.*]]) {130; CHECK-NEXT: entry:131; CHECK-NEXT: [[CALL:%.*]] = tail call contract float @_Z3sinf(float noundef [[X]])132; CHECK-NEXT: store float [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 4133; CHECK-NEXT: [[CALL1:%.*]] = tail call contract float @_Z3cosf(float noundef [[X]]) #[[ATTR0]]134; CHECK-NEXT: store float [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 4135; CHECK-NEXT: ret void136;137entry:138 %call = tail call contract float @_Z3sinf(float noundef %x)139 store float %call, ptr addrspace(1) %sin_out, align 4140 %call1 = tail call contract float @_Z3cosf(float noundef %x) #0141 store float %call1, ptr addrspace(1) %cos_out, align 4142 ret void143}144 145define void @sincos_v2f32_nobuiltin_callsite(<2 x float> noundef %x, ptr addrspace(1) nocapture noundef writeonly %sin_out, ptr addrspace(1) nocapture noundef writeonly %cos_out) {146; CHECK-LABEL: define void @sincos_v2f32_nobuiltin_callsite147; CHECK-SAME: (<2 x float> noundef [[X:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[SIN_OUT:%.*]], ptr addrspace(1) noundef writeonly captures(none) [[COS_OUT:%.*]]) {148; CHECK-NEXT: entry:149; CHECK-NEXT: [[CALL:%.*]] = tail call contract <2 x float> @_Z3sinDv2_f(<2 x float> noundef [[X]]) #[[ATTR0]]150; CHECK-NEXT: store <2 x float> [[CALL]], ptr addrspace(1) [[SIN_OUT]], align 8151; CHECK-NEXT: [[CALL1:%.*]] = tail call contract <2 x float> @_Z3cosDv2_f(<2 x float> noundef [[X]]) #[[ATTR0]]152; CHECK-NEXT: store <2 x float> [[CALL1]], ptr addrspace(1) [[COS_OUT]], align 8153; CHECK-NEXT: ret void154;155entry:156 %call = tail call contract <2 x float> @_Z3sinDv2_f(<2 x float> noundef %x) #0157 store <2 x float> %call, ptr addrspace(1) %sin_out, align 8158 %call1 = tail call contract <2 x float> @_Z3cosDv2_f(<2 x float> noundef %x) #0159 store <2 x float> %call1, ptr addrspace(1) %cos_out, align 8160 ret void161}162 163; TODO: Handle single function forms164attributes #0 = { nobuiltin }165attributes #1 = { "no-builtins" }166;.167; CHECK: attributes #[[ATTR0]] = { nobuiltin }168; CHECK: attributes #[[ATTR1]] = { "no-builtins" }169;.170