674 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -enable-var-scope -check-prefix=GCN %s3 4; Mostly overlaps with fmed3.ll to stress specific cases of5; isKnownNeverSNaN.6 7define float @v_test_known_not_snan_fabs_input_fmed3_r_i_i_f32(float %a) #0 {8; GCN-LABEL: v_test_known_not_snan_fabs_input_fmed3_r_i_i_f32:9; GCN: ; %bb.0:10; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11; GCN-NEXT: v_rcp_f32_e32 v0, v012; GCN-NEXT: v_med3_f32 v0, |v0|, 2.0, 4.013; GCN-NEXT: s_setpc_b64 s[30:31]14 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !015 %known.not.snan = call float @llvm.fabs.f32(float %a.nnan.add)16 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)17 %med = call float @llvm.minnum.f32(float %max, float 4.0)18 ret float %med19}20 21define float @v_test_known_not_snan_fneg_input_fmed3_r_i_i_f32(float %a) #0 {22; GCN-LABEL: v_test_known_not_snan_fneg_input_fmed3_r_i_i_f32:23; GCN: ; %bb.0:24; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)25; GCN-NEXT: v_rcp_f32_e32 v0, v026; GCN-NEXT: v_med3_f32 v0, -v0, 2.0, 4.027; GCN-NEXT: s_setpc_b64 s[30:31]28 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !029 %known.not.snan = fneg float %a.nnan.add30 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)31 %med = call float @llvm.minnum.f32(float %max, float 4.0)32 ret float %med33}34 35define float @v_test_known_not_snan_fpext_input_fmed3_r_i_i_f32(half %a) #0 {36; GCN-LABEL: v_test_known_not_snan_fpext_input_fmed3_r_i_i_f32:37; GCN: ; %bb.0:38; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)39; GCN-NEXT: v_add_f16_e32 v0, 1.0, v040; GCN-NEXT: v_cvt_f32_f16_e32 v0, v041; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.042; GCN-NEXT: s_setpc_b64 s[30:31]43 %a.nnan.add = fadd nnan half %a, 1.044 %known.not.snan = fpext half %a.nnan.add to float45 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)46 %med = call float @llvm.minnum.f32(float %max, float 4.0)47 ret float %med48}49 50define float @v_test_known_not_snan_fptrunc_input_fmed3_r_i_i_f32(double %a) #0 {51; GCN-LABEL: v_test_known_not_snan_fptrunc_input_fmed3_r_i_i_f32:52; GCN: ; %bb.0:53; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)54; GCN-NEXT: v_add_f64 v[0:1], v[0:1], 1.055; GCN-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]56; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.057; GCN-NEXT: s_setpc_b64 s[30:31]58 %a.nnan.add = fadd nnan double %a, 1.059 %known.not.snan = fptrunc double %a.nnan.add to float60 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)61 %med = call float @llvm.minnum.f32(float %max, float 4.0)62 ret float %med63}64 65define float @v_test_known_not_snan_copysign_input_fmed3_r_i_i_f32(float %a, float %sign) #0 {66; GCN-LABEL: v_test_known_not_snan_copysign_input_fmed3_r_i_i_f32:67; GCN: ; %bb.0:68; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)69; GCN-NEXT: v_rcp_f32_e32 v0, v070; GCN-NEXT: s_brev_b32 s4, -271; GCN-NEXT: v_bfi_b32 v0, s4, v0, v172; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.073; GCN-NEXT: s_setpc_b64 s[30:31]74 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !075 %known.not.snan = call float @llvm.copysign.f32(float %a.nnan.add, float %sign)76 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)77 %med = call float @llvm.minnum.f32(float %max, float 4.0)78 ret float %med79}80 81; Canonicalize always quiets, so nothing is necessary.82define float @v_test_known_canonicalize_input_fmed3_r_i_i_f32(float %a) #0 {83; GCN-LABEL: v_test_known_canonicalize_input_fmed3_r_i_i_f32:84; GCN: ; %bb.0:85; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)86; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v087; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.088; GCN-NEXT: s_setpc_b64 s[30:31]89 %known.not.snan = call float @llvm.canonicalize.f32(float %a)90 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)91 %med = call float @llvm.minnum.f32(float %max, float 4.0)92 ret float %med93}94 95define float @v_test_known_not_snan_minnum_input_fmed3_r_i_i_f32(float %a, float %b) #0 {96; GCN-LABEL: v_test_known_not_snan_minnum_input_fmed3_r_i_i_f32:97; GCN: ; %bb.0:98; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)99; GCN-NEXT: v_rcp_f32_e32 v0, v0100; GCN-NEXT: v_add_f32_e32 v1, 1.0, v1101; GCN-NEXT: v_min_f32_e32 v0, v0, v1102; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0103; GCN-NEXT: s_setpc_b64 s[30:31]104 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0105 %b.nnan.add = fadd nnan float %b, 1.0106 %known.not.snan = call float @llvm.minnum.f32(float %a.nnan.add, float %b.nnan.add)107 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)108 %med = call float @llvm.minnum.f32(float %max, float 4.0)109 ret float %med110}111 112define float @v_test_known_not_minnum_maybe_nan_src0_input_fmed3_r_i_i_f32(float %a, float %b) #0 {113; GCN-LABEL: v_test_known_not_minnum_maybe_nan_src0_input_fmed3_r_i_i_f32:114; GCN: ; %bb.0:115; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)116; GCN-NEXT: v_add_f32_e32 v1, 1.0, v1117; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0118; GCN-NEXT: v_min_f32_e32 v0, v0, v1119; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0120; GCN-NEXT: s_setpc_b64 s[30:31]121 %b.nsnan = fadd float %b, 1.0122 %known.not.snan = call float @llvm.minnum.f32(float %a, float %b.nsnan)123 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)124 %med = call float @llvm.minnum.f32(float %max, float 4.0)125 ret float %med126}127 128define float @v_test_known_not_minnum_maybe_nan_src1_input_fmed3_r_i_i_f32(float %a, float %b) #0 {129; GCN-LABEL: v_test_known_not_minnum_maybe_nan_src1_input_fmed3_r_i_i_f32:130; GCN: ; %bb.0:131; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)132; GCN-NEXT: v_add_f32_e32 v0, 1.0, v0133; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v1134; GCN-NEXT: v_min_f32_e32 v0, v0, v1135; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0136; GCN-NEXT: s_setpc_b64 s[30:31]137 %a.nsnan = fadd float %a, 1.0138 %known.not.snan = call float @llvm.minnum.f32(float %a.nsnan, float %b)139 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)140 %med = call float @llvm.minnum.f32(float %max, float 4.0)141 ret float %med142}143 144define float @v_minnum_possible_nan_lhs_input_fmed3_r_i_i_f32(float %a, float %b) #0 {145; GCN-LABEL: v_minnum_possible_nan_lhs_input_fmed3_r_i_i_f32:146; GCN: ; %bb.0:147; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)148; GCN-NEXT: v_add_f32_e32 v1, 1.0, v1149; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0150; GCN-NEXT: v_min_f32_e32 v0, v0, v1151; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0152; GCN-NEXT: s_setpc_b64 s[30:31]153 %b.nnan.add = fadd nnan float %b, 1.0154 %known.not.snan = call float @llvm.minnum.f32(float %a, float %b.nnan.add)155 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)156 %med = call float @llvm.minnum.f32(float %max, float 4.0)157 ret float %med158}159 160define float @v_minnum_possible_nan_rhs_input_fmed3_r_i_i_f32(float %a, float %b) #0 {161; GCN-LABEL: v_minnum_possible_nan_rhs_input_fmed3_r_i_i_f32:162; GCN: ; %bb.0:163; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)164; GCN-NEXT: v_rcp_f32_e32 v0, v0165; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v1166; GCN-NEXT: v_min_f32_e32 v0, v0, v1167; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0168; GCN-NEXT: s_setpc_b64 s[30:31]169 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0170 %known.not.snan = call float @llvm.minnum.f32(float %a.nnan.add, float %b)171 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)172 %med = call float @llvm.minnum.f32(float %max, float 4.0)173 ret float %med174}175 176define float @v_test_known_not_snan_maxnum_input_fmed3_r_i_i_f32(float %a, float %b) #0 {177; GCN-LABEL: v_test_known_not_snan_maxnum_input_fmed3_r_i_i_f32:178; GCN: ; %bb.0:179; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)180; GCN-NEXT: v_rcp_f32_e32 v0, v0181; GCN-NEXT: v_add_f32_e32 v1, 1.0, v1182; GCN-NEXT: v_max_f32_e32 v0, v0, v1183; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0184; GCN-NEXT: s_setpc_b64 s[30:31]185 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0186 %b.nnan.add = fadd nnan float %b, 1.0187 %known.not.snan = call float @llvm.maxnum.f32(float %a.nnan.add, float %b.nnan.add)188 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)189 %med = call float @llvm.minnum.f32(float %max, float 4.0)190 ret float %med191}192 193define float @v_maxnum_possible_nan_lhs_input_fmed3_r_i_i_f32(float %a, float %b) #0 {194; GCN-LABEL: v_maxnum_possible_nan_lhs_input_fmed3_r_i_i_f32:195; GCN: ; %bb.0:196; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)197; GCN-NEXT: v_add_f32_e32 v1, 1.0, v1198; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0199; GCN-NEXT: v_max_f32_e32 v0, v0, v1200; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0201; GCN-NEXT: s_setpc_b64 s[30:31]202 %b.nnan.add = fadd nnan float %b, 1.0203 %known.not.snan = call float @llvm.maxnum.f32(float %a, float %b.nnan.add)204 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)205 %med = call float @llvm.minnum.f32(float %max, float 4.0)206 ret float %med207}208 209define float @v_maxnum_possible_nan_rhs_input_fmed3_r_i_i_f32(float %a, float %b) #0 {210; GCN-LABEL: v_maxnum_possible_nan_rhs_input_fmed3_r_i_i_f32:211; GCN: ; %bb.0:212; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)213; GCN-NEXT: v_rcp_f32_e32 v0, v0214; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v1215; GCN-NEXT: v_max_f32_e32 v0, v0, v1216; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0217; GCN-NEXT: s_setpc_b64 s[30:31]218 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0219 %known.not.snan = call float @llvm.maxnum.f32(float %a.nnan.add, float %b)220 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)221 %med = call float @llvm.minnum.f32(float %max, float 4.0)222 ret float %med223}224 225define float @v_test_known_not_snan_select_input_fmed3_r_i_i_f32(float %a, float %b, i32 %c) #0 {226; GCN-LABEL: v_test_known_not_snan_select_input_fmed3_r_i_i_f32:227; GCN: ; %bb.0:228; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)229; GCN-NEXT: v_rcp_f32_e32 v0, v0230; GCN-NEXT: v_add_f32_e32 v1, 1.0, v1231; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 0, v2232; GCN-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc233; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0234; GCN-NEXT: s_setpc_b64 s[30:31]235 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0236 %b.nnan.add = fadd nnan float %b, 1.0237 %cmp = icmp eq i32 %c, 0238 %known.not.snan = select i1 %cmp, float %a.nnan.add, float %b.nnan.add239 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)240 %med = call float @llvm.minnum.f32(float %max, float 4.0)241 ret float %med242}243 244define float @v_select_possible_nan_lhs_input_fmed3_r_i_i_f32(float %a, float %b, i32 %c) #0 {245; GCN-LABEL: v_select_possible_nan_lhs_input_fmed3_r_i_i_f32:246; GCN: ; %bb.0:247; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)248; GCN-NEXT: v_add_f32_e32 v1, 1.0, v1249; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 0, v2250; GCN-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc251; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0252; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0253; GCN-NEXT: s_setpc_b64 s[30:31]254 %b.nnan.add = fadd nnan float %b, 1.0255 %cmp = icmp eq i32 %c, 0256 %known.not.snan = select i1 %cmp, float %a, float %b.nnan.add257 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)258 %med = call float @llvm.minnum.f32(float %max, float 4.0)259 ret float %med260}261 262define float @v_select_possible_nan_rhs_input_fmed3_r_i_i_f32(float %a, float %b, i32 %c) #0 {263; GCN-LABEL: v_select_possible_nan_rhs_input_fmed3_r_i_i_f32:264; GCN: ; %bb.0:265; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)266; GCN-NEXT: v_rcp_f32_e32 v0, v0267; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 0, v2268; GCN-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc269; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0270; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0271; GCN-NEXT: s_setpc_b64 s[30:31]272 %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0273 %cmp = icmp eq i32 %c, 0274 %known.not.snan = select i1 %cmp, float %a.nnan.add, float %b275 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)276 %med = call float @llvm.minnum.f32(float %max, float 4.0)277 ret float %med278}279 280define float @v_test_known_not_snan_fadd_input_fmed3_r_i_i_f32(float %a, float %b) #0 {281; GCN-LABEL: v_test_known_not_snan_fadd_input_fmed3_r_i_i_f32:282; GCN: ; %bb.0:283; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)284; GCN-NEXT: v_add_f32_e32 v0, v0, v1285; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0286; GCN-NEXT: s_setpc_b64 s[30:31]287 %known.not.snan = fadd float %a, %b288 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)289 %med = call float @llvm.minnum.f32(float %max, float 4.0)290 ret float %med291}292 293define float @v_test_known_not_snan_fsub_input_fmed3_r_i_i_f32(float %a, float %b) #0 {294; GCN-LABEL: v_test_known_not_snan_fsub_input_fmed3_r_i_i_f32:295; GCN: ; %bb.0:296; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)297; GCN-NEXT: v_sub_f32_e32 v0, v0, v1298; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0299; GCN-NEXT: s_setpc_b64 s[30:31]300 %known.not.snan = fsub float %a, %b301 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)302 %med = call float @llvm.minnum.f32(float %max, float 4.0)303 ret float %med304}305 306define float @v_test_known_not_snan_fmul_input_fmed3_r_i_i_f32(float %a, float %b) #0 {307; GCN-LABEL: v_test_known_not_snan_fmul_input_fmed3_r_i_i_f32:308; GCN: ; %bb.0:309; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)310; GCN-NEXT: v_mul_f32_e32 v0, v0, v1311; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0312; GCN-NEXT: s_setpc_b64 s[30:31]313 %known.not.snan = fmul float %a, %b314 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)315 %med = call float @llvm.minnum.f32(float %max, float 4.0)316 ret float %med317}318 319define float @v_test_known_not_snan_uint_to_fp_input_fmed3_r_i_i_f32(i32 %a) #0 {320; GCN-LABEL: v_test_known_not_snan_uint_to_fp_input_fmed3_r_i_i_f32:321; GCN: ; %bb.0:322; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)323; GCN-NEXT: v_cvt_f32_u32_e32 v0, v0324; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0325; GCN-NEXT: s_setpc_b64 s[30:31]326 %known.not.snan = uitofp i32 %a to float327 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)328 %med = call float @llvm.minnum.f32(float %max, float 4.0)329 ret float %med330}331 332define float @v_test_known_not_snan_sint_to_fp_input_fmed3_r_i_i_f32(i32 %a) #0 {333; GCN-LABEL: v_test_known_not_snan_sint_to_fp_input_fmed3_r_i_i_f32:334; GCN: ; %bb.0:335; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)336; GCN-NEXT: v_cvt_f32_i32_e32 v0, v0337; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0338; GCN-NEXT: s_setpc_b64 s[30:31]339 %known.not.snan = sitofp i32 %a to float340 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)341 %med = call float @llvm.minnum.f32(float %max, float 4.0)342 ret float %med343}344 345define float @v_test_known_not_snan_fma_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {346; GCN-LABEL: v_test_known_not_snan_fma_input_fmed3_r_i_i_f32:347; GCN: ; %bb.0:348; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)349; GCN-NEXT: v_fma_f32 v0, v0, v1, v2350; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0351; GCN-NEXT: s_setpc_b64 s[30:31]352 %known.not.snan = call float @llvm.fma.f32(float %a, float %b, float %c)353 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)354 %med = call float @llvm.minnum.f32(float %max, float 4.0)355 ret float %med356}357 358define float @v_test_known_not_snan_fmad_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {359; GCN-LABEL: v_test_known_not_snan_fmad_input_fmed3_r_i_i_f32:360; GCN: ; %bb.0:361; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)362; GCN-NEXT: v_mac_f32_e32 v2, v0, v1363; GCN-NEXT: v_med3_f32 v0, v2, 2.0, 4.0364; GCN-NEXT: s_setpc_b64 s[30:31]365 %known.not.snan = call float @llvm.fmuladd.f32(float %a, float %b, float %c)366 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)367 %med = call float @llvm.minnum.f32(float %max, float 4.0)368 ret float %med369}370 371 372define float @v_test_known_not_snan_sin_input_fmed3_r_i_i_f32(float %a) #0 {373; GCN-LABEL: v_test_known_not_snan_sin_input_fmed3_r_i_i_f32:374; GCN: ; %bb.0:375; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)376; GCN-NEXT: v_mul_f32_e32 v0, 0.15915494, v0377; GCN-NEXT: v_fract_f32_e32 v0, v0378; GCN-NEXT: v_sin_f32_e32 v0, v0379; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0380; GCN-NEXT: s_setpc_b64 s[30:31]381 %known.not.snan = call float @llvm.sin.f32(float %a)382 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)383 %med = call float @llvm.minnum.f32(float %max, float 4.0)384 ret float %med385}386 387define float @v_test_known_not_snan_cos_input_fmed3_r_i_i_f32(float %a) #0 {388; GCN-LABEL: v_test_known_not_snan_cos_input_fmed3_r_i_i_f32:389; GCN: ; %bb.0:390; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)391; GCN-NEXT: v_mul_f32_e32 v0, 0.15915494, v0392; GCN-NEXT: v_fract_f32_e32 v0, v0393; GCN-NEXT: v_cos_f32_e32 v0, v0394; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0395; GCN-NEXT: s_setpc_b64 s[30:31]396 %known.not.snan = call float @llvm.cos.f32(float %a)397 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)398 %med = call float @llvm.minnum.f32(float %max, float 4.0)399 ret float %med400}401 402define float @v_test_known_not_snan_exp2_input_fmed3_r_i_i_f32(float %a) #0 {403; GCN-LABEL: v_test_known_not_snan_exp2_input_fmed3_r_i_i_f32:404; GCN: ; %bb.0:405; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)406; GCN-NEXT: v_exp_f32_e32 v0, v0407; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0408; GCN-NEXT: s_setpc_b64 s[30:31]409 %known.not.snan = call float @llvm.exp2.f32(float %a)410 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)411 %med = call float @llvm.minnum.f32(float %max, float 4.0)412 ret float %med413}414 415define float @v_test_known_not_snan_trunc_input_fmed3_r_i_i_f32(float %a) #0 {416; GCN-LABEL: v_test_known_not_snan_trunc_input_fmed3_r_i_i_f32:417; GCN: ; %bb.0:418; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)419; GCN-NEXT: v_trunc_f32_e32 v0, v0420; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0421; GCN-NEXT: s_setpc_b64 s[30:31]422 %known.not.snan = call float @llvm.trunc.f32(float %a)423 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)424 %med = call float @llvm.minnum.f32(float %max, float 4.0)425 ret float %med426}427 428define float @v_test_known_not_snan_floor_input_fmed3_r_i_i_f32(float %a) #0 {429; GCN-LABEL: v_test_known_not_snan_floor_input_fmed3_r_i_i_f32:430; GCN: ; %bb.0:431; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)432; GCN-NEXT: v_floor_f32_e32 v0, v0433; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0434; GCN-NEXT: s_setpc_b64 s[30:31]435 %known.not.snan = call float @llvm.floor.f32(float %a)436 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)437 %med = call float @llvm.minnum.f32(float %max, float 4.0)438 ret float %med439}440 441define float @v_test_known_not_snan_ceil_input_fmed3_r_i_i_f32(float %a) #0 {442; GCN-LABEL: v_test_known_not_snan_ceil_input_fmed3_r_i_i_f32:443; GCN: ; %bb.0:444; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)445; GCN-NEXT: v_floor_f32_e32 v0, v0446; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0447; GCN-NEXT: s_setpc_b64 s[30:31]448 %known.not.snan = call float @llvm.floor.f32(float %a)449 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)450 %med = call float @llvm.minnum.f32(float %max, float 4.0)451 ret float %med452}453 454define float @v_test_known_not_snan_round_input_fmed3_r_i_i_f32(float %a) #0 {455; GCN-LABEL: v_test_known_not_snan_round_input_fmed3_r_i_i_f32:456; GCN: ; %bb.0:457; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)458; GCN-NEXT: v_trunc_f32_e32 v1, v0459; GCN-NEXT: v_sub_f32_e32 v2, v0, v1460; GCN-NEXT: v_cmp_ge_f32_e64 s[4:5], |v2|, 0.5461; GCN-NEXT: v_cndmask_b32_e64 v2, 0, 1.0, s[4:5]462; GCN-NEXT: s_brev_b32 s4, -2463; GCN-NEXT: v_bfi_b32 v0, s4, v2, v0464; GCN-NEXT: v_add_f32_e32 v0, v1, v0465; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0466; GCN-NEXT: s_setpc_b64 s[30:31]467 %known.not.snan = call float @llvm.round.f32(float %a)468 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)469 %med = call float @llvm.minnum.f32(float %max, float 4.0)470 ret float %med471}472 473define float @v_test_known_not_snan_rint_input_fmed3_r_i_i_f32(float %a) #0 {474; GCN-LABEL: v_test_known_not_snan_rint_input_fmed3_r_i_i_f32:475; GCN: ; %bb.0:476; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)477; GCN-NEXT: v_rndne_f32_e32 v0, v0478; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0479; GCN-NEXT: s_setpc_b64 s[30:31]480 %known.not.snan = call float @llvm.rint.f32(float %a)481 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)482 %med = call float @llvm.minnum.f32(float %max, float 4.0)483 ret float %med484}485 486define float @v_test_known_not_snan_nearbyint_input_fmed3_r_i_i_f32(float %a) #0 {487; GCN-LABEL: v_test_known_not_snan_nearbyint_input_fmed3_r_i_i_f32:488; GCN: ; %bb.0:489; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)490; GCN-NEXT: v_rndne_f32_e32 v0, v0491; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0492; GCN-NEXT: s_setpc_b64 s[30:31]493 %known.not.snan = call float @llvm.nearbyint.f32(float %a)494 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)495 %med = call float @llvm.minnum.f32(float %max, float 4.0)496 ret float %med497}498 499define float @v_test_known_not_snan_fmul_legacy_input_fmed3_r_i_i_f32(float %a, float %b) #0 {500; GCN-LABEL: v_test_known_not_snan_fmul_legacy_input_fmed3_r_i_i_f32:501; GCN: ; %bb.0:502; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)503; GCN-NEXT: v_mul_legacy_f32_e32 v0, v0, v1504; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0505; GCN-NEXT: s_setpc_b64 s[30:31]506 %known.not.snan = call float @llvm.amdgcn.fmul.legacy(float %a, float %b)507 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)508 %med = call float @llvm.minnum.f32(float %max, float 4.0)509 ret float %med510}511 512define float @v_test_known_not_snan_ldexp_input_fmed3_r_i_i_f32(float %a, i32 %b) #0 {513; GCN-LABEL: v_test_known_not_snan_ldexp_input_fmed3_r_i_i_f32:514; GCN: ; %bb.0:515; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)516; GCN-NEXT: v_ldexp_f32 v0, v0, v1517; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0518; GCN-NEXT: s_setpc_b64 s[30:31]519 %known.not.snan = call float @llvm.ldexp.f32.i32(float %a, i32 %b)520 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)521 %med = call float @llvm.minnum.f32(float %max, float 4.0)522 ret float %med523}524 525define float @v_test_known_not_snan_fmed3_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {526; GCN-LABEL: v_test_known_not_snan_fmed3_input_fmed3_r_i_i_f32:527; GCN: ; %bb.0:528; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)529; GCN-NEXT: v_med3_f32 v0, v0, v1, v2530; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0531; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0532; GCN-NEXT: s_setpc_b64 s[30:31]533 %known.not.snan = call float @llvm.amdgcn.fmed3.f32(float %a, float %b, float %c)534 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)535 %med = call float @llvm.minnum.f32(float %max, float 4.0)536 ret float %med537}538 539define float @v_test_known_not_snan_fmin3_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {540; GCN-LABEL: v_test_known_not_snan_fmin3_input_fmed3_r_i_i_f32:541; GCN: ; %bb.0:542; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)543; GCN-NEXT: v_min3_f32 v0, v0, v1, v2544; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0545; GCN-NEXT: s_setpc_b64 s[30:31]546 %min0 = call float @llvm.minnum.f32(float %a, float %b)547 %known.not.snan = call float @llvm.minnum.f32(float %min0, float %c)548 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)549 %med = call float @llvm.minnum.f32(float %max, float 4.0)550 ret float %med551}552 553define float @v_test_known_not_snan_cvt_ubyte0_input_fmed3_r_i_i_f32(i8 %char) #0 {554; GCN-LABEL: v_test_known_not_snan_cvt_ubyte0_input_fmed3_r_i_i_f32:555; GCN: ; %bb.0:556; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)557; GCN-NEXT: v_cvt_f32_ubyte0_e32 v0, v0558; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0559; GCN-NEXT: s_setpc_b64 s[30:31]560 %cvt = uitofp i8 %char to float561 %max = call float @llvm.maxnum.f32(float %cvt, float 2.0)562 %med = call float @llvm.minnum.f32(float %max, float 4.0)563 ret float %med564}565 566define float @v_test_not_known_frexp_mant_input_fmed3_r_i_i_f32(float %arg) #0 {567; GCN-LABEL: v_test_not_known_frexp_mant_input_fmed3_r_i_i_f32:568; GCN: ; %bb.0:569; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)570; GCN-NEXT: v_frexp_mant_f32_e32 v0, v0571; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0572; GCN-NEXT: s_setpc_b64 s[30:31]573 %known.not.snan = call float @llvm.amdgcn.frexp.mant.f32(float %arg)574 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)575 %med = call float @llvm.minnum.f32(float %max, float 4.0)576 ret float %med577}578 579define float @v_test_known_not_frexp_mant_input_fmed3_r_i_i_f32(float %arg) #0 {580; GCN-LABEL: v_test_known_not_frexp_mant_input_fmed3_r_i_i_f32:581; GCN: ; %bb.0:582; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)583; GCN-NEXT: v_add_f32_e32 v0, 1.0, v0584; GCN-NEXT: v_frexp_mant_f32_e32 v0, v0585; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0586; GCN-NEXT: s_setpc_b64 s[30:31]587 %add = fadd float %arg, 1.0588 %known.not.snan = call float @llvm.amdgcn.frexp.mant.f32(float %add)589 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)590 %med = call float @llvm.minnum.f32(float %max, float 4.0)591 ret float %med592}593 594define float @v_test_known_not_snan_rcp_input_fmed3_r_i_i_f32(float %a) #0 {595; GCN-LABEL: v_test_known_not_snan_rcp_input_fmed3_r_i_i_f32:596; GCN: ; %bb.0:597; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)598; GCN-NEXT: v_rcp_f32_e32 v0, v0599; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0600; GCN-NEXT: s_setpc_b64 s[30:31]601 %known.not.snan = call float @llvm.amdgcn.rcp.f32(float %a)602 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)603 %med = call float @llvm.minnum.f32(float %max, float 4.0)604 ret float %med605}606define float @v_test_known_not_snan_rsq_input_fmed3_r_i_i_f32(float %a) #0 {607; GCN-LABEL: v_test_known_not_snan_rsq_input_fmed3_r_i_i_f32:608; GCN: ; %bb.0:609; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)610; GCN-NEXT: v_rsq_f32_e32 v0, v0611; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0612; GCN-NEXT: s_setpc_b64 s[30:31]613 %known.not.snan = call float @llvm.amdgcn.rsq.f32(float %a)614 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)615 %med = call float @llvm.minnum.f32(float %max, float 4.0)616 ret float %med617}618 619define float @v_test_known_not_snan_fract_input_fmed3_r_i_i_f32(float %a) #0 {620; GCN-LABEL: v_test_known_not_snan_fract_input_fmed3_r_i_i_f32:621; GCN: ; %bb.0:622; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)623; GCN-NEXT: v_fract_f32_e32 v0, v0624; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0625; GCN-NEXT: s_setpc_b64 s[30:31]626 %known.not.snan = call float @llvm.amdgcn.fract.f32(float %a)627 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)628 %med = call float @llvm.minnum.f32(float %max, float 4.0)629 ret float %med630}631 632define float @v_test_known_not_snan_cubeid_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {633; GCN-LABEL: v_test_known_not_snan_cubeid_input_fmed3_r_i_i_f32:634; GCN: ; %bb.0:635; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)636; GCN-NEXT: v_cubeid_f32 v0, v0, v1, v2637; GCN-NEXT: v_med3_f32 v0, v0, 2.0, 4.0638; GCN-NEXT: s_setpc_b64 s[30:31]639 %known.not.snan = call float @llvm.amdgcn.cubeid(float %a, float %b, float %c)640 %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)641 %med = call float @llvm.minnum.f32(float %max, float 4.0)642 ret float %med643}644 645declare float @llvm.fabs.f32(float) #1646declare float @llvm.sin.f32(float) #1647declare float @llvm.cos.f32(float) #1648declare float @llvm.exp2.f32(float) #1649declare float @llvm.trunc.f32(float) #1650declare float @llvm.floor.f32(float) #1651declare float @llvm.ceil.f32(float) #1652declare float @llvm.round.f32(float) #1653declare float @llvm.rint.f32(float) #1654declare float @llvm.nearbyint.f32(float) #1655declare float @llvm.canonicalize.f32(float) #1656declare float @llvm.minnum.f32(float, float) #1657declare float @llvm.maxnum.f32(float, float) #1658declare float @llvm.copysign.f32(float, float) #1659declare float @llvm.fma.f32(float, float, float) #1660declare float @llvm.fmuladd.f32(float, float, float) #1661declare float @llvm.ldexp.f32.i32(float, i32) #1662declare float @llvm.amdgcn.fmul.legacy(float, float) #1663declare float @llvm.amdgcn.fmed3.f32(float, float, float) #1664declare float @llvm.amdgcn.frexp.mant.f32(float) #1665declare float @llvm.amdgcn.rcp.f32(float) #1666declare float @llvm.amdgcn.rsq.f32(float) #1667declare float @llvm.amdgcn.fract.f32(float) #1668declare float @llvm.amdgcn.cubeid(float, float, float) #0669 670attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }671attributes #1 = { nounwind readnone speculatable }672 673!0 = !{float 2.500000e+00}674