brintos

brintos / llvm-project-archived public Read only

0
0
Text · 57.9 KiB · 11af704 Raw
1430 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX900 %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX1010 %s4 5; Test the CMP+SELECT optimization that folds shared constants to reduce6; register pressure.7 8;------------------------------------------------------------------------------9; F32 Tests10;------------------------------------------------------------------------------11 12; Should be folded: fcmp oeq + select with constant in true value13define float @fcmp_select_fold_oeq_f32_imm(float %arg, float %other) {14; GFX900-LABEL: fcmp_select_fold_oeq_f32_imm:15; GFX900:       ; %bb.0: ; %entry16; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)17; GFX900-NEXT:    s_mov_b32 s4, 0x42487ed818; GFX900-NEXT:    v_cmp_eq_f32_e32 vcc, s4, v019; GFX900-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc20; GFX900-NEXT:    s_setpc_b64 s[30:31]21;22; GFX1010-LABEL: fcmp_select_fold_oeq_f32_imm:23; GFX1010:       ; %bb.0: ; %entry24; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)25; GFX1010-NEXT:    v_cmp_eq_f32_e32 vcc_lo, 0x42487ed8, v026; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo27; GFX1010-NEXT:    s_setpc_b64 s[30:31]28entry:29  %cmp = fcmp oeq float %arg, 0x40490FDB0000000030  %sel = select i1 %cmp, float 0x40490FDB00000000, float %other31  ret float %sel32}33 34; Should be folded: fcmp oeq + select with constant in true value (commutative)35define float @fcmp_select_fold_oeq_imm_f32(float %arg, float %other) {36; GFX900-LABEL: fcmp_select_fold_oeq_imm_f32:37; GFX900:       ; %bb.0: ; %entry38; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)39; GFX900-NEXT:    s_mov_b32 s4, 0x42487ed840; GFX900-NEXT:    v_cmp_eq_f32_e32 vcc, s4, v041; GFX900-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc42; GFX900-NEXT:    s_setpc_b64 s[30:31]43;44; GFX1010-LABEL: fcmp_select_fold_oeq_imm_f32:45; GFX1010:       ; %bb.0: ; %entry46; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)47; GFX1010-NEXT:    v_cmp_eq_f32_e32 vcc_lo, 0x42487ed8, v048; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo49; GFX1010-NEXT:    s_setpc_b64 s[30:31]50entry:51  %cmp = fcmp oeq float 0x40490FDB00000000, %arg52  %sel = select i1 %cmp, float 0x40490FDB00000000, float %other53  ret float %sel54}55 56; Should be folded: fcmp one + select with constant in false value57define float @fcmp_select_fold_one_f32_imm(float %arg, float %other) {58; GFX900-LABEL: fcmp_select_fold_one_f32_imm:59; GFX900:       ; %bb.0: ; %entry60; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)61; GFX900-NEXT:    s_mov_b32 s4, 0x402df85062; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v063; GFX900-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc64; GFX900-NEXT:    s_setpc_b64 s[30:31]65;66; GFX1010-LABEL: fcmp_select_fold_one_f32_imm:67; GFX1010:       ; %bb.0: ; %entry68; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)69; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0x402df850, v070; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo71; GFX1010-NEXT:    s_setpc_b64 s[30:31]72entry:73  %cmp = fcmp one float %arg, 0x4005BF0A0000000074  %sel = select i1 %cmp, float %other, float 0x4005BF0A0000000075  ret float %sel76}77 78; Should be folded: fcmp one + select with constant in false value (commutative)79define float @fcmp_select_fold_one_imm_f32(float %arg, float %other) {80; GFX900-LABEL: fcmp_select_fold_one_imm_f32:81; GFX900:       ; %bb.0: ; %entry82; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)83; GFX900-NEXT:    s_mov_b32 s4, 0x402df85084; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v085; GFX900-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc86; GFX900-NEXT:    s_setpc_b64 s[30:31]87;88; GFX1010-LABEL: fcmp_select_fold_one_imm_f32:89; GFX1010:       ; %bb.0: ; %entry90; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)91; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0x402df850, v092; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo93; GFX1010-NEXT:    s_setpc_b64 s[30:31]94entry:95  %cmp = fcmp one float 0x4005BF0A00000000, %arg96  %sel = select i1 %cmp, float %other, float 0x4005BF0A0000000097  ret float %sel98}99 100; Should NOT be folded: different constants101define float @fcmp_select_no_fold_f32_different_const(float %arg, float %other) {102; GFX900-LABEL: fcmp_select_no_fold_f32_different_const:103; GFX900:       ; %bb.0: ; %entry104; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)105; GFX900-NEXT:    s_mov_b32 s4, 0x42487ed8106; GFX900-NEXT:    v_mov_b32_e32 v2, 0x46487ed8107; GFX900-NEXT:    v_cmp_neq_f32_e32 vcc, s4, v0108; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc109; GFX900-NEXT:    s_setpc_b64 s[30:31]110;111; GFX1010-LABEL: fcmp_select_no_fold_f32_different_const:112; GFX1010:       ; %bb.0: ; %entry113; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)114; GFX1010-NEXT:    v_cmp_neq_f32_e32 vcc_lo, 0x42487ed8, v0115; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x46487ed8, v1, vcc_lo116; GFX1010-NEXT:    s_setpc_b64 s[30:31]117entry:118  %cmp = fcmp oeq float %arg, 0x40490FDB00000000119  %sel = select i1 %cmp, float 0x40C90FDB00000000, float %other120  ret float %sel121}122 123; Should NOT be folded: fcmp oeq with constant in other position124define float @fcmp_select_no_fold_f32_other_pos(float %arg, float %other) {125; GFX900-LABEL: fcmp_select_no_fold_f32_other_pos:126; GFX900:       ; %bb.0: ; %entry127; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)128; GFX900-NEXT:    s_mov_b32 s4, 0x42487ed8129; GFX900-NEXT:    v_mov_b32_e32 v2, 0x42487ed8130; GFX900-NEXT:    v_cmp_eq_f32_e32 vcc, s4, v0131; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc132; GFX900-NEXT:    s_setpc_b64 s[30:31]133;134; GFX1010-LABEL: fcmp_select_no_fold_f32_other_pos:135; GFX1010:       ; %bb.0: ; %entry136; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)137; GFX1010-NEXT:    v_cmp_eq_f32_e32 vcc_lo, 0x42487ed8, v0138; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x42487ed8, v1, vcc_lo139; GFX1010-NEXT:    s_setpc_b64 s[30:31]140entry:141  %cmp = fcmp oeq float %arg, 0x40490FDB00000000142  %sel = select i1 %cmp, float %other, float 0x40490FDB00000000143  ret float %sel144}145 146; Should NOT be folded: unsupported comparison type147define float @fcmp_select_no_fold_f32_unsupported_cmp(float %arg, float %other) {148; GFX900-LABEL: fcmp_select_no_fold_f32_unsupported_cmp:149; GFX900:       ; %bb.0: ; %entry150; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)151; GFX900-NEXT:    s_mov_b32 s4, 0x42487ed8152; GFX900-NEXT:    v_mov_b32_e32 v2, 0x42487ed8153; GFX900-NEXT:    v_cmp_gt_f32_e32 vcc, s4, v0154; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc155; GFX900-NEXT:    s_setpc_b64 s[30:31]156;157; GFX1010-LABEL: fcmp_select_no_fold_f32_unsupported_cmp:158; GFX1010:       ; %bb.0: ; %entry159; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)160; GFX1010-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x42487ed8, v0161; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x42487ed8, v1, vcc_lo162; GFX1010-NEXT:    s_setpc_b64 s[30:31]163entry:164  %cmp = fcmp olt float %arg, 0x40490FDB00000000165  %sel = select i1 %cmp, float %other, float 0x40490FDB00000000166  ret float %sel167}168 169; Should NOT be folded: imm can be encoded into cndmask170define float @fcmp_select_no_fold_f32_enc_imm(float %arg, float %other) {171; GFX900-LABEL: fcmp_select_no_fold_f32_enc_imm:172; GFX900:       ; %bb.0: ; %entry173; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)174; GFX900-NEXT:    v_cmp_neq_f32_e32 vcc, 1.0, v0175; GFX900-NEXT:    v_cndmask_b32_e32 v0, 1.0, v1, vcc176; GFX900-NEXT:    s_setpc_b64 s[30:31]177;178; GFX1010-LABEL: fcmp_select_no_fold_f32_enc_imm:179; GFX1010:       ; %bb.0: ; %entry180; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)181; GFX1010-NEXT:    v_cmp_neq_f32_e32 vcc_lo, 1.0, v0182; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 1.0, v1, vcc_lo183; GFX1010-NEXT:    s_setpc_b64 s[30:31]184entry:185  %cmp = fcmp oeq float %arg, 1.0186  %sel = select i1 %cmp, float 1.0, float %other187  ret float %sel188}189 190; Should NOT be folded: imm can be encoded into cndmask191define float @fcmp_select_no_fold_f32_enc_imm_2(float %arg, float %other) {192; GFX900-LABEL: fcmp_select_no_fold_f32_enc_imm_2:193; GFX900:       ; %bb.0: ; %entry194; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)195; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, -4.0, v0196; GFX900-NEXT:    v_cndmask_b32_e32 v0, -4.0, v1, vcc197; GFX900-NEXT:    s_setpc_b64 s[30:31]198;199; GFX1010-LABEL: fcmp_select_no_fold_f32_enc_imm_2:200; GFX1010:       ; %bb.0: ; %entry201; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)202; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, -4.0, v0203; GFX1010-NEXT:    v_cndmask_b32_e32 v0, -4.0, v1, vcc_lo204; GFX1010-NEXT:    s_setpc_b64 s[30:31]205entry:206  %cmp = fcmp one float -4.0, %arg207  %sel = select i1 %cmp, float %other, float -4.0208  ret float %sel209}210 211; Should NOT be folded: fcmp oeq with zero constant212define float @fcmp_select_no_fold_oeq_f32_zero(float %arg, float %other) {213; GFX900-LABEL: fcmp_select_no_fold_oeq_f32_zero:214; GFX900:       ; %bb.0: ; %entry215; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)216; GFX900-NEXT:    v_cmp_neq_f32_e32 vcc, 0, v0217; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc218; GFX900-NEXT:    s_setpc_b64 s[30:31]219;220; GFX1010-LABEL: fcmp_select_no_fold_oeq_f32_zero:221; GFX1010:       ; %bb.0: ; %entry222; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)223; GFX1010-NEXT:    v_cmp_neq_f32_e32 vcc_lo, 0, v0224; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc_lo225; GFX1010-NEXT:    s_setpc_b64 s[30:31]226entry:227  %cmp = fcmp oeq float %arg, 0.0228  %sel = select i1 %cmp, float 0.0, float %other229  ret float %sel230}231 232; Should NOT be folded: fcmp one with negative zero constant233define float @fcmp_select_no_fold_one_f32_negzero(float %arg, float %other) {234; GFX900-LABEL: fcmp_select_no_fold_one_f32_negzero:235; GFX900:       ; %bb.0: ; %entry236; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)237; GFX900-NEXT:    s_brev_b32 s4, 1238; GFX900-NEXT:    v_bfrev_b32_e32 v2, 1239; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v0240; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc241; GFX900-NEXT:    s_setpc_b64 s[30:31]242;243; GFX1010-LABEL: fcmp_select_no_fold_one_f32_negzero:244; GFX1010:       ; %bb.0: ; %entry245; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)246; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0x80000000, v0247; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x80000000, v1, vcc_lo248; GFX1010-NEXT:    s_setpc_b64 s[30:31]249entry:250  %cmp = fcmp one float -0.0, %arg ; 0x8000000000000000251  %sel = select i1 %cmp, float %other, float -0.0 ;0x8000000000000000252  ret float %sel253}254 255; NaN values should bypass the optimization due to special IEEE 754 behavior256; fcmp oeq with NaN always returns false, so select always chooses %other257define float @fcmp_select_no_fold_oeq_f32_nan(float %arg, float %other) {258; GFX900-LABEL: fcmp_select_no_fold_oeq_f32_nan:259; GFX900:       ; %bb.0: ; %entry260; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)261; GFX900-NEXT:    v_mov_b32_e32 v0, v1262; GFX900-NEXT:    s_setpc_b64 s[30:31]263;264; GFX1010-LABEL: fcmp_select_no_fold_oeq_f32_nan:265; GFX1010:       ; %bb.0: ; %entry266; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)267; GFX1010-NEXT:    v_mov_b32_e32 v0, v1268; GFX1010-NEXT:    s_setpc_b64 s[30:31]269entry:270  %cmp = fcmp oeq float %arg, 0x7FF8000000000000271  %sel = select i1 %cmp, float 0x7FF8000000000000, float %other272  ret float %sel273}274 275; NaN values should bypass the optimization due to special IEEE 754 behavior276; fcmp one with NaN always returns false, so select always chooses the NaN constant277define float @fcmp_select_no_fold_one_f32_nan(float %arg, float %other) {278; GFX900-LABEL: fcmp_select_no_fold_one_f32_nan:279; GFX900:       ; %bb.0: ; %entry280; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)281; GFX900-NEXT:    v_mov_b32_e32 v0, 0x7fc00000282; GFX900-NEXT:    s_setpc_b64 s[30:31]283;284; GFX1010-LABEL: fcmp_select_no_fold_one_f32_nan:285; GFX1010:       ; %bb.0: ; %entry286; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)287; GFX1010-NEXT:    v_mov_b32_e32 v0, 0x7fc00000288; GFX1010-NEXT:    s_setpc_b64 s[30:31]289entry:290  %cmp = fcmp one float 0x7FF8000000000000, %arg291  %sel = select i1 %cmp, float %other, float 0x7FF8000000000000292  ret float %sel293}294 295; Should NOT be folded: fcmp one with positive infinity296; Infinity values should bypass the optimization, generating unfolded code297define float @fcmp_select_no_fold_posinf_oeq_f32(float %arg, float %other) {298; GFX900-LABEL: fcmp_select_no_fold_posinf_oeq_f32:299; GFX900:       ; %bb.0: ; %entry300; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)301; GFX900-NEXT:    s_mov_b32 s4, 0x7f800000302; GFX900-NEXT:    v_mov_b32_e32 v2, 0x7f800000303; GFX900-NEXT:    v_cmp_neq_f32_e32 vcc, s4, v0304; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc305; GFX900-NEXT:    s_setpc_b64 s[30:31]306;307; GFX1010-LABEL: fcmp_select_no_fold_posinf_oeq_f32:308; GFX1010:       ; %bb.0: ; %entry309; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)310; GFX1010-NEXT:    v_cmp_neq_f32_e32 vcc_lo, 0x7f800000, v0311; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x7f800000, v1, vcc_lo312; GFX1010-NEXT:    s_setpc_b64 s[30:31]313entry:314  %cmp = fcmp oeq float %arg, 0x7FF0000000000000315  %sel = select i1 %cmp, float 0x7FF0000000000000, float %other316  ret float %sel317}318 319; Should NOT be folded: fcmp one with negative infinity320; Infinity values should bypass the optimization, generating unfolded code321define float @fcmp_select_no_fold_neginf_f32_one(float %arg, float %other) {322; GFX900-LABEL: fcmp_select_no_fold_neginf_f32_one:323; GFX900:       ; %bb.0: ; %entry324; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)325; GFX900-NEXT:    s_mov_b32 s4, 0xff800000326; GFX900-NEXT:    v_mov_b32_e32 v2, 0xff800000327; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v0328; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc329; GFX900-NEXT:    s_setpc_b64 s[30:31]330;331; GFX1010-LABEL: fcmp_select_no_fold_neginf_f32_one:332; GFX1010:       ; %bb.0: ; %entry333; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)334; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0xff800000, v0335; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0xff800000, v1, vcc_lo336; GFX1010-NEXT:    s_setpc_b64 s[30:31]337entry:338  %cmp = fcmp one float 0xFFF0000000000000, %arg339  %sel = select i1 %cmp, float %other, float 0xFFF0000000000000340  ret float %sel341}342 343;------------------------------------------------------------------------------344; F64 Tests345;------------------------------------------------------------------------------346 347; Should be folded: f64 fcmp oeq + select with constant in true value348define double @fcmp_select_fold_oeq_f64_imm(double %arg, double %other) {349; GFX900-LABEL: fcmp_select_fold_oeq_f64_imm:350; GFX900:       ; %bb.0: ; %entry351; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)352; GFX900-NEXT:    s_mov_b32 s4, 0x54442d18353; GFX900-NEXT:    s_mov_b32 s5, 0x400921fb354; GFX900-NEXT:    v_cmp_eq_f64_e32 vcc, s[4:5], v[0:1]355; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc356; GFX900-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc357; GFX900-NEXT:    s_setpc_b64 s[30:31]358;359; GFX1010-LABEL: fcmp_select_fold_oeq_f64_imm:360; GFX1010:       ; %bb.0: ; %entry361; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)362; GFX1010-NEXT:    s_mov_b32 s4, 0x54442d18363; GFX1010-NEXT:    s_mov_b32 s5, 0x400921fb364; GFX1010-NEXT:    v_cmp_eq_f64_e32 vcc_lo, s[4:5], v[0:1]365; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc_lo366; GFX1010-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc_lo367; GFX1010-NEXT:    s_setpc_b64 s[30:31]368entry:369  %cmp = fcmp oeq double %arg, 3.141592653589793370  %sel = select i1 %cmp, double 3.141592653589793, double %other371  ret double %sel372}373; Should be folded: f64 fcmp oeq + select with constant in true value (commutative)374define double @fcmp_select_fold_oeq_imm_f64(double %arg, double %other) {375; GFX900-LABEL: fcmp_select_fold_oeq_imm_f64:376; GFX900:       ; %bb.0: ; %entry377; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)378; GFX900-NEXT:    s_mov_b32 s4, 0x54442d18379; GFX900-NEXT:    s_mov_b32 s5, 0x400921fb380; GFX900-NEXT:    v_cmp_eq_f64_e32 vcc, s[4:5], v[0:1]381; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc382; GFX900-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc383; GFX900-NEXT:    s_setpc_b64 s[30:31]384;385; GFX1010-LABEL: fcmp_select_fold_oeq_imm_f64:386; GFX1010:       ; %bb.0: ; %entry387; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)388; GFX1010-NEXT:    s_mov_b32 s4, 0x54442d18389; GFX1010-NEXT:    s_mov_b32 s5, 0x400921fb390; GFX1010-NEXT:    v_cmp_eq_f64_e32 vcc_lo, s[4:5], v[0:1]391; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc_lo392; GFX1010-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc_lo393; GFX1010-NEXT:    s_setpc_b64 s[30:31]394entry:395  %cmp = fcmp oeq double 3.141592653589793, %arg396  %sel = select i1 %cmp, double 3.141592653589793, double %other397  ret double %sel398}399 400; Should be folded: f64 fcmp one + select with constant in false value401define double @fcmp_select_fold_one_f64_imm(double %arg, double %other) {402; GFX900-LABEL: fcmp_select_fold_one_f64_imm:403; GFX900:       ; %bb.0: ; %entry404; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)405; GFX900-NEXT:    s_mov_b32 s4, 0x8b145769406; GFX900-NEXT:    s_mov_b32 s5, 0x4005bf0a407; GFX900-NEXT:    v_cmp_lg_f64_e32 vcc, s[4:5], v[0:1]408; GFX900-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc409; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc410; GFX900-NEXT:    s_setpc_b64 s[30:31]411;412; GFX1010-LABEL: fcmp_select_fold_one_f64_imm:413; GFX1010:       ; %bb.0: ; %entry414; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)415; GFX1010-NEXT:    s_mov_b32 s4, 0x8b145769416; GFX1010-NEXT:    s_mov_b32 s5, 0x4005bf0a417; GFX1010-NEXT:    v_cmp_lg_f64_e32 vcc_lo, s[4:5], v[0:1]418; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo419; GFX1010-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo420; GFX1010-NEXT:    s_setpc_b64 s[30:31]421entry:422  %cmp = fcmp one double %arg, 2.718281828459045423  %sel = select i1 %cmp, double %other, double 2.718281828459045424  ret double %sel425}426; Should be folded: f64 fcmp one + select with constant in false value (commutative)427define double @fcmp_select_fold_one_imm_f64(double %arg, double %other) {428; GFX900-LABEL: fcmp_select_fold_one_imm_f64:429; GFX900:       ; %bb.0: ; %entry430; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)431; GFX900-NEXT:    s_mov_b32 s4, 0x8b145769432; GFX900-NEXT:    s_mov_b32 s5, 0x4005bf0a433; GFX900-NEXT:    v_cmp_lg_f64_e32 vcc, s[4:5], v[0:1]434; GFX900-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc435; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc436; GFX900-NEXT:    s_setpc_b64 s[30:31]437;438; GFX1010-LABEL: fcmp_select_fold_one_imm_f64:439; GFX1010:       ; %bb.0: ; %entry440; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)441; GFX1010-NEXT:    s_mov_b32 s4, 0x8b145769442; GFX1010-NEXT:    s_mov_b32 s5, 0x4005bf0a443; GFX1010-NEXT:    v_cmp_lg_f64_e32 vcc_lo, s[4:5], v[0:1]444; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo445; GFX1010-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc_lo446; GFX1010-NEXT:    s_setpc_b64 s[30:31]447entry:448  %cmp = fcmp one double 2.718281828459045, %arg449  %sel = select i1 %cmp, double %other, double 2.718281828459045450  ret double %sel451}452 453; Should NOT be folded: f64 fcmp oeq with constant in other position454define double @fcmp_select_no_fold_f64_other_pos(double %arg, double %other) {455; GFX900-LABEL: fcmp_select_no_fold_f64_other_pos:456; GFX900:       ; %bb.0: ; %entry457; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)458; GFX900-NEXT:    s_mov_b32 s4, 0x54442d18459; GFX900-NEXT:    s_mov_b32 s5, 0x400921fb460; GFX900-NEXT:    v_cmp_eq_f64_e32 vcc, s[4:5], v[0:1]461; GFX900-NEXT:    v_mov_b32_e32 v4, 0x54442d18462; GFX900-NEXT:    v_mov_b32_e32 v1, 0x400921fb463; GFX900-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc464; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc465; GFX900-NEXT:    s_setpc_b64 s[30:31]466;467; GFX1010-LABEL: fcmp_select_no_fold_f64_other_pos:468; GFX1010:       ; %bb.0: ; %entry469; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)470; GFX1010-NEXT:    s_mov_b32 s4, 0x54442d18471; GFX1010-NEXT:    s_mov_b32 s5, 0x400921fb472; GFX1010-NEXT:    v_cmp_eq_f64_e32 vcc_lo, s[4:5], v[0:1]473; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x54442d18, v2, vcc_lo474; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0x400921fb, v3, vcc_lo475; GFX1010-NEXT:    s_setpc_b64 s[30:31]476entry:477  %cmp = fcmp oeq double %arg, 3.141592653589793478  %sel = select i1 %cmp, double %other, double 3.141592653589793479  ret double %sel480}481 482; Should NOT be folded: f64 fcmp unsupported comparison type483define double @fcmp_select_no_fold_f64_unsupported_cmp(double %arg, double %other) {484; GFX900-LABEL: fcmp_select_no_fold_f64_unsupported_cmp:485; GFX900:       ; %bb.0: ; %entry486; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)487; GFX900-NEXT:    s_mov_b32 s4, 0x54442d18488; GFX900-NEXT:    s_mov_b32 s5, 0x400921fb489; GFX900-NEXT:    v_cmp_gt_f64_e32 vcc, s[4:5], v[0:1]490; GFX900-NEXT:    v_mov_b32_e32 v4, 0x54442d18491; GFX900-NEXT:    v_mov_b32_e32 v1, 0x400921fb492; GFX900-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc493; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc494; GFX900-NEXT:    s_setpc_b64 s[30:31]495;496; GFX1010-LABEL: fcmp_select_no_fold_f64_unsupported_cmp:497; GFX1010:       ; %bb.0: ; %entry498; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)499; GFX1010-NEXT:    s_mov_b32 s4, 0x54442d18500; GFX1010-NEXT:    s_mov_b32 s5, 0x400921fb501; GFX1010-NEXT:    v_cmp_gt_f64_e32 vcc_lo, s[4:5], v[0:1]502; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x54442d18, v2, vcc_lo503; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0x400921fb, v3, vcc_lo504; GFX1010-NEXT:    s_setpc_b64 s[30:31]505entry:506  %cmp = fcmp olt double %arg, 3.141592653589793507  %sel = select i1 %cmp, double %other, double 3.141592653589793508  ret double %sel509}510 511; Should NOT be folded: imm can be encoded into cndmask512define double @fcmp_select_no_fold_f64_enc_imm(double %arg, double %other) {513; GFX900-LABEL: fcmp_select_no_fold_f64_enc_imm:514; GFX900:       ; %bb.0: ; %entry515; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)516; GFX900-NEXT:    v_cmp_neq_f64_e32 vcc, 1.0, v[0:1]517; GFX900-NEXT:    v_mov_b32_e32 v1, 0x3ff00000518; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc519; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc520; GFX900-NEXT:    s_setpc_b64 s[30:31]521;522; GFX1010-LABEL: fcmp_select_no_fold_f64_enc_imm:523; GFX1010:       ; %bb.0: ; %entry524; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)525; GFX1010-NEXT:    v_cmp_neq_f64_e32 vcc_lo, 1.0, v[0:1]526; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc_lo527; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0x3ff00000, v3, vcc_lo528; GFX1010-NEXT:    s_setpc_b64 s[30:31]529entry:530  %cmp = fcmp oeq double %arg, 1.0531  %sel = select i1 %cmp, double 1.0, double %other532  ret double %sel533}534 535; Should NOT be folded: imm can be encoded into cndmask536define double @fcmp_select_no_fold_f64_enc_imm_2(double %arg, double %other) {537; GFX900-LABEL: fcmp_select_no_fold_f64_enc_imm_2:538; GFX900:       ; %bb.0: ; %entry539; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)540; GFX900-NEXT:    v_cmp_lg_f64_e32 vcc, -4.0, v[0:1]541; GFX900-NEXT:    v_mov_b32_e32 v1, 0xc0100000542; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc543; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc544; GFX900-NEXT:    s_setpc_b64 s[30:31]545;546; GFX1010-LABEL: fcmp_select_no_fold_f64_enc_imm_2:547; GFX1010:       ; %bb.0: ; %entry548; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)549; GFX1010-NEXT:    v_cmp_lg_f64_e32 vcc_lo, -4.0, v[0:1]550; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc_lo551; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0xc0100000, v3, vcc_lo552; GFX1010-NEXT:    s_setpc_b64 s[30:31]553entry:554  %cmp = fcmp one double -4.0, %arg555  %sel = select i1 %cmp, double %other, double -4.0556  ret double %sel557}558 559; Should NOT be folded: f64 fcmp oeq with zero constant560define double @fcmp_select_no_fold_oeq_f64_zero(double %arg, double %other) {561; GFX900-LABEL: fcmp_select_no_fold_oeq_f64_zero:562; GFX900:       ; %bb.0: ; %entry563; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)564; GFX900-NEXT:    v_cmp_neq_f64_e32 vcc, 0, v[0:1]565; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc566; GFX900-NEXT:    v_cndmask_b32_e32 v1, 0, v3, vcc567; GFX900-NEXT:    s_setpc_b64 s[30:31]568;569; GFX1010-LABEL: fcmp_select_no_fold_oeq_f64_zero:570; GFX1010:       ; %bb.0: ; %entry571; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)572; GFX1010-NEXT:    v_cmp_neq_f64_e32 vcc_lo, 0, v[0:1]573; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc_lo574; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0, v3, vcc_lo575; GFX1010-NEXT:    s_setpc_b64 s[30:31]576entry:577  %cmp = fcmp oeq double %arg, 0.0578  %sel = select i1 %cmp, double 0.0, double %other579  ret double %sel580}581 582; Should NOT be folded: f64 fcmp one with negative zero constant583define double @fcmp_select_no_fold_one_f64_negzero(double %arg, double %other) {584; GFX900-LABEL: fcmp_select_no_fold_one_f64_negzero:585; GFX900:       ; %bb.0: ; %entry586; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)587; GFX900-NEXT:    s_mov_b32 s4, 0588; GFX900-NEXT:    s_brev_b32 s5, 1589; GFX900-NEXT:    v_cmp_lg_f64_e32 vcc, s[4:5], v[0:1]590; GFX900-NEXT:    v_bfrev_b32_e32 v1, 1591; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc592; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc593; GFX900-NEXT:    s_setpc_b64 s[30:31]594;595; GFX1010-LABEL: fcmp_select_no_fold_one_f64_negzero:596; GFX1010:       ; %bb.0: ; %entry597; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)598; GFX1010-NEXT:    v_cmp_lg_f64_e32 vcc_lo, 0x80000000, v[0:1]599; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc_lo600; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0x80000000, v3, vcc_lo601; GFX1010-NEXT:    s_setpc_b64 s[30:31]602entry:603  %cmp = fcmp one double -0.0, %arg604  %sel = select i1 %cmp, double %other, double -0.0605  ret double %sel606}607 608; Should NOT be folded: f64 different constants609define double @fcmp_select_no_fold_f64_different_const(double %arg, double %other) {610; GFX900-LABEL: fcmp_select_no_fold_f64_different_const:611; GFX900:       ; %bb.0: ; %entry612; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)613; GFX900-NEXT:    s_mov_b32 s4, 0x54442d18614; GFX900-NEXT:    s_mov_b32 s5, 0x400921fb615; GFX900-NEXT:    v_cmp_neq_f64_e32 vcc, s[4:5], v[0:1]616; GFX900-NEXT:    v_mov_b32_e32 v4, 0x8b145769617; GFX900-NEXT:    v_mov_b32_e32 v1, 0x4005bf0a618; GFX900-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc619; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc620; GFX900-NEXT:    s_setpc_b64 s[30:31]621;622; GFX1010-LABEL: fcmp_select_no_fold_f64_different_const:623; GFX1010:       ; %bb.0: ; %entry624; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)625; GFX1010-NEXT:    s_mov_b32 s4, 0x54442d18626; GFX1010-NEXT:    s_mov_b32 s5, 0x400921fb627; GFX1010-NEXT:    v_cmp_neq_f64_e32 vcc_lo, s[4:5], v[0:1]628; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x8b145769, v2, vcc_lo629; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0x4005bf0a, v3, vcc_lo630; GFX1010-NEXT:    s_setpc_b64 s[30:31]631entry:632  %cmp = fcmp oeq double %arg, 3.141592653589793633  %sel = select i1 %cmp, double 2.718281828459045, double %other634  ret double %sel635}636 637; Should NOT be folded: f64 fcmp oeq with NaN constant638; fcmp oeq with NaN always returns false, so select always chooses %other639define double @fcmp_select_no_fold_nan_f64(double %arg, double %other) {640; GFX900-LABEL: fcmp_select_no_fold_nan_f64:641; GFX900:       ; %bb.0: ; %entry642; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)643; GFX900-NEXT:    v_mov_b32_e32 v1, v3644; GFX900-NEXT:    v_mov_b32_e32 v0, v2645; GFX900-NEXT:    s_setpc_b64 s[30:31]646;647; GFX1010-LABEL: fcmp_select_no_fold_nan_f64:648; GFX1010:       ; %bb.0: ; %entry649; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)650; GFX1010-NEXT:    v_mov_b32_e32 v1, v3651; GFX1010-NEXT:    v_mov_b32_e32 v0, v2652; GFX1010-NEXT:    s_setpc_b64 s[30:31]653entry:654  %cmp = fcmp oeq double %arg, 0x7FF8000000000000655  %sel = select i1 %cmp, double 0x7FF8000000000000, double %other656  ret double %sel657}658 659; Should NOT be folded: f64 fcmp oeq with NaN constant (commutative variant)660; fcmp oeq with NaN always returns false, so select always chooses %other661define double @fcmp_select_no_fold_nan_f64_comm(double %arg, double %other) {662; GFX900-LABEL: fcmp_select_no_fold_nan_f64_comm:663; GFX900:       ; %bb.0: ; %entry664; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)665; GFX900-NEXT:    v_mov_b32_e32 v1, v3666; GFX900-NEXT:    v_mov_b32_e32 v0, v2667; GFX900-NEXT:    s_setpc_b64 s[30:31]668;669; GFX1010-LABEL: fcmp_select_no_fold_nan_f64_comm:670; GFX1010:       ; %bb.0: ; %entry671; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)672; GFX1010-NEXT:    v_mov_b32_e32 v1, v3673; GFX1010-NEXT:    v_mov_b32_e32 v0, v2674; GFX1010-NEXT:    s_setpc_b64 s[30:31]675entry:676  %cmp = fcmp oeq double 0x7FF8000000000000, %arg677  %sel = select i1 %cmp, double 0x7FF8000000000000, double %other678  ret double %sel679}680 681; Should NOT be folded: f64 fcmp one with NaN constant682; fcmp one with NaN always returns false, so select always chooses the NaN constant683define double @fcmp_select_no_fold_nan_f64_one(double %arg, double %other) {684; GFX900-LABEL: fcmp_select_no_fold_nan_f64_one:685; GFX900:       ; %bb.0: ; %entry686; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)687; GFX900-NEXT:    v_mov_b32_e32 v0, 0688; GFX900-NEXT:    v_mov_b32_e32 v1, 0x7ff80000689; GFX900-NEXT:    s_setpc_b64 s[30:31]690;691; GFX1010-LABEL: fcmp_select_no_fold_nan_f64_one:692; GFX1010:       ; %bb.0: ; %entry693; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)694; GFX1010-NEXT:    v_mov_b32_e32 v0, 0695; GFX1010-NEXT:    v_mov_b32_e32 v1, 0x7ff80000696; GFX1010-NEXT:    s_setpc_b64 s[30:31]697entry:698  %cmp = fcmp one double %arg, 0x7FF8000000000000699  %sel = select i1 %cmp, double %other, double 0x7FF8000000000000700  ret double %sel701}702 703; Should NOT be folded: f64 fcmp one with NaN constant (commutative variant)704; fcmp one with NaN always returns false, so select always chooses the NaN constant705define double @fcmp_select_no_fold_nan_f64_one_comm(double %arg, double %other) {706; GFX900-LABEL: fcmp_select_no_fold_nan_f64_one_comm:707; GFX900:       ; %bb.0: ; %entry708; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)709; GFX900-NEXT:    v_mov_b32_e32 v0, 0710; GFX900-NEXT:    v_mov_b32_e32 v1, 0x7ff80000711; GFX900-NEXT:    s_setpc_b64 s[30:31]712;713; GFX1010-LABEL: fcmp_select_no_fold_nan_f64_one_comm:714; GFX1010:       ; %bb.0: ; %entry715; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)716; GFX1010-NEXT:    v_mov_b32_e32 v0, 0717; GFX1010-NEXT:    v_mov_b32_e32 v1, 0x7ff80000718; GFX1010-NEXT:    s_setpc_b64 s[30:31]719entry:720  %cmp = fcmp one double 0x7FF8000000000000, %arg721  %sel = select i1 %cmp, double %other, double 0x7FF8000000000000722  ret double %sel723}724 725; Should NOT be folded: f64 fcmp oeq with positive infinity726; Infinity values should bypass the optimization, generating unfolded code727define double @fcmp_select_no_fold_posinf_f64(double %arg, double %other) {728; GFX900-LABEL: fcmp_select_no_fold_posinf_f64:729; GFX900:       ; %bb.0: ; %entry730; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)731; GFX900-NEXT:    s_mov_b32 s4, 0732; GFX900-NEXT:    s_mov_b32 s5, 0x7ff00000733; GFX900-NEXT:    v_cmp_neq_f64_e32 vcc, s[4:5], v[0:1]734; GFX900-NEXT:    v_mov_b32_e32 v1, 0x7ff00000735; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc736; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc737; GFX900-NEXT:    s_setpc_b64 s[30:31]738;739; GFX1010-LABEL: fcmp_select_no_fold_posinf_f64:740; GFX1010:       ; %bb.0: ; %entry741; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)742; GFX1010-NEXT:    v_cmp_neq_f64_e32 vcc_lo, 0x7ff00000, v[0:1]743; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc_lo744; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0x7ff00000, v3, vcc_lo745; GFX1010-NEXT:    s_setpc_b64 s[30:31]746entry:747  %cmp = fcmp oeq double %arg, 0x7FF0000000000000748  %sel = select i1 %cmp, double 0x7FF0000000000000, double %other749  ret double %sel750}751 752; Should NOT be folded: f64 fcmp oeq with negative infinity753; Infinity values should bypass the optimization, generating unfolded code754define double @fcmp_select_no_fold_neginf_f64(double %arg, double %other) {755; GFX900-LABEL: fcmp_select_no_fold_neginf_f64:756; GFX900:       ; %bb.0: ; %entry757; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)758; GFX900-NEXT:    s_mov_b32 s4, 0759; GFX900-NEXT:    s_mov_b32 s5, 0xfff00000760; GFX900-NEXT:    v_cmp_neq_f64_e32 vcc, s[4:5], v[0:1]761; GFX900-NEXT:    v_mov_b32_e32 v1, 0xfff00000762; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc763; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc764; GFX900-NEXT:    s_setpc_b64 s[30:31]765;766; GFX1010-LABEL: fcmp_select_no_fold_neginf_f64:767; GFX1010:       ; %bb.0: ; %entry768; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)769; GFX1010-NEXT:    v_cmp_neq_f64_e32 vcc_lo, 0xfff00000, v[0:1]770; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc_lo771; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0xfff00000, v3, vcc_lo772; GFX1010-NEXT:    s_setpc_b64 s[30:31]773entry:774  %cmp = fcmp oeq double %arg, 0xFFF0000000000000775  %sel = select i1 %cmp, double 0xFFF0000000000000, double %other776  ret double %sel777}778 779; Should NOT be folded: f64 fcmp oeq with positive infinity (commutative variant)780; Infinity values should bypass the optimization, generating unfolded code781define double @fcmp_select_no_fold_posinf_f64_comm(double %arg, double %other) {782; GFX900-LABEL: fcmp_select_no_fold_posinf_f64_comm:783; GFX900:       ; %bb.0: ; %entry784; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)785; GFX900-NEXT:    s_mov_b32 s4, 0786; GFX900-NEXT:    s_mov_b32 s5, 0x7ff00000787; GFX900-NEXT:    v_cmp_neq_f64_e32 vcc, s[4:5], v[0:1]788; GFX900-NEXT:    v_mov_b32_e32 v1, 0x7ff00000789; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc790; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc791; GFX900-NEXT:    s_setpc_b64 s[30:31]792;793; GFX1010-LABEL: fcmp_select_no_fold_posinf_f64_comm:794; GFX1010:       ; %bb.0: ; %entry795; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)796; GFX1010-NEXT:    v_cmp_neq_f64_e32 vcc_lo, 0x7ff00000, v[0:1]797; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc_lo798; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0x7ff00000, v3, vcc_lo799; GFX1010-NEXT:    s_setpc_b64 s[30:31]800entry:801  %cmp = fcmp oeq double 0x7FF0000000000000, %arg802  %sel = select i1 %cmp, double 0x7FF0000000000000, double %other803  ret double %sel804}805 806; Should NOT be folded: f64 fcmp oeq with negative infinity (commutative variant)807; Infinity values should bypass the optimization, generating unfolded code808define double @fcmp_select_no_fold_neginf_f64_comm(double %arg, double %other) {809; GFX900-LABEL: fcmp_select_no_fold_neginf_f64_comm:810; GFX900:       ; %bb.0: ; %entry811; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)812; GFX900-NEXT:    s_mov_b32 s4, 0813; GFX900-NEXT:    s_mov_b32 s5, 0xfff00000814; GFX900-NEXT:    v_cmp_neq_f64_e32 vcc, s[4:5], v[0:1]815; GFX900-NEXT:    v_mov_b32_e32 v1, 0xfff00000816; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc817; GFX900-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc818; GFX900-NEXT:    s_setpc_b64 s[30:31]819;820; GFX1010-LABEL: fcmp_select_no_fold_neginf_f64_comm:821; GFX1010:       ; %bb.0: ; %entry822; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)823; GFX1010-NEXT:    v_cmp_neq_f64_e32 vcc_lo, 0xfff00000, v[0:1]824; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v2, vcc_lo825; GFX1010-NEXT:    v_cndmask_b32_e32 v1, 0xfff00000, v3, vcc_lo826; GFX1010-NEXT:    s_setpc_b64 s[30:31]827entry:828  %cmp = fcmp oeq double 0xFFF0000000000000, %arg829  %sel = select i1 %cmp, double 0xFFF0000000000000, double %other830  ret double %sel831}832 833;------------------------------------------------------------------------------834; F16 Tests835;------------------------------------------------------------------------------836 837; Should be folded: f16 fcmp oeq + select with constant in true value838define half @fcmp_select_fold_oeq_f16_imm(half %arg, half %other) {839; GFX900-LABEL: fcmp_select_fold_oeq_f16_imm:840; GFX900:       ; %bb.0: ; %entry841; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)842; GFX900-NEXT:    s_movk_i32 s4, 0x4248843; GFX900-NEXT:    v_cmp_eq_f16_e32 vcc, s4, v0844; GFX900-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc845; GFX900-NEXT:    s_setpc_b64 s[30:31]846;847; GFX1010-LABEL: fcmp_select_fold_oeq_f16_imm:848; GFX1010:       ; %bb.0: ; %entry849; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)850; GFX1010-NEXT:    v_cmp_eq_f16_e32 vcc_lo, 0x4248, v0851; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo852; GFX1010-NEXT:    s_setpc_b64 s[30:31]853entry:854  %cmp = fcmp oeq half %arg, 0xH4248855  %sel = select i1 %cmp, half 0xH4248, half %other856  ret half %sel857}858 859; Should be folded: f16 fcmp oeq + select with constant in true value (commutative)860define half @fcmp_select_fold_oeq_imm_f16(half %arg, half %other) {861; GFX900-LABEL: fcmp_select_fold_oeq_imm_f16:862; GFX900:       ; %bb.0: ; %entry863; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)864; GFX900-NEXT:    s_movk_i32 s4, 0x4248865; GFX900-NEXT:    v_cmp_eq_f16_e32 vcc, s4, v0866; GFX900-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc867; GFX900-NEXT:    s_setpc_b64 s[30:31]868;869; GFX1010-LABEL: fcmp_select_fold_oeq_imm_f16:870; GFX1010:       ; %bb.0: ; %entry871; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)872; GFX1010-NEXT:    v_cmp_eq_f16_e32 vcc_lo, 0x4248, v0873; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo874; GFX1010-NEXT:    s_setpc_b64 s[30:31]875entry:876  %cmp = fcmp oeq half 0xH4248, %arg877  %sel = select i1 %cmp, half 0xH4248, half %other878  ret half %sel879}880 881; Should be folded: f16 fcmp one + select with constant in false value882define half @fcmp_select_fold_one_f16_imm(half %arg, half %other) {883; GFX900-LABEL: fcmp_select_fold_one_f16_imm:884; GFX900:       ; %bb.0: ; %entry885; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)886; GFX900-NEXT:    s_movk_i32 s4, 0x4020887; GFX900-NEXT:    v_cmp_lg_f16_e32 vcc, s4, v0888; GFX900-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc889; GFX900-NEXT:    s_setpc_b64 s[30:31]890;891; GFX1010-LABEL: fcmp_select_fold_one_f16_imm:892; GFX1010:       ; %bb.0: ; %entry893; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)894; GFX1010-NEXT:    v_cmp_lg_f16_e32 vcc_lo, 0x4020, v0895; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo896; GFX1010-NEXT:    s_setpc_b64 s[30:31]897entry:898  %cmp = fcmp one half %arg, 0xH4020899  %sel = select i1 %cmp, half %other, half 0xH4020900  ret half %sel901}902 903; Should be folded: f16 fcmp one + select with constant in false value (commutative)904define half @fcmp_select_fold_one_imm_f16(half %arg, half %other) {905; GFX900-LABEL: fcmp_select_fold_one_imm_f16:906; GFX900:       ; %bb.0: ; %entry907; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)908; GFX900-NEXT:    s_movk_i32 s4, 0x4020909; GFX900-NEXT:    v_cmp_lg_f16_e32 vcc, s4, v0910; GFX900-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc911; GFX900-NEXT:    s_setpc_b64 s[30:31]912;913; GFX1010-LABEL: fcmp_select_fold_one_imm_f16:914; GFX1010:       ; %bb.0: ; %entry915; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)916; GFX1010-NEXT:    v_cmp_lg_f16_e32 vcc_lo, 0x4020, v0917; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo918; GFX1010-NEXT:    s_setpc_b64 s[30:31]919entry:920  %cmp = fcmp one half 0xH4020, %arg921  %sel = select i1 %cmp, half %other, half 0xH4020922  ret half %sel923}924 925; Should NOT be folded: different constants926define half @fcmp_select_no_fold_f16_different_const(half %arg, half %other) {927; GFX900-LABEL: fcmp_select_no_fold_f16_different_const:928; GFX900:       ; %bb.0: ; %entry929; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)930; GFX900-NEXT:    s_movk_i32 s4, 0x4248931; GFX900-NEXT:    v_mov_b32_e32 v2, 0x4300932; GFX900-NEXT:    v_cmp_neq_f16_e32 vcc, s4, v0933; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc934; GFX900-NEXT:    s_setpc_b64 s[30:31]935;936; GFX1010-LABEL: fcmp_select_no_fold_f16_different_const:937; GFX1010:       ; %bb.0: ; %entry938; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)939; GFX1010-NEXT:    v_cmp_neq_f16_e32 vcc_lo, 0x4248, v0940; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x4300, v1, vcc_lo941; GFX1010-NEXT:    s_setpc_b64 s[30:31]942entry:943  %cmp = fcmp oeq half %arg, 0xH4248944  %sel = select i1 %cmp, half 0xH4300, half %other945  ret half %sel946}947 948; Should NOT be folded: NaN values bypass optimization949define half @fcmp_select_no_fold_nan_f16(half %arg, half %other) {950; GFX900-LABEL: fcmp_select_no_fold_nan_f16:951; GFX900:       ; %bb.0: ; %entry952; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)953; GFX900-NEXT:    v_mov_b32_e32 v0, v1954; GFX900-NEXT:    s_setpc_b64 s[30:31]955;956; GFX1010-LABEL: fcmp_select_no_fold_nan_f16:957; GFX1010:       ; %bb.0: ; %entry958; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)959; GFX1010-NEXT:    v_mov_b32_e32 v0, v1960; GFX1010-NEXT:    s_setpc_b64 s[30:31]961entry:962  %cmp = fcmp oeq half %arg, 0xH7e00963  %sel = select i1 %cmp, half 0xH7e00, half %other964  ret half %sel965}966 967; Should NOT be folded: f16 fcmp one with NaN constant968define half @fcmp_select_no_fold_nan_f16_one(half %arg, half %other) {969; GFX900-LABEL: fcmp_select_no_fold_nan_f16_one:970; GFX900:       ; %bb.0: ; %entry971; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)972; GFX900-NEXT:    v_mov_b32_e32 v0, 0x7e00973; GFX900-NEXT:    s_setpc_b64 s[30:31]974;975; GFX1010-LABEL: fcmp_select_no_fold_nan_f16_one:976; GFX1010:       ; %bb.0: ; %entry977; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)978; GFX1010-NEXT:    v_mov_b32_e32 v0, 0x7e00979; GFX1010-NEXT:    s_setpc_b64 s[30:31]980entry:981  %cmp = fcmp one half %arg, 0xH7e00982  %sel = select i1 %cmp, half %other, half 0xH7e00983  ret half %sel984}985 986; Should NOT be folded: f16 fcmp one with +Inf constant987define half @fcmp_select_no_fold_posinf_f16_one(half %arg, half %other) {988; GFX900-LABEL: fcmp_select_no_fold_posinf_f16_one:989; GFX900:       ; %bb.0: ; %entry990; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)991; GFX900-NEXT:    s_movk_i32 s4, 0x7c00992; GFX900-NEXT:    v_mov_b32_e32 v2, 0x7c00993; GFX900-NEXT:    v_cmp_lg_f16_e32 vcc, s4, v0994; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc995; GFX900-NEXT:    s_setpc_b64 s[30:31]996;997; GFX1010-LABEL: fcmp_select_no_fold_posinf_f16_one:998; GFX1010:       ; %bb.0: ; %entry999; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1000; GFX1010-NEXT:    v_cmp_lg_f16_e32 vcc_lo, 0x7c00, v01001; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x7c00, v1, vcc_lo1002; GFX1010-NEXT:    s_setpc_b64 s[30:31]1003entry:1004  %cmp = fcmp one half %arg, 0xH7c001005  %sel = select i1 %cmp, half %other, half 0xH7c001006  ret half %sel1007}1008 1009; Should NOT be folded: f16 fcmp one with -Inf constant1010define half @fcmp_select_no_fold_neginf_f16_one(half %arg, half %other) {1011; GFX900-LABEL: fcmp_select_no_fold_neginf_f16_one:1012; GFX900:       ; %bb.0: ; %entry1013; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1014; GFX900-NEXT:    s_mov_b32 s4, 0xfc001015; GFX900-NEXT:    v_mov_b32_e32 v2, 0xfc001016; GFX900-NEXT:    v_cmp_lg_f16_e32 vcc, s4, v01017; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1018; GFX900-NEXT:    s_setpc_b64 s[30:31]1019;1020; GFX1010-LABEL: fcmp_select_no_fold_neginf_f16_one:1021; GFX1010:       ; %bb.0: ; %entry1022; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1023; GFX1010-NEXT:    v_cmp_lg_f16_e32 vcc_lo, 0xfc00, v01024; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0xfc00, v1, vcc_lo1025; GFX1010-NEXT:    s_setpc_b64 s[30:31]1026entry:1027  %cmp = fcmp one half %arg, 0xHfc001028  %sel = select i1 %cmp, half %other, half 0xHfc001029  ret half %sel1030}1031; Should NOT be folded: f16 fcmp oeq with zero constant1032define half @fcmp_select_no_fold_oeq_f16_zero(half %arg, half %other) {1033; GFX900-LABEL: fcmp_select_no_fold_oeq_f16_zero:1034; GFX900:       ; %bb.0: ; %entry1035; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1036; GFX900-NEXT:    v_cmp_neq_f16_e32 vcc, 0, v01037; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc1038; GFX900-NEXT:    s_setpc_b64 s[30:31]1039;1040; GFX1010-LABEL: fcmp_select_no_fold_oeq_f16_zero:1041; GFX1010:       ; %bb.0: ; %entry1042; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1043; GFX1010-NEXT:    v_cmp_neq_f16_e32 vcc_lo, 0, v01044; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc_lo1045; GFX1010-NEXT:    s_setpc_b64 s[30:31]1046entry:1047  %cmp = fcmp oeq half %arg, 0xH00001048  %sel = select i1 %cmp, half 0xH0000, half %other1049  ret half %sel1050}1051; Should NOT be folded: f16 fcmp one with negative zero constant1052define half @fcmp_select_no_fold_one_f16_negzero(half %arg, half %other) {1053; GFX900-LABEL: fcmp_select_no_fold_one_f16_negzero:1054; GFX900:       ; %bb.0: ; %entry1055; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1056; GFX900-NEXT:    s_mov_b32 s4, 0x80001057; GFX900-NEXT:    v_mov_b32_e32 v2, 0x80001058; GFX900-NEXT:    v_cmp_lg_f16_e32 vcc, s4, v01059; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1060; GFX900-NEXT:    s_setpc_b64 s[30:31]1061;1062; GFX1010-LABEL: fcmp_select_no_fold_one_f16_negzero:1063; GFX1010:       ; %bb.0: ; %entry1064; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1065; GFX1010-NEXT:    v_cmp_lg_f16_e32 vcc_lo, 0x8000, v01066; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x8000, v1, vcc_lo1067; GFX1010-NEXT:    s_setpc_b64 s[30:31]1068entry:1069  %cmp = fcmp one half 0xH8000, %arg1070  %sel = select i1 %cmp, half %other, half 0xH80001071  ret half %sel1072}1073 1074; Should NOT be folded: f16 fcmp oeq with constant in other position1075define half @fcmp_select_no_fold_f16_other_pos(half %arg, half %other) {1076; GFX900-LABEL: fcmp_select_no_fold_f16_other_pos:1077; GFX900:       ; %bb.0: ; %entry1078; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1079; GFX900-NEXT:    s_movk_i32 s4, 0x42481080; GFX900-NEXT:    v_mov_b32_e32 v2, 0x42481081; GFX900-NEXT:    v_cmp_eq_f16_e32 vcc, s4, v01082; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1083; GFX900-NEXT:    s_setpc_b64 s[30:31]1084;1085; GFX1010-LABEL: fcmp_select_no_fold_f16_other_pos:1086; GFX1010:       ; %bb.0: ; %entry1087; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1088; GFX1010-NEXT:    v_cmp_eq_f16_e32 vcc_lo, 0x4248, v01089; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x4248, v1, vcc_lo1090; GFX1010-NEXT:    s_setpc_b64 s[30:31]1091entry:1092  %cmp = fcmp oeq half %arg, 0xH42481093  %sel = select i1 %cmp, half %other, half 0xH42481094  ret half %sel1095}1096 1097; Should NOT be folded: f16 unsupported comparison type1098define half @fcmp_select_no_fold_f16_unsupported_cmp(half %arg, half %other) {1099; GFX900-LABEL: fcmp_select_no_fold_f16_unsupported_cmp:1100; GFX900:       ; %bb.0: ; %entry1101; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1102; GFX900-NEXT:    s_movk_i32 s4, 0x42481103; GFX900-NEXT:    v_mov_b32_e32 v2, 0x42481104; GFX900-NEXT:    v_cmp_gt_f16_e32 vcc, s4, v01105; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1106; GFX900-NEXT:    s_setpc_b64 s[30:31]1107;1108; GFX1010-LABEL: fcmp_select_no_fold_f16_unsupported_cmp:1109; GFX1010:       ; %bb.0: ; %entry1110; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1111; GFX1010-NEXT:    v_cmp_gt_f16_e32 vcc_lo, 0x4248, v01112; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x4248, v1, vcc_lo1113; GFX1010-NEXT:    s_setpc_b64 s[30:31]1114entry:1115  %cmp = fcmp olt half %arg, 0xH42481116  %sel = select i1 %cmp, half %other, half 0xH42481117  ret half %sel1118}1119 1120;------------------------------------------------------------------------------1121; BF16 Tests1122;------------------------------------------------------------------------------1123 1124; Should be folded: bfloat fcmp oeq + select with constant in true value1125define bfloat @fcmp_select_fold_oeq_bf16_imm(bfloat %arg, bfloat %other) {1126; GFX900-LABEL: fcmp_select_fold_oeq_bf16_imm:1127; GFX900:       ; %bb.0: ; %entry1128; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1129; GFX900-NEXT:    v_lshlrev_b32_e32 v2, 16, v01130; GFX900-NEXT:    s_mov_b32 s4, 0x424800001131; GFX900-NEXT:    v_cmp_eq_f32_e32 vcc, s4, v21132; GFX900-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc1133; GFX900-NEXT:    s_setpc_b64 s[30:31]1134;1135; GFX1010-LABEL: fcmp_select_fold_oeq_bf16_imm:1136; GFX1010:       ; %bb.0: ; %entry1137; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1138; GFX1010-NEXT:    v_lshlrev_b32_e32 v2, 16, v01139; GFX1010-NEXT:    v_cmp_eq_f32_e32 vcc_lo, 0x42480000, v21140; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo1141; GFX1010-NEXT:    s_setpc_b64 s[30:31]1142entry:1143  %cmp = fcmp oeq bfloat %arg, 0xR42481144  %sel = select i1 %cmp, bfloat 0xR4248, bfloat %other1145  ret bfloat %sel1146}1147 1148; Should be folded: bfloat fcmp oeq + select with constant in true value (commutative)1149define bfloat @fcmp_select_fold_oeq_imm_bf16(bfloat %arg, bfloat %other) {1150; GFX900-LABEL: fcmp_select_fold_oeq_imm_bf16:1151; GFX900:       ; %bb.0: ; %entry1152; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1153; GFX900-NEXT:    v_lshlrev_b32_e32 v2, 16, v01154; GFX900-NEXT:    s_mov_b32 s4, 0x424800001155; GFX900-NEXT:    v_cmp_eq_f32_e32 vcc, s4, v21156; GFX900-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc1157; GFX900-NEXT:    s_setpc_b64 s[30:31]1158;1159; GFX1010-LABEL: fcmp_select_fold_oeq_imm_bf16:1160; GFX1010:       ; %bb.0: ; %entry1161; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1162; GFX1010-NEXT:    v_lshlrev_b32_e32 v2, 16, v01163; GFX1010-NEXT:    v_cmp_eq_f32_e32 vcc_lo, 0x42480000, v21164; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo1165; GFX1010-NEXT:    s_setpc_b64 s[30:31]1166entry:1167  %cmp = fcmp oeq bfloat 0xR4248, %arg1168  %sel = select i1 %cmp, bfloat 0xR4248, bfloat %other1169  ret bfloat %sel1170}1171 1172; Should be folded: bfloat fcmp one + select with constant in false value1173define bfloat @fcmp_select_fold_one_bf16_imm(bfloat %arg, bfloat %other) {1174; GFX900-LABEL: fcmp_select_fold_one_bf16_imm:1175; GFX900:       ; %bb.0: ; %entry1176; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1177; GFX900-NEXT:    v_lshlrev_b32_e32 v2, 16, v01178; GFX900-NEXT:    s_mov_b32 s4, 0x402000001179; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v21180; GFX900-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc1181; GFX900-NEXT:    s_setpc_b64 s[30:31]1182;1183; GFX1010-LABEL: fcmp_select_fold_one_bf16_imm:1184; GFX1010:       ; %bb.0: ; %entry1185; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1186; GFX1010-NEXT:    v_lshlrev_b32_e32 v2, 16, v01187; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0x40200000, v21188; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo1189; GFX1010-NEXT:    s_setpc_b64 s[30:31]1190entry:1191  %cmp = fcmp one bfloat %arg, 0xR40201192  %sel = select i1 %cmp, bfloat %other, bfloat 0xR40201193  ret bfloat %sel1194}1195 1196; Should be folded: bfloat fcmp one + select with constant in false value (commutative)1197define bfloat @fcmp_select_fold_one_imm_bf16(bfloat %arg, bfloat %other) {1198; GFX900-LABEL: fcmp_select_fold_one_imm_bf16:1199; GFX900:       ; %bb.0: ; %entry1200; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1201; GFX900-NEXT:    v_lshlrev_b32_e32 v2, 16, v01202; GFX900-NEXT:    s_mov_b32 s4, 0x402000001203; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v21204; GFX900-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc1205; GFX900-NEXT:    s_setpc_b64 s[30:31]1206;1207; GFX1010-LABEL: fcmp_select_fold_one_imm_bf16:1208; GFX1010:       ; %bb.0: ; %entry1209; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1210; GFX1010-NEXT:    v_lshlrev_b32_e32 v2, 16, v01211; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0x40200000, v21212; GFX1010-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo1213; GFX1010-NEXT:    s_setpc_b64 s[30:31]1214entry:1215  %cmp = fcmp one bfloat 0xR4020, %arg1216  %sel = select i1 %cmp, bfloat %other, bfloat 0xR40201217  ret bfloat %sel1218}1219 1220; Should NOT be folded: different constants1221define bfloat @fcmp_select_no_fold_bf16_different_const(bfloat %arg, bfloat %other) {1222; GFX900-LABEL: fcmp_select_no_fold_bf16_different_const:1223; GFX900:       ; %bb.0: ; %entry1224; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1225; GFX900-NEXT:    v_lshlrev_b32_e32 v0, 16, v01226; GFX900-NEXT:    s_mov_b32 s4, 0x424800001227; GFX900-NEXT:    v_mov_b32_e32 v2, 0x43001228; GFX900-NEXT:    v_cmp_neq_f32_e32 vcc, s4, v01229; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1230; GFX900-NEXT:    s_setpc_b64 s[30:31]1231;1232; GFX1010-LABEL: fcmp_select_no_fold_bf16_different_const:1233; GFX1010:       ; %bb.0: ; %entry1234; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1235; GFX1010-NEXT:    v_lshlrev_b32_e32 v0, 16, v01236; GFX1010-NEXT:    v_cmp_neq_f32_e32 vcc_lo, 0x42480000, v01237; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x4300, v1, vcc_lo1238; GFX1010-NEXT:    s_setpc_b64 s[30:31]1239entry:1240  %cmp = fcmp oeq bfloat %arg, 0xR42481241  %sel = select i1 %cmp, bfloat 0xR4300, bfloat %other1242  ret bfloat %sel1243}1244 1245; Should NOT be folded: NaN values bypass optimization1246define bfloat @fcmp_select_no_fold_nan_bf16(bfloat %arg, bfloat %other) {1247; GFX900-LABEL: fcmp_select_no_fold_nan_bf16:1248; GFX900:       ; %bb.0: ; %entry1249; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1250; GFX900-NEXT:    v_mov_b32_e32 v0, v11251; GFX900-NEXT:    s_setpc_b64 s[30:31]1252;1253; GFX1010-LABEL: fcmp_select_no_fold_nan_bf16:1254; GFX1010:       ; %bb.0: ; %entry1255; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1256; GFX1010-NEXT:    v_mov_b32_e32 v0, v11257; GFX1010-NEXT:    s_setpc_b64 s[30:31]1258entry:1259  %cmp = fcmp oeq bfloat %arg, 0xR7FC01260  %sel = select i1 %cmp, bfloat 0xR7FC0, bfloat %other1261  ret bfloat %sel1262}1263 1264; Should NOT be folded: bfloat fcmp one with NaN constant1265define bfloat @fcmp_select_no_fold_nan_bf16_one(bfloat %arg, bfloat %other) {1266; GFX900-LABEL: fcmp_select_no_fold_nan_bf16_one:1267; GFX900:       ; %bb.0: ; %entry1268; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1269; GFX900-NEXT:    v_mov_b32_e32 v0, 0x7fc01270; GFX900-NEXT:    s_setpc_b64 s[30:31]1271;1272; GFX1010-LABEL: fcmp_select_no_fold_nan_bf16_one:1273; GFX1010:       ; %bb.0: ; %entry1274; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1275; GFX1010-NEXT:    v_mov_b32_e32 v0, 0x7fc01276; GFX1010-NEXT:    s_setpc_b64 s[30:31]1277entry:1278  %cmp = fcmp one bfloat %arg, 0xR7FC01279  %sel = select i1 %cmp, bfloat %other, bfloat 0xR7FC01280  ret bfloat %sel1281}1282 1283; Should NOT be folded: bfloat fcmp one with +Inf constant1284define bfloat @fcmp_select_no_fold_posinf_bf16_one(bfloat %arg, bfloat %other) {1285; GFX900-LABEL: fcmp_select_no_fold_posinf_bf16_one:1286; GFX900:       ; %bb.0: ; %entry1287; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1288; GFX900-NEXT:    v_lshlrev_b32_e32 v0, 16, v01289; GFX900-NEXT:    s_mov_b32 s4, 0x7f8000001290; GFX900-NEXT:    v_mov_b32_e32 v2, 0x7f801291; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v01292; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1293; GFX900-NEXT:    s_setpc_b64 s[30:31]1294;1295; GFX1010-LABEL: fcmp_select_no_fold_posinf_bf16_one:1296; GFX1010:       ; %bb.0: ; %entry1297; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1298; GFX1010-NEXT:    v_lshlrev_b32_e32 v0, 16, v01299; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0x7f800000, v01300; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x7f80, v1, vcc_lo1301; GFX1010-NEXT:    s_setpc_b64 s[30:31]1302entry:1303  %cmp = fcmp one bfloat %arg, 0xR7F801304  %sel = select i1 %cmp, bfloat %other, bfloat 0xR7F801305  ret bfloat %sel1306}1307 1308; Should NOT be folded: bfloat fcmp one with -Inf constant1309define bfloat @fcmp_select_no_fold_neginf_bf16_one(bfloat %arg, bfloat %other) {1310; GFX900-LABEL: fcmp_select_no_fold_neginf_bf16_one:1311; GFX900:       ; %bb.0: ; %entry1312; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1313; GFX900-NEXT:    v_lshlrev_b32_e32 v0, 16, v01314; GFX900-NEXT:    s_mov_b32 s4, 0xff8000001315; GFX900-NEXT:    v_mov_b32_e32 v2, 0xffffff801316; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v01317; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1318; GFX900-NEXT:    s_setpc_b64 s[30:31]1319;1320; GFX1010-LABEL: fcmp_select_no_fold_neginf_bf16_one:1321; GFX1010:       ; %bb.0: ; %entry1322; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1323; GFX1010-NEXT:    v_lshlrev_b32_e32 v0, 16, v01324; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0xff800000, v01325; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0xffffff80, v1, vcc_lo1326; GFX1010-NEXT:    s_setpc_b64 s[30:31]1327entry:1328  %cmp = fcmp one bfloat %arg, 0xRFF801329  %sel = select i1 %cmp, bfloat %other, bfloat 0xRFF801330  ret bfloat %sel1331}1332 1333; Should NOT be folded: bfloat fcmp oeq with zero constant1334define bfloat @fcmp_select_no_fold_oeq_bf16_zero(bfloat %arg, bfloat %other) {1335; GFX900-LABEL: fcmp_select_no_fold_oeq_bf16_zero:1336; GFX900:       ; %bb.0: ; %entry1337; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1338; GFX900-NEXT:    v_lshlrev_b32_e32 v0, 16, v01339; GFX900-NEXT:    v_cmp_neq_f32_e32 vcc, 0, v01340; GFX900-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc1341; GFX900-NEXT:    s_setpc_b64 s[30:31]1342;1343; GFX1010-LABEL: fcmp_select_no_fold_oeq_bf16_zero:1344; GFX1010:       ; %bb.0: ; %entry1345; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1346; GFX1010-NEXT:    v_lshlrev_b32_e32 v0, 16, v01347; GFX1010-NEXT:    v_cmp_neq_f32_e32 vcc_lo, 0, v01348; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc_lo1349; GFX1010-NEXT:    s_setpc_b64 s[30:31]1350entry:1351  %cmp = fcmp oeq bfloat %arg, 0xR00001352  %sel = select i1 %cmp, bfloat 0xR0000, bfloat %other1353  ret bfloat %sel1354}1355 1356; Should NOT be folded: bfloat fcmp one with negative zero constant1357define bfloat @fcmp_select_no_fold_one_bf16_negzero(bfloat %arg, bfloat %other) {1358; GFX900-LABEL: fcmp_select_no_fold_one_bf16_negzero:1359; GFX900:       ; %bb.0: ; %entry1360; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1361; GFX900-NEXT:    v_lshlrev_b32_e32 v0, 16, v01362; GFX900-NEXT:    s_brev_b32 s4, 11363; GFX900-NEXT:    v_mov_b32_e32 v2, 0xffff80001364; GFX900-NEXT:    v_cmp_lg_f32_e32 vcc, s4, v01365; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1366; GFX900-NEXT:    s_setpc_b64 s[30:31]1367;1368; GFX1010-LABEL: fcmp_select_no_fold_one_bf16_negzero:1369; GFX1010:       ; %bb.0: ; %entry1370; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1371; GFX1010-NEXT:    v_lshlrev_b32_e32 v0, 16, v01372; GFX1010-NEXT:    v_cmp_lg_f32_e32 vcc_lo, 0x80000000, v01373; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0xffff8000, v1, vcc_lo1374; GFX1010-NEXT:    s_setpc_b64 s[30:31]1375entry:1376  %cmp = fcmp one bfloat 0xR8000, %arg1377  %sel = select i1 %cmp, bfloat %other, bfloat 0xR80001378  ret bfloat %sel1379}1380 1381; Should NOT be folded: bfloat fcmp oeq with constant in other position1382define bfloat @fcmp_select_no_fold_bf16_other_pos(bfloat %arg, bfloat %other) {1383; GFX900-LABEL: fcmp_select_no_fold_bf16_other_pos:1384; GFX900:       ; %bb.0: ; %entry1385; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1386; GFX900-NEXT:    v_lshlrev_b32_e32 v0, 16, v01387; GFX900-NEXT:    s_mov_b32 s4, 0x424800001388; GFX900-NEXT:    v_mov_b32_e32 v2, 0x42481389; GFX900-NEXT:    v_cmp_eq_f32_e32 vcc, s4, v01390; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1391; GFX900-NEXT:    s_setpc_b64 s[30:31]1392;1393; GFX1010-LABEL: fcmp_select_no_fold_bf16_other_pos:1394; GFX1010:       ; %bb.0: ; %entry1395; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1396; GFX1010-NEXT:    v_lshlrev_b32_e32 v0, 16, v01397; GFX1010-NEXT:    v_cmp_eq_f32_e32 vcc_lo, 0x42480000, v01398; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x4248, v1, vcc_lo1399; GFX1010-NEXT:    s_setpc_b64 s[30:31]1400entry:1401  %cmp = fcmp oeq bfloat %arg, 0xR42481402  %sel = select i1 %cmp, bfloat %other, bfloat 0xR42481403  ret bfloat %sel1404}1405 1406; Should NOT be folded: bfloat unsupported comparison type1407define bfloat @fcmp_select_no_fold_bf16_unsupported_cmp(bfloat %arg, bfloat %other) {1408; GFX900-LABEL: fcmp_select_no_fold_bf16_unsupported_cmp:1409; GFX900:       ; %bb.0: ; %entry1410; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1411; GFX900-NEXT:    v_lshlrev_b32_e32 v0, 16, v01412; GFX900-NEXT:    s_mov_b32 s4, 0x424800001413; GFX900-NEXT:    v_mov_b32_e32 v2, 0x42481414; GFX900-NEXT:    v_cmp_gt_f32_e32 vcc, s4, v01415; GFX900-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1416; GFX900-NEXT:    s_setpc_b64 s[30:31]1417;1418; GFX1010-LABEL: fcmp_select_no_fold_bf16_unsupported_cmp:1419; GFX1010:       ; %bb.0: ; %entry1420; GFX1010-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1421; GFX1010-NEXT:    v_lshlrev_b32_e32 v0, 16, v01422; GFX1010-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x42480000, v01423; GFX1010-NEXT:    v_cndmask_b32_e32 v0, 0x4248, v1, vcc_lo1424; GFX1010-NEXT:    s_setpc_b64 s[30:31]1425entry:1426  %cmp = fcmp olt bfloat %arg, 0xR42481427  %sel = select i1 %cmp, bfloat %other, bfloat 0xR42481428  ret bfloat %sel1429}1430