brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.3 KiB · 5691fc8 Raw
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