@@ -349,24 +349,29 @@ define i32 @select_fneg_xor_select_i32(i1 %cond0, i1 %cond1, i32 %arg0, i32 %arg
349349; GCN: ; %bb.0:
350350; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
351351; GCN-NEXT: v_and_b32_e32 v0, 1, v0
352- ; GCN-NEXT: v_and_b32_e32 v1, 1, v1
352+ ; GCN-NEXT: v_xor_b32_e32 v2, 0x80000000, v2
353353; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
354- ; GCN-NEXT: v_cndmask_b32_e64 v0, -v2, v3, vcc
354+ ; GCN-NEXT: v_and_b32_e32 v1, 1, v1
355+ ; GCN-NEXT: v_cndmask_b32_e32 v0, v2, v3, vcc
356+ ; GCN-NEXT: v_xor_b32_e32 v2, 0x80000000, v0
355357; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 1, v1
356- ; GCN-NEXT: v_cndmask_b32_e64 v0, v0, -v0 , vcc
358+ ; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v2 , vcc
357359; GCN-NEXT: s_setpc_b64 s[30:31]
358360;
359361; GFX11-LABEL: select_fneg_xor_select_i32:
360362; GFX11: ; %bb.0:
361363; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
362364; GFX11-NEXT: v_and_b32_e32 v0, 1, v0
365+ ; GFX11-NEXT: v_xor_b32_e32 v2, 0x80000000, v2
363366; GFX11-NEXT: v_and_b32_e32 v1, 1, v1
364- ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2 ) | instskip(SKIP_1 ) | instid1(VALU_DEP_3)
367+ ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3 ) | instskip(NEXT ) | instid1(VALU_DEP_3)
365368; GFX11-NEXT: v_cmp_eq_u32_e32 vcc_lo, 1, v0
366- ; GFX11-NEXT: v_cndmask_b32_e64 v0, -v2, v3, vcc_lo
369+ ; GFX11-NEXT: v_cndmask_b32_e32 v0, v2, v3, vcc_lo
370+ ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
367371; GFX11-NEXT: v_cmp_eq_u32_e32 vcc_lo, 1, v1
368- ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)
369- ; GFX11-NEXT: v_cndmask_b32_e64 v0, v0, -v0, vcc_lo
372+ ; GFX11-NEXT: v_xor_b32_e32 v2, 0x80000000, v0
373+ ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)
374+ ; GFX11-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc_lo
370375; GFX11-NEXT: s_setpc_b64 s[30:31]
371376 %fneg0 = xor i32 %arg0 , -2147483648
372377 %select0 = select i1 %cond0 , i32 %arg1 , i32 %fneg0
@@ -545,25 +550,31 @@ define i64 @select_fneg_xor_select_i64(i1 %cond0, i1 %cond1, i64 %arg0, i64 %arg
545550; GCN: ; %bb.0:
546551; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
547552; GCN-NEXT: v_and_b32_e32 v0, 1, v0
548- ; GCN-NEXT: v_and_b32_e32 v1, 1, v1
553+ ; GCN-NEXT: v_xor_b32_e32 v3, 0x80000000, v3
549554; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
555+ ; GCN-NEXT: v_and_b32_e32 v1, 1, v1
550556; GCN-NEXT: v_cndmask_b32_e32 v0, v2, v4, vcc
551- ; GCN-NEXT: v_cndmask_b32_e64 v2, -v3, v5, vcc
557+ ; GCN-NEXT: v_cndmask_b32_e32 v2, v3, v5, vcc
558+ ; GCN-NEXT: v_xor_b32_e32 v3, 0x80000000, v2
552559; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 1, v1
553- ; GCN-NEXT: v_cndmask_b32_e64 v1, v2, -v2 , vcc
560+ ; GCN-NEXT: v_cndmask_b32_e32 v1, v2, v3 , vcc
554561; GCN-NEXT: s_setpc_b64 s[30:31]
555562;
556563; GFX11-LABEL: select_fneg_xor_select_i64:
557564; GFX11: ; %bb.0:
558565; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
559566; GFX11-NEXT: v_and_b32_e32 v0, 1, v0
560- ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_2)
567+ ; GFX11-NEXT: v_xor_b32_e32 v3, 0x80000000, v3
568+ ; GFX11-NEXT: v_and_b32_e32 v1, 1, v1
569+ ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_4)
561570; GFX11-NEXT: v_cmp_eq_u32_e32 vcc_lo, 1, v0
562- ; GFX11-NEXT: v_dual_cndmask_b32 v0, v2, v4 :: v_dual_and_b32 v1, 1, v1
563- ; GFX11-NEXT: v_cndmask_b32_e64 v2, -v3, v5, vcc_lo
571+ ; GFX11-NEXT: v_cndmask_b32_e32 v0, v2, v4, vcc_lo
572+ ; GFX11-NEXT: v_cndmask_b32_e32 v2, v3, v5, vcc_lo
573+ ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)
564574; GFX11-NEXT: v_cmp_eq_u32_e32 vcc_lo, 1, v1
565- ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)
566- ; GFX11-NEXT: v_cndmask_b32_e64 v1, v2, -v2, vcc_lo
575+ ; GFX11-NEXT: v_xor_b32_e32 v3, 0x80000000, v2
576+ ; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)
577+ ; GFX11-NEXT: v_cndmask_b32_e32 v1, v2, v3, vcc_lo
567578; GFX11-NEXT: s_setpc_b64 s[30:31]
568579 %fneg0 = xor i64 %arg0 , 9223372036854775808
569580 %select0 = select i1 %cond0 , i64 %arg1 , i64 %fneg0
0 commit comments