956 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;------------------------------------------------------------------------------6; I32 Tests7;------------------------------------------------------------------------------8 9; Should be folded: icmp eq + select with constant in true value10define i32 @icmp_select_fold_eq_i32_imm(i32 %arg, i32 %other) {11; GFX900-LABEL: icmp_select_fold_eq_i32_imm:12; GFX900: ; %bb.0: ; %entry13; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14; GFX900-NEXT: s_movk_i32 s4, 0x109215; GFX900-NEXT: v_cmp_eq_u32_e32 vcc, s4, v016; GFX900-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc17; GFX900-NEXT: s_setpc_b64 s[30:31]18;19; GFX1010-LABEL: icmp_select_fold_eq_i32_imm:20; GFX1010: ; %bb.0: ; %entry21; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)22; GFX1010-NEXT: v_cmp_eq_u32_e32 vcc_lo, 0x1092, v023; GFX1010-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc_lo24; GFX1010-NEXT: s_setpc_b64 s[30:31]25entry:26 %cmp = icmp eq i32 %arg, 424227 %sel = select i1 %cmp, i32 4242, i32 %other28 ret i32 %sel29}30 31; Should be folded: icmp eq + select with constant in true value (commutative)32define i32 @icmp_select_fold_eq_imm_i32(i32 %arg, i32 %other) {33; GFX900-LABEL: icmp_select_fold_eq_imm_i32:34; GFX900: ; %bb.0: ; %entry35; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)36; GFX900-NEXT: s_movk_i32 s4, 0x109237; GFX900-NEXT: v_cmp_eq_u32_e32 vcc, s4, v038; GFX900-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc39; GFX900-NEXT: s_setpc_b64 s[30:31]40;41; GFX1010-LABEL: icmp_select_fold_eq_imm_i32:42; GFX1010: ; %bb.0: ; %entry43; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)44; GFX1010-NEXT: v_cmp_eq_u32_e32 vcc_lo, 0x1092, v045; GFX1010-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc_lo46; GFX1010-NEXT: s_setpc_b64 s[30:31]47entry:48 %cmp = icmp eq i32 4242, %arg49 %sel = select i1 %cmp, i32 4242, i32 %other50 ret i32 %sel51}52 53; Should be folded: icmp ne + select with constant in false value54define i32 @icmp_select_fold_ne_i32_imm(i32 %arg, i32 %other) {55; GFX900-LABEL: icmp_select_fold_ne_i32_imm:56; GFX900: ; %bb.0: ; %entry57; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)58; GFX900-NEXT: s_movk_i32 s4, 0x109259; GFX900-NEXT: v_cmp_ne_u32_e32 vcc, s4, v060; GFX900-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc61; GFX900-NEXT: s_setpc_b64 s[30:31]62;63; GFX1010-LABEL: icmp_select_fold_ne_i32_imm:64; GFX1010: ; %bb.0: ; %entry65; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)66; GFX1010-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0x1092, v067; GFX1010-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo68; GFX1010-NEXT: s_setpc_b64 s[30:31]69entry:70 %cmp = icmp ne i32 %arg, 424271 %sel = select i1 %cmp, i32 %other, i32 424272 ret i32 %sel73}74 75; Should be folded: icmp ne + select with constant in false value (commutative)76define i32 @icmp_select_fold_ne_imm_i32(i32 %arg, i32 %other) {77; GFX900-LABEL: icmp_select_fold_ne_imm_i32:78; GFX900: ; %bb.0: ; %entry79; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)80; GFX900-NEXT: s_movk_i32 s4, 0x109281; GFX900-NEXT: v_cmp_ne_u32_e32 vcc, s4, v082; GFX900-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc83; GFX900-NEXT: s_setpc_b64 s[30:31]84;85; GFX1010-LABEL: icmp_select_fold_ne_imm_i32:86; GFX1010: ; %bb.0: ; %entry87; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)88; GFX1010-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0x1092, v089; GFX1010-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo90; GFX1010-NEXT: s_setpc_b64 s[30:31]91entry:92 %cmp = icmp ne i32 4242, %arg93 %sel = select i1 %cmp, i32 %other, i32 424294 ret i32 %sel95}96 97; Should NOT be folded: icmp eq with different constants98define i32 @icmp_select_no_fold_i32_different(i32 %arg, i32 %other) {99; GFX900-LABEL: icmp_select_no_fold_i32_different:100; GFX900: ; %bb.0: ; %entry101; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)102; GFX900-NEXT: s_movk_i32 s4, 0x1092103; GFX900-NEXT: v_mov_b32_e32 v2, 0x978104; GFX900-NEXT: v_cmp_ne_u32_e32 vcc, s4, v0105; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc106; GFX900-NEXT: s_setpc_b64 s[30:31]107;108; GFX1010-LABEL: icmp_select_no_fold_i32_different:109; GFX1010: ; %bb.0: ; %entry110; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)111; GFX1010-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0x1092, v0112; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x978, v1, vcc_lo113; GFX1010-NEXT: s_setpc_b64 s[30:31]114entry:115 %cmp = icmp eq i32 %arg, 4242116 %sel = select i1 %cmp, i32 2424, i32 %other117 ret i32 %sel118}119 120; Should NOT be folded: icmp eq with constant in other position121define i32 @icmp_select_no_fold_i32_other_pos(i32 %arg, i32 %other) {122; GFX900-LABEL: icmp_select_no_fold_i32_other_pos:123; GFX900: ; %bb.0: ; %entry124; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)125; GFX900-NEXT: s_movk_i32 s4, 0x1092126; GFX900-NEXT: v_mov_b32_e32 v2, 0x1092127; GFX900-NEXT: v_cmp_eq_u32_e32 vcc, s4, v0128; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc129; GFX900-NEXT: s_setpc_b64 s[30:31]130;131; GFX1010-LABEL: icmp_select_no_fold_i32_other_pos:132; GFX1010: ; %bb.0: ; %entry133; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)134; GFX1010-NEXT: v_cmp_eq_u32_e32 vcc_lo, 0x1092, v0135; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x1092, v1, vcc_lo136; GFX1010-NEXT: s_setpc_b64 s[30:31]137entry:138 %cmp = icmp eq i32 %arg, 4242139 %sel = select i1 %cmp, i32 %other, i32 4242140 ret i32 %sel141}142 143; Should NOT be folded: unsupported comparison type144define i32 @icmp_select_no_fold_i32_unsupported_cmp(i32 %arg, i32 %other) {145; GFX900-LABEL: icmp_select_no_fold_i32_unsupported_cmp:146; GFX900: ; %bb.0: ; %entry147; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)148; GFX900-NEXT: s_movk_i32 s4, 0x1094149; GFX900-NEXT: v_mov_b32_e32 v2, 0x102d150; GFX900-NEXT: v_cmp_gt_u32_e32 vcc, s4, v0151; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc152; GFX900-NEXT: s_setpc_b64 s[30:31]153;154; GFX1010-LABEL: icmp_select_no_fold_i32_unsupported_cmp:155; GFX1010: ; %bb.0: ; %entry156; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)157; GFX1010-NEXT: v_cmp_gt_u32_e32 vcc_lo, 0x1094, v0158; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x102d, v1, vcc_lo159; GFX1010-NEXT: s_setpc_b64 s[30:31]160entry:161 %cmp = icmp ugt i32 %arg, 4243162 %sel = select i1 %cmp, i32 4141, i32 %other163 ret i32 %sel164}165 166; Should NOT be folded: immediate can be encoded into cndmask167define i32 @icmp_select_no_fold_i32_enc_imm(i32 %arg, i32 %other) {168; GFX900-LABEL: icmp_select_no_fold_i32_enc_imm:169; GFX900: ; %bb.0: ; %entry170; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)171; GFX900-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0172; GFX900-NEXT: v_cndmask_b32_e32 v0, 0, v1, vcc173; GFX900-NEXT: s_setpc_b64 s[30:31]174;175; GFX1010-LABEL: icmp_select_no_fold_i32_enc_imm:176; GFX1010: ; %bb.0: ; %entry177; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)178; GFX1010-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v0179; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0, v1, vcc_lo180; GFX1010-NEXT: s_setpc_b64 s[30:31]181entry:182 %cmp = icmp eq i32 %arg, 0183 %sel = select i1 %cmp, i32 0, i32 %other184 ret i32 %sel185}186 187; Should NOT be folded: immediate can be encoded into cndmask188define i32 @icmp_select_no_fold_i32_enc_imm_2(i32 %arg, i32 %other) {189; GFX900-LABEL: icmp_select_no_fold_i32_enc_imm_2:190; GFX900: ; %bb.0: ; %entry191; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)192; GFX900-NEXT: v_cmp_ne_u32_e32 vcc, 64, v0193; GFX900-NEXT: v_cndmask_b32_e32 v0, 64, v1, vcc194; GFX900-NEXT: s_setpc_b64 s[30:31]195;196; GFX1010-LABEL: icmp_select_no_fold_i32_enc_imm_2:197; GFX1010: ; %bb.0: ; %entry198; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)199; GFX1010-NEXT: v_cmp_ne_u32_e32 vcc_lo, 64, v0200; GFX1010-NEXT: v_cndmask_b32_e32 v0, 64, v1, vcc_lo201; GFX1010-NEXT: s_setpc_b64 s[30:31]202entry:203 %cmp = icmp eq i32 64, %arg204 %sel = select i1 %cmp, i32 64, i32 %other205 ret i32 %sel206}207 208; Should NOT be folded: immediate can be encoded into cndmask209define i32 @icmp_select_no_fold_i32_enc_imm_3(i32 %arg, i32 %other) {210; GFX900-LABEL: icmp_select_no_fold_i32_enc_imm_3:211; GFX900: ; %bb.0: ; %entry212; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)213; GFX900-NEXT: v_cmp_ne_u32_e32 vcc, -16, v0214; GFX900-NEXT: v_cndmask_b32_e32 v0, -16, v1, vcc215; GFX900-NEXT: s_setpc_b64 s[30:31]216;217; GFX1010-LABEL: icmp_select_no_fold_i32_enc_imm_3:218; GFX1010: ; %bb.0: ; %entry219; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)220; GFX1010-NEXT: v_cmp_ne_u32_e32 vcc_lo, -16, v0221; GFX1010-NEXT: v_cndmask_b32_e32 v0, -16, v1, vcc_lo222; GFX1010-NEXT: s_setpc_b64 s[30:31]223entry:224 %cmp = icmp ne i32 %arg, -16225 %sel = select i1 %cmp, i32 %other, i32 -16226 ret i32 %sel227}228 229;------------------------------------------------------------------------------230; I64 Tests231;------------------------------------------------------------------------------232 233; Should be folded: icmp eq + select with constant in true value234define i64 @icmp_select_fold_eq_i64_imm(i64 %arg, i64 %other) {235; GFX900-LABEL: icmp_select_fold_eq_i64_imm:236; GFX900: ; %bb.0: ; %entry237; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)238; GFX900-NEXT: s_mov_b32 s4, 0xc6d1a9b2239; GFX900-NEXT: s_movk_i32 s5, 0x62240; GFX900-NEXT: v_cmp_eq_u64_e32 vcc, s[4:5], v[0:1]241; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc242; GFX900-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc243; GFX900-NEXT: s_setpc_b64 s[30:31]244;245; GFX1010-LABEL: icmp_select_fold_eq_i64_imm:246; GFX1010: ; %bb.0: ; %entry247; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)248; GFX1010-NEXT: s_mov_b32 s4, 0xc6d1a9b2249; GFX1010-NEXT: s_movk_i32 s5, 0x62250; GFX1010-NEXT: v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[0:1]251; GFX1010-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc_lo252; GFX1010-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc_lo253; GFX1010-NEXT: s_setpc_b64 s[30:31]254entry:255 %cmp = icmp eq i64 %arg, 424242424242256 %sel = select i1 %cmp, i64 424242424242, i64 %other257 ret i64 %sel258}259 260; Should be folded: icmp eq + select with constant in true value (commutative)261define i64 @icmp_select_fold_eq_imm_i64(i64 %arg, i64 %other) {262; GFX900-LABEL: icmp_select_fold_eq_imm_i64:263; GFX900: ; %bb.0: ; %entry264; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)265; GFX900-NEXT: s_mov_b32 s4, 0xc6d1a9b2266; GFX900-NEXT: s_movk_i32 s5, 0x62267; GFX900-NEXT: v_cmp_eq_u64_e32 vcc, s[4:5], v[0:1]268; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc269; GFX900-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc270; GFX900-NEXT: s_setpc_b64 s[30:31]271;272; GFX1010-LABEL: icmp_select_fold_eq_imm_i64:273; GFX1010: ; %bb.0: ; %entry274; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)275; GFX1010-NEXT: s_mov_b32 s4, 0xc6d1a9b2276; GFX1010-NEXT: s_movk_i32 s5, 0x62277; GFX1010-NEXT: v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[0:1]278; GFX1010-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc_lo279; GFX1010-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc_lo280; GFX1010-NEXT: s_setpc_b64 s[30:31]281entry:282 %cmp = icmp eq i64 424242424242, %arg283 %sel = select i1 %cmp, i64 424242424242, i64 %other284 ret i64 %sel285}286 287; Should be folded: icmp ne + select with constant in false value288define i64 @icmp_select_fold_ne_i64_imm(i64 %arg, i64 %other) {289; GFX900-LABEL: icmp_select_fold_ne_i64_imm:290; GFX900: ; %bb.0: ; %entry291; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)292; GFX900-NEXT: s_mov_b32 s4, 0xc6d1a9b2293; GFX900-NEXT: s_movk_i32 s5, 0x62294; GFX900-NEXT: v_cmp_ne_u64_e32 vcc, s[4:5], v[0:1]295; GFX900-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc296; GFX900-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc297; GFX900-NEXT: s_setpc_b64 s[30:31]298;299; GFX1010-LABEL: icmp_select_fold_ne_i64_imm:300; GFX1010: ; %bb.0: ; %entry301; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)302; GFX1010-NEXT: s_mov_b32 s4, 0xc6d1a9b2303; GFX1010-NEXT: s_movk_i32 s5, 0x62304; GFX1010-NEXT: v_cmp_ne_u64_e32 vcc_lo, s[4:5], v[0:1]305; GFX1010-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc_lo306; GFX1010-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc_lo307; GFX1010-NEXT: s_setpc_b64 s[30:31]308entry:309 %cmp = icmp ne i64 %arg, 424242424242310 %sel = select i1 %cmp, i64 %other, i64 424242424242311 ret i64 %sel312}313 314; Should be folded: icmp ne + select with constant in false value (commutative)315define i64 @icmp_select_fold_ne_imm_i64(i64 %arg, i64 %other) {316; GFX900-LABEL: icmp_select_fold_ne_imm_i64:317; GFX900: ; %bb.0: ; %entry318; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)319; GFX900-NEXT: s_mov_b32 s4, 0xc6d1a9b2320; GFX900-NEXT: s_movk_i32 s5, 0x62321; GFX900-NEXT: v_cmp_ne_u64_e32 vcc, s[4:5], v[0:1]322; GFX900-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc323; GFX900-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc324; GFX900-NEXT: s_setpc_b64 s[30:31]325;326; GFX1010-LABEL: icmp_select_fold_ne_imm_i64:327; GFX1010: ; %bb.0: ; %entry328; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)329; GFX1010-NEXT: s_mov_b32 s4, 0xc6d1a9b2330; GFX1010-NEXT: s_movk_i32 s5, 0x62331; GFX1010-NEXT: v_cmp_ne_u64_e32 vcc_lo, s[4:5], v[0:1]332; GFX1010-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc_lo333; GFX1010-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc_lo334; GFX1010-NEXT: s_setpc_b64 s[30:31]335entry:336 %cmp = icmp ne i64 424242424242, %arg337 %sel = select i1 %cmp, i64 %other, i64 424242424242338 ret i64 %sel339}340 341; Should NOT be folded: icmp eq with different constants342define i64 @icmp_select_no_fold_i64_different(i64 %arg, i64 %other) {343; GFX900-LABEL: icmp_select_no_fold_i64_different:344; GFX900: ; %bb.0: ; %entry345; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)346; GFX900-NEXT: s_mov_b32 s4, 0xc6d1a9b2347; GFX900-NEXT: s_movk_i32 s5, 0x62348; GFX900-NEXT: v_cmp_ne_u64_e32 vcc, s[4:5], v[0:1]349; GFX900-NEXT: v_mov_b32_e32 v4, 0x719c60f8350; GFX900-NEXT: v_cndmask_b32_e32 v0, v4, v2, vcc351; GFX900-NEXT: v_cndmask_b32_e32 v1, 56, v3, vcc352; GFX900-NEXT: s_setpc_b64 s[30:31]353;354; GFX1010-LABEL: icmp_select_no_fold_i64_different:355; GFX1010: ; %bb.0: ; %entry356; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)357; GFX1010-NEXT: s_mov_b32 s4, 0xc6d1a9b2358; GFX1010-NEXT: s_movk_i32 s5, 0x62359; GFX1010-NEXT: v_cmp_ne_u64_e32 vcc_lo, s[4:5], v[0:1]360; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x719c60f8, v2, vcc_lo361; GFX1010-NEXT: v_cndmask_b32_e32 v1, 56, v3, vcc_lo362; GFX1010-NEXT: s_setpc_b64 s[30:31]363entry:364 %cmp = icmp eq i64 %arg, 424242424242365 %sel = select i1 %cmp, i64 242424242424, i64 %other366 ret i64 %sel367}368 369; Should NOT be folded: icmp eq with constant in other position370define i64 @icmp_select_no_fold_i64_other_pos(i64 %arg, i64 %other) {371; GFX900-LABEL: icmp_select_no_fold_i64_other_pos:372; GFX900: ; %bb.0: ; %entry373; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)374; GFX900-NEXT: s_mov_b32 s4, 0xc6d1a9b2375; GFX900-NEXT: s_movk_i32 s5, 0x62376; GFX900-NEXT: v_cmp_eq_u64_e32 vcc, s[4:5], v[0:1]377; GFX900-NEXT: v_mov_b32_e32 v4, 0xc6d1a9b2378; GFX900-NEXT: v_mov_b32_e32 v1, 0x62379; GFX900-NEXT: v_cndmask_b32_e32 v0, v4, v2, vcc380; GFX900-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc381; GFX900-NEXT: s_setpc_b64 s[30:31]382;383; GFX1010-LABEL: icmp_select_no_fold_i64_other_pos:384; GFX1010: ; %bb.0: ; %entry385; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)386; GFX1010-NEXT: s_mov_b32 s4, 0xc6d1a9b2387; GFX1010-NEXT: s_movk_i32 s5, 0x62388; GFX1010-NEXT: v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[0:1]389; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0xc6d1a9b2, v2, vcc_lo390; GFX1010-NEXT: v_cndmask_b32_e32 v1, 0x62, v3, vcc_lo391; GFX1010-NEXT: s_setpc_b64 s[30:31]392entry:393 %cmp = icmp eq i64 %arg, 424242424242394 %sel = select i1 %cmp, i64 %other, i64 424242424242395 ret i64 %sel396}397 398; Should NOT be folded: unsupported comparison type399define i64 @icmp_select_no_fold_i64_unsupported_cmp(i64 %arg, i64 %other) {400; GFX900-LABEL: icmp_select_no_fold_i64_unsupported_cmp:401; GFX900: ; %bb.0: ; %entry402; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)403; GFX900-NEXT: s_mov_b32 s4, 0xc6d1a9b3404; GFX900-NEXT: s_movk_i32 s5, 0x62405; GFX900-NEXT: v_cmp_gt_u64_e32 vcc, s[4:5], v[0:1]406; GFX900-NEXT: v_mov_b32_e32 v4, 0xc6d1a9b2407; GFX900-NEXT: v_mov_b32_e32 v1, 0x62408; GFX900-NEXT: v_cndmask_b32_e32 v0, v4, v2, vcc409; GFX900-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc410; GFX900-NEXT: s_setpc_b64 s[30:31]411;412; GFX1010-LABEL: icmp_select_no_fold_i64_unsupported_cmp:413; GFX1010: ; %bb.0: ; %entry414; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)415; GFX1010-NEXT: s_mov_b32 s4, 0xc6d1a9b3416; GFX1010-NEXT: s_movk_i32 s5, 0x62417; GFX1010-NEXT: v_cmp_gt_u64_e32 vcc_lo, s[4:5], v[0:1]418; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0xc6d1a9b2, v2, vcc_lo419; GFX1010-NEXT: v_cndmask_b32_e32 v1, 0x62, v3, vcc_lo420; GFX1010-NEXT: s_setpc_b64 s[30:31]421entry:422 %cmp = icmp ugt i64 %arg, 424242424242423 %sel = select i1 %cmp, i64 424242424242, i64 %other424 ret i64 %sel425}426 427; Should NOT be folded: immediate can be encoded into cndmask428define i64 @icmp_select_no_fold_i64_enc_imm(i64 %arg, i64 %other) {429; GFX900-LABEL: icmp_select_no_fold_i64_enc_imm:430; GFX900: ; %bb.0: ; %entry431; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)432; GFX900-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[0:1]433; GFX900-NEXT: v_cndmask_b32_e32 v0, 0, v2, vcc434; GFX900-NEXT: v_cndmask_b32_e32 v1, 0, v3, vcc435; GFX900-NEXT: s_setpc_b64 s[30:31]436;437; GFX1010-LABEL: icmp_select_no_fold_i64_enc_imm:438; GFX1010: ; %bb.0: ; %entry439; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)440; GFX1010-NEXT: v_cmp_ne_u64_e32 vcc_lo, 0, v[0:1]441; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0, v2, vcc_lo442; GFX1010-NEXT: v_cndmask_b32_e32 v1, 0, v3, vcc_lo443; GFX1010-NEXT: s_setpc_b64 s[30:31]444entry:445 %cmp = icmp eq i64 %arg, 0446 %sel = select i1 %cmp, i64 0, i64 %other447 ret i64 %sel448}449 450; Should NOT be folded: immediate can be encoded into cndmask451define i64 @icmp_select_no_fold_i64_enc_imm_2(i64 %arg, i64 %other) {452; GFX900-LABEL: icmp_select_no_fold_i64_enc_imm_2:453; GFX900: ; %bb.0: ; %entry454; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)455; GFX900-NEXT: v_cmp_ne_u64_e32 vcc, 32, v[0:1]456; GFX900-NEXT: v_cndmask_b32_e32 v0, 32, v2, vcc457; GFX900-NEXT: v_cndmask_b32_e32 v1, 0, v3, vcc458; GFX900-NEXT: s_setpc_b64 s[30:31]459;460; GFX1010-LABEL: icmp_select_no_fold_i64_enc_imm_2:461; GFX1010: ; %bb.0: ; %entry462; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)463; GFX1010-NEXT: v_cmp_ne_u64_e32 vcc_lo, 32, v[0:1]464; GFX1010-NEXT: v_cndmask_b32_e32 v0, 32, v2, vcc_lo465; GFX1010-NEXT: v_cndmask_b32_e32 v1, 0, v3, vcc_lo466; GFX1010-NEXT: s_setpc_b64 s[30:31]467entry:468 %cmp = icmp eq i64 32, %arg469 %sel = select i1 %cmp, i64 32, i64 %other470 ret i64 %sel471}472 473; Should NOT be folded: immediate can be encoded into cndmask474define i64 @icmp_select_no_fold_i64_enc_imm_3(i64 %arg, i64 %other) {475; GFX900-LABEL: icmp_select_no_fold_i64_enc_imm_3:476; GFX900: ; %bb.0: ; %entry477; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)478; GFX900-NEXT: v_cmp_ne_u64_e32 vcc, -8, v[0:1]479; GFX900-NEXT: v_cndmask_b32_e32 v0, -8, v2, vcc480; GFX900-NEXT: v_cndmask_b32_e32 v1, -1, v3, vcc481; GFX900-NEXT: s_setpc_b64 s[30:31]482;483; GFX1010-LABEL: icmp_select_no_fold_i64_enc_imm_3:484; GFX1010: ; %bb.0: ; %entry485; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)486; GFX1010-NEXT: v_cmp_ne_u64_e32 vcc_lo, -8, v[0:1]487; GFX1010-NEXT: v_cndmask_b32_e32 v0, -8, v2, vcc_lo488; GFX1010-NEXT: v_cndmask_b32_e32 v1, -1, v3, vcc_lo489; GFX1010-NEXT: s_setpc_b64 s[30:31]490entry:491 %cmp = icmp ne i64 %arg, -8492 %sel = select i1 %cmp, i64 %other, i64 -8493 ret i64 %sel494}495 496;------------------------------------------------------------------------------497; I16 Tests498;------------------------------------------------------------------------------499 500; Should be folded: icmp eq + select with constant in true value501define i16 @icmp_select_fold_eq_i16_imm(i16 %arg, i16 %other) {502; GFX900-LABEL: icmp_select_fold_eq_i16_imm:503; GFX900: ; %bb.0: ; %entry504; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)505; GFX900-NEXT: s_movk_i32 s4, 0x1092506; GFX900-NEXT: v_cmp_eq_u16_e32 vcc, s4, v0507; GFX900-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc508; GFX900-NEXT: s_setpc_b64 s[30:31]509;510; GFX1010-LABEL: icmp_select_fold_eq_i16_imm:511; GFX1010: ; %bb.0: ; %entry512; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)513; GFX1010-NEXT: v_cmp_eq_u16_e32 vcc_lo, 0x1092, v0514; GFX1010-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc_lo515; GFX1010-NEXT: s_setpc_b64 s[30:31]516entry:517 %cmp = icmp eq i16 %arg, 4242518 %sel = select i1 %cmp, i16 4242, i16 %other519 ret i16 %sel520}521 522; Should be folded: icmp eq + select with constant in true value (commutative)523define i16 @icmp_select_fold_eq_imm_i16(i16 %arg, i16 %other) {524; GFX900-LABEL: icmp_select_fold_eq_imm_i16:525; GFX900: ; %bb.0: ; %entry526; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)527; GFX900-NEXT: s_movk_i32 s4, 0x1092528; GFX900-NEXT: v_cmp_eq_u16_e32 vcc, s4, v0529; GFX900-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc530; GFX900-NEXT: s_setpc_b64 s[30:31]531;532; GFX1010-LABEL: icmp_select_fold_eq_imm_i16:533; GFX1010: ; %bb.0: ; %entry534; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)535; GFX1010-NEXT: v_cmp_eq_u16_e32 vcc_lo, 0x1092, v0536; GFX1010-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc_lo537; GFX1010-NEXT: s_setpc_b64 s[30:31]538entry:539 %cmp = icmp eq i16 4242, %arg540 %sel = select i1 %cmp, i16 4242, i16 %other541 ret i16 %sel542}543 544; Should be folded: icmp ne + select with constant in false value545define i16 @icmp_select_fold_ne_i16_imm(i16 %arg, i16 %other) {546; GFX900-LABEL: icmp_select_fold_ne_i16_imm:547; GFX900: ; %bb.0: ; %entry548; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)549; GFX900-NEXT: s_movk_i32 s4, 0x1092550; GFX900-NEXT: v_cmp_ne_u16_e32 vcc, s4, v0551; GFX900-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc552; GFX900-NEXT: s_setpc_b64 s[30:31]553;554; GFX1010-LABEL: icmp_select_fold_ne_i16_imm:555; GFX1010: ; %bb.0: ; %entry556; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)557; GFX1010-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0x1092, v0558; GFX1010-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo559; GFX1010-NEXT: s_setpc_b64 s[30:31]560entry:561 %cmp = icmp ne i16 %arg, 4242562 %sel = select i1 %cmp, i16 %other, i16 4242563 ret i16 %sel564}565 566; Should be folded: icmp ne + select with constant in false value (commutative)567define i16 @icmp_select_fold_ne_imm_i16(i16 %arg, i16 %other) {568; GFX900-LABEL: icmp_select_fold_ne_imm_i16:569; GFX900: ; %bb.0: ; %entry570; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)571; GFX900-NEXT: s_movk_i32 s4, 0x1092572; GFX900-NEXT: v_cmp_ne_u16_e32 vcc, s4, v0573; GFX900-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc574; GFX900-NEXT: s_setpc_b64 s[30:31]575;576; GFX1010-LABEL: icmp_select_fold_ne_imm_i16:577; GFX1010: ; %bb.0: ; %entry578; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)579; GFX1010-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0x1092, v0580; GFX1010-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo581; GFX1010-NEXT: s_setpc_b64 s[30:31]582entry:583 %cmp = icmp ne i16 4242, %arg584 %sel = select i1 %cmp, i16 %other, i16 4242585 ret i16 %sel586}587 588; Should NOT be folded: icmp eq with different constants589define i16 @icmp_select_no_fold_i16_different(i16 %arg, i16 %other) {590; GFX900-LABEL: icmp_select_no_fold_i16_different:591; GFX900: ; %bb.0: ; %entry592; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)593; GFX900-NEXT: s_movk_i32 s4, 0x1092594; GFX900-NEXT: v_mov_b32_e32 v2, 0x978595; GFX900-NEXT: v_cmp_ne_u16_e32 vcc, s4, v0596; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc597; GFX900-NEXT: s_setpc_b64 s[30:31]598;599; GFX1010-LABEL: icmp_select_no_fold_i16_different:600; GFX1010: ; %bb.0: ; %entry601; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)602; GFX1010-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0x1092, v0603; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x978, v1, vcc_lo604; GFX1010-NEXT: s_setpc_b64 s[30:31]605entry:606 %cmp = icmp eq i16 %arg, 4242607 %sel = select i1 %cmp, i16 2424, i16 %other608 ret i16 %sel609}610 611; Should NOT be folded: icmp eq with constant in other position612define i16 @icmp_select_no_fold_i16_other_pos(i16 %arg, i16 %other) {613; GFX900-LABEL: icmp_select_no_fold_i16_other_pos:614; GFX900: ; %bb.0: ; %entry615; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)616; GFX900-NEXT: s_movk_i32 s4, 0x1092617; GFX900-NEXT: v_mov_b32_e32 v2, 0x1092618; GFX900-NEXT: v_cmp_eq_u16_e32 vcc, s4, v0619; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc620; GFX900-NEXT: s_setpc_b64 s[30:31]621;622; GFX1010-LABEL: icmp_select_no_fold_i16_other_pos:623; GFX1010: ; %bb.0: ; %entry624; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)625; GFX1010-NEXT: v_cmp_eq_u16_e32 vcc_lo, 0x1092, v0626; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x1092, v1, vcc_lo627; GFX1010-NEXT: s_setpc_b64 s[30:31]628entry:629 %cmp = icmp eq i16 %arg, 4242630 %sel = select i1 %cmp, i16 %other, i16 4242631 ret i16 %sel632}633 634; Should NOT be folded: unsupported comparison type635define i16 @icmp_select_no_fold_i16_unsupported_cmp(i16 %arg, i16 %other) {636; GFX900-LABEL: icmp_select_no_fold_i16_unsupported_cmp:637; GFX900: ; %bb.0: ; %entry638; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)639; GFX900-NEXT: s_movk_i32 s4, 0x1093640; GFX900-NEXT: v_mov_b32_e32 v2, 0x1092641; GFX900-NEXT: v_cmp_gt_u16_e32 vcc, s4, v0642; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc643; GFX900-NEXT: s_setpc_b64 s[30:31]644;645; GFX1010-LABEL: icmp_select_no_fold_i16_unsupported_cmp:646; GFX1010: ; %bb.0: ; %entry647; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)648; GFX1010-NEXT: v_cmp_gt_u16_e32 vcc_lo, 0x1093, v0649; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x1092, v1, vcc_lo650; GFX1010-NEXT: s_setpc_b64 s[30:31]651entry:652 %cmp = icmp ugt i16 %arg, 4242653 %sel = select i1 %cmp, i16 4242, i16 %other654 ret i16 %sel655}656 657; Should NOT be folded: immediate can be encoded into cndmask658define i16 @icmp_select_no_fold_i16_enc_imm(i16 %arg, i16 %other) {659; GFX900-LABEL: icmp_select_no_fold_i16_enc_imm:660; GFX900: ; %bb.0: ; %entry661; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)662; GFX900-NEXT: v_cmp_ne_u16_e32 vcc, 0, v0663; GFX900-NEXT: v_cndmask_b32_e32 v0, 0, v1, vcc664; GFX900-NEXT: s_setpc_b64 s[30:31]665;666; GFX1010-LABEL: icmp_select_no_fold_i16_enc_imm:667; GFX1010: ; %bb.0: ; %entry668; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)669; GFX1010-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v0670; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0, v1, vcc_lo671; GFX1010-NEXT: s_setpc_b64 s[30:31]672entry:673 %cmp = icmp eq i16 %arg, 0674 %sel = select i1 %cmp, i16 0, i16 %other675 ret i16 %sel676}677 678; Should NOT be folded: immediate can be encoded into cndmask679define i16 @icmp_select_no_fold_i16_enc_imm_2(i16 %arg, i16 %other) {680; GFX900-LABEL: icmp_select_no_fold_i16_enc_imm_2:681; GFX900: ; %bb.0: ; %entry682; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)683; GFX900-NEXT: v_cmp_ne_u16_e32 vcc, 45, v0684; GFX900-NEXT: v_cndmask_b32_e32 v0, 45, v1, vcc685; GFX900-NEXT: s_setpc_b64 s[30:31]686;687; GFX1010-LABEL: icmp_select_no_fold_i16_enc_imm_2:688; GFX1010: ; %bb.0: ; %entry689; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)690; GFX1010-NEXT: v_cmp_ne_u16_e32 vcc_lo, 45, v0691; GFX1010-NEXT: v_cndmask_b32_e32 v0, 45, v1, vcc_lo692; GFX1010-NEXT: s_setpc_b64 s[30:31]693entry:694 %cmp = icmp eq i16 45, %arg695 %sel = select i1 %cmp, i16 45, i16 %other696 ret i16 %sel697}698 699; Should NOT be folded: immediate can be encoded into cndmask700define i16 @icmp_select_no_fold_i16_enc_imm_3(i16 %arg, i16 %other) {701; GFX900-LABEL: icmp_select_no_fold_i16_enc_imm_3:702; GFX900: ; %bb.0: ; %entry703; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)704; GFX900-NEXT: v_cmp_ne_u16_e32 vcc, -12, v0705; GFX900-NEXT: v_cndmask_b32_e32 v0, -12, v1, vcc706; GFX900-NEXT: s_setpc_b64 s[30:31]707;708; GFX1010-LABEL: icmp_select_no_fold_i16_enc_imm_3:709; GFX1010: ; %bb.0: ; %entry710; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)711; GFX1010-NEXT: v_cmp_ne_u16_e32 vcc_lo, -12, v0712; GFX1010-NEXT: v_cndmask_b32_e32 v0, -12, v1, vcc_lo713; GFX1010-NEXT: s_setpc_b64 s[30:31]714entry:715 %cmp = icmp ne i16 %arg, -12716 %sel = select i1 %cmp, i16 %other, i16 -12717 ret i16 %sel718}719 720;------------------------------------------------------------------------------721; I8 Tests722;------------------------------------------------------------------------------723 724; Should be folded: icmp eq + select with constant in true value725define i8 @icmp_select_fold_eq_i8_imm(i8 %arg, i8 %other) {726; GFX900-LABEL: icmp_select_fold_eq_i8_imm:727; GFX900: ; %bb.0: ; %entry728; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)729; GFX900-NEXT: s_movk_i32 s4, 0x7b730; GFX900-NEXT: v_cmp_eq_u16_sdwa vcc, v0, s4 src0_sel:BYTE_0 src1_sel:DWORD731; GFX900-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc732; GFX900-NEXT: s_setpc_b64 s[30:31]733;734; GFX1010-LABEL: icmp_select_fold_eq_i8_imm:735; GFX1010: ; %bb.0: ; %entry736; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)737; GFX1010-NEXT: v_mov_b32_e32 v2, 0x7b738; GFX1010-NEXT: v_cmp_eq_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD739; GFX1010-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc_lo740; GFX1010-NEXT: s_setpc_b64 s[30:31]741entry:742 %cmp = icmp eq i8 %arg, 123743 %sel = select i1 %cmp, i8 123, i8 %other744 ret i8 %sel745}746 747; Should be folded: icmp eq + select with constant in true value (commutative)748define i8 @icmp_select_fold_eq_imm_i8(i8 %arg, i8 %other) {749; GFX900-LABEL: icmp_select_fold_eq_imm_i8:750; GFX900: ; %bb.0: ; %entry751; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)752; GFX900-NEXT: s_movk_i32 s4, 0x7b753; GFX900-NEXT: v_cmp_eq_u16_sdwa vcc, v0, s4 src0_sel:BYTE_0 src1_sel:DWORD754; GFX900-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc755; GFX900-NEXT: s_setpc_b64 s[30:31]756;757; GFX1010-LABEL: icmp_select_fold_eq_imm_i8:758; GFX1010: ; %bb.0: ; %entry759; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)760; GFX1010-NEXT: v_mov_b32_e32 v2, 0x7b761; GFX1010-NEXT: v_cmp_eq_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD762; GFX1010-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc_lo763; GFX1010-NEXT: s_setpc_b64 s[30:31]764entry:765 %cmp = icmp eq i8 123, %arg766 %sel = select i1 %cmp, i8 123, i8 %other767 ret i8 %sel768}769 770; Should be folded: icmp ne + select with constant in false value771define i8 @icmp_select_fold_ne_i8_imm(i8 %arg, i8 %other) {772; GFX900-LABEL: icmp_select_fold_ne_i8_imm:773; GFX900: ; %bb.0: ; %entry774; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)775; GFX900-NEXT: s_movk_i32 s4, 0x7b776; GFX900-NEXT: v_cmp_ne_u16_sdwa vcc, v0, s4 src0_sel:BYTE_0 src1_sel:DWORD777; GFX900-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc778; GFX900-NEXT: s_setpc_b64 s[30:31]779;780; GFX1010-LABEL: icmp_select_fold_ne_i8_imm:781; GFX1010: ; %bb.0: ; %entry782; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)783; GFX1010-NEXT: v_mov_b32_e32 v2, 0x7b784; GFX1010-NEXT: v_cmp_ne_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD785; GFX1010-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo786; GFX1010-NEXT: s_setpc_b64 s[30:31]787entry:788 %cmp = icmp ne i8 %arg, 123789 %sel = select i1 %cmp, i8 %other, i8 123790 ret i8 %sel791}792 793; Should be folded: icmp ne + select with constant in false value (commutative)794define i8 @icmp_select_fold_ne_imm_i8(i8 %arg, i8 %other) {795; GFX900-LABEL: icmp_select_fold_ne_imm_i8:796; GFX900: ; %bb.0: ; %entry797; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)798; GFX900-NEXT: s_movk_i32 s4, 0x7b799; GFX900-NEXT: v_cmp_ne_u16_sdwa vcc, v0, s4 src0_sel:BYTE_0 src1_sel:DWORD800; GFX900-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc801; GFX900-NEXT: s_setpc_b64 s[30:31]802;803; GFX1010-LABEL: icmp_select_fold_ne_imm_i8:804; GFX1010: ; %bb.0: ; %entry805; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)806; GFX1010-NEXT: v_mov_b32_e32 v2, 0x7b807; GFX1010-NEXT: v_cmp_ne_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD808; GFX1010-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo809; GFX1010-NEXT: s_setpc_b64 s[30:31]810entry:811 %cmp = icmp ne i8 123, %arg812 %sel = select i1 %cmp, i8 %other, i8 123813 ret i8 %sel814}815 816; Should NOT be folded: icmp eq with different constants817define i8 @icmp_select_no_fold_i8_different(i8 %arg, i8 %other) {818; GFX900-LABEL: icmp_select_no_fold_i8_different:819; GFX900: ; %bb.0: ; %entry820; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)821; GFX900-NEXT: s_movk_i32 s4, 0x7b822; GFX900-NEXT: v_mov_b32_e32 v2, 0x7c823; GFX900-NEXT: v_cmp_ne_u16_sdwa vcc, v0, s4 src0_sel:BYTE_0 src1_sel:DWORD824; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc825; GFX900-NEXT: s_setpc_b64 s[30:31]826;827; GFX1010-LABEL: icmp_select_no_fold_i8_different:828; GFX1010: ; %bb.0: ; %entry829; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)830; GFX1010-NEXT: v_mov_b32_e32 v2, 0x7b831; GFX1010-NEXT: v_cmp_ne_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD832; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x7c, v1, vcc_lo833; GFX1010-NEXT: s_setpc_b64 s[30:31]834entry:835 %cmp = icmp eq i8 %arg, 123836 %sel = select i1 %cmp, i8 124, i8 %other837 ret i8 %sel838}839 840; Should NOT be folded: icmp eq with constant in other position841define i8 @icmp_select_no_fold_i8_other_pos(i8 %arg, i8 %other) {842; GFX900-LABEL: icmp_select_no_fold_i8_other_pos:843; GFX900: ; %bb.0: ; %entry844; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)845; GFX900-NEXT: s_movk_i32 s4, 0x7b846; GFX900-NEXT: v_mov_b32_e32 v2, 0x7b847; GFX900-NEXT: v_cmp_eq_u16_sdwa vcc, v0, s4 src0_sel:BYTE_0 src1_sel:DWORD848; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc849; GFX900-NEXT: s_setpc_b64 s[30:31]850;851; GFX1010-LABEL: icmp_select_no_fold_i8_other_pos:852; GFX1010: ; %bb.0: ; %entry853; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)854; GFX1010-NEXT: v_mov_b32_e32 v2, 0x7b855; GFX1010-NEXT: v_cmp_eq_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD856; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x7b, v1, vcc_lo857; GFX1010-NEXT: s_setpc_b64 s[30:31]858entry:859 %cmp = icmp eq i8 %arg, 123860 %sel = select i1 %cmp, i8 %other, i8 123861 ret i8 %sel862}863 864; Should NOT be folded: unsupported comparison type865define i8 @icmp_select_no_fold_i8_unsupported_cmp(i8 %arg, i8 %other) {866; GFX900-LABEL: icmp_select_no_fold_i8_unsupported_cmp:867; GFX900: ; %bb.0: ; %entry868; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)869; GFX900-NEXT: s_movk_i32 s4, 0x7c870; GFX900-NEXT: v_mov_b32_e32 v2, 0x7b871; GFX900-NEXT: v_cmp_lt_u16_sdwa vcc, v0, s4 src0_sel:BYTE_0 src1_sel:DWORD872; GFX900-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc873; GFX900-NEXT: s_setpc_b64 s[30:31]874;875; GFX1010-LABEL: icmp_select_no_fold_i8_unsupported_cmp:876; GFX1010: ; %bb.0: ; %entry877; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)878; GFX1010-NEXT: v_mov_b32_e32 v2, 0x7c879; GFX1010-NEXT: v_cmp_lt_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD880; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0x7b, v1, vcc_lo881; GFX1010-NEXT: s_setpc_b64 s[30:31]882entry:883 %cmp = icmp ugt i8 %arg, 123884 %sel = select i1 %cmp, i8 123, i8 %other885 ret i8 %sel886}887 888; Should NOT be folded: immediate can be encoded into cndmask889define i8 @icmp_select_no_fold_i8_enc_imm(i8 %arg, i8 %other) {890; GFX900-LABEL: icmp_select_no_fold_i8_enc_imm:891; GFX900: ; %bb.0: ; %entry892; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)893; GFX900-NEXT: v_mov_b32_e32 v2, 0894; GFX900-NEXT: v_cmp_ne_u16_sdwa vcc, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD895; GFX900-NEXT: v_cndmask_b32_e32 v0, 0, v1, vcc896; GFX900-NEXT: s_setpc_b64 s[30:31]897;898; GFX1010-LABEL: icmp_select_no_fold_i8_enc_imm:899; GFX1010: ; %bb.0: ; %entry900; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)901; GFX1010-NEXT: v_mov_b32_e32 v2, 0902; GFX1010-NEXT: v_cmp_ne_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD903; GFX1010-NEXT: v_cndmask_b32_e32 v0, 0, v1, vcc_lo904; GFX1010-NEXT: s_setpc_b64 s[30:31]905entry:906 %cmp = icmp eq i8 %arg, 0907 %sel = select i1 %cmp, i8 0, i8 %other908 ret i8 %sel909}910 911; Should NOT be folded: immediate can be encoded into cndmask912define i8 @icmp_select_no_fold_i8_enc_imm_2(i8 %arg, i8 %other) {913; GFX900-LABEL: icmp_select_no_fold_i8_enc_imm_2:914; GFX900: ; %bb.0: ; %entry915; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)916; GFX900-NEXT: v_mov_b32_e32 v2, 25917; GFX900-NEXT: v_cmp_ne_u16_sdwa vcc, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD918; GFX900-NEXT: v_cndmask_b32_e32 v0, 25, v1, vcc919; GFX900-NEXT: s_setpc_b64 s[30:31]920;921; GFX1010-LABEL: icmp_select_no_fold_i8_enc_imm_2:922; GFX1010: ; %bb.0: ; %entry923; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)924; GFX1010-NEXT: v_mov_b32_e32 v2, 25925; GFX1010-NEXT: v_cmp_ne_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD926; GFX1010-NEXT: v_cndmask_b32_e32 v0, 25, v1, vcc_lo927; GFX1010-NEXT: s_setpc_b64 s[30:31]928entry:929 %cmp = icmp eq i8 25, %arg930 %sel = select i1 %cmp, i8 25, i8 %other931 ret i8 %sel932}933 934; Should NOT be folded: immediate can be encoded into cndmask935define i8 @icmp_select_no_fold_i8_enc_imm_3(i8 %arg, i8 %other) {936; GFX900-LABEL: icmp_select_no_fold_i8_enc_imm_3:937; GFX900: ; %bb.0: ; %entry938; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)939; GFX900-NEXT: s_movk_i32 s4, 0xfb940; GFX900-NEXT: v_cmp_ne_u16_sdwa vcc, v0, s4 src0_sel:BYTE_0 src1_sel:DWORD941; GFX900-NEXT: v_cndmask_b32_e32 v0, -5, v1, vcc942; GFX900-NEXT: s_setpc_b64 s[30:31]943;944; GFX1010-LABEL: icmp_select_no_fold_i8_enc_imm_3:945; GFX1010: ; %bb.0: ; %entry946; GFX1010-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)947; GFX1010-NEXT: v_mov_b32_e32 v2, 0xfb948; GFX1010-NEXT: v_cmp_ne_u16_sdwa vcc_lo, v0, v2 src0_sel:BYTE_0 src1_sel:DWORD949; GFX1010-NEXT: v_cndmask_b32_e32 v0, -5, v1, vcc_lo950; GFX1010-NEXT: s_setpc_b64 s[30:31]951entry:952 %cmp = icmp ne i8 %arg, -5953 %sel = select i1 %cmp, i8 %other, i8 -5954 ret i8 %sel955}956