[AMDGPU] Extend select/setcc swap to multi-use conditions - #218986
[AMDGPU] Extend select/setcc swap to multi-use conditions#218986MadhurKumar004 wants to merge 1 commit into
Conversation
|
@llvm/pr-subscribers-backend-amdgpu Author: Madhur Kumar (MadhurKumar004) ChangesExtend Patch is 804.10 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/218986.diff 27 Files Affected:
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
index 7acc9ca2bafbd..ff19e04e5f8a4 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
@@ -5079,6 +5079,18 @@ AMDGPUTargetLowering::foldFreeOpFromSelect(TargetLowering::DAGCombinerInfo &DCI,
return SDValue();
}
+static bool isSelectSwapCandidate(SDNode *User, const SDNode *Cond,
+ SelectionDAG &DAG) {
+ if (User->getOpcode() != ISD::SELECT)
+ return false;
+ if (User->getOperand(0).getNode() != Cond)
+ return false;
+ SDValue True = User->getOperand(1);
+ SDValue False = User->getOperand(2);
+ return DAG.isConstantValueOfAnyType(True) &&
+ !DAG.isConstantValueOfAnyType(False);
+}
+
SDValue AMDGPUTargetLowering::performSelectCombine(SDNode *N,
DAGCombinerInfo &DCI) const {
if (SDValue Folded = foldFreeOpFromSelect(DCI, SDValue(N, 0)))
@@ -5096,22 +5108,49 @@ SDValue AMDGPUTargetLowering::performSelectCombine(SDNode *N,
SDValue True = N->getOperand(1);
SDValue False = N->getOperand(2);
- if (Cond.hasOneUse()) { // TODO: Look for multiple select uses.
- SelectionDAG &DAG = DCI.DAG;
- if (DAG.isConstantValueOfAnyType(True) &&
- !DAG.isConstantValueOfAnyType(False)) {
- // Swap cmp + select pair to move constant to false input.
- // This will allow using VOPC cndmasks more often.
- // select (setcc x, y), k, x -> select (setccinv x, y), x, k
+ SelectionDAG &DAG = DCI.DAG;
+ if (DAG.isConstantValueOfAnyType(True) &&
+ !DAG.isConstantValueOfAnyType(False)) {
+ // Swap cmp + select pair to move constant to false input.
+ // This will allow using VOPC cndmasks more often.
+ // select (setcc x, y), k, x -> select (setccinv x, y), x, k
+
+ bool CanSwap = true;
+ if (!Cond.hasOneUse()) {
+ for (SDNode *User : Cond->users()) {
+ if (User == N)
+ continue;
+ if (!isSelectSwapCandidate(User, Cond.getNode(), DAG)) {
+ CanSwap = false;
+ break;
+ }
+ }
+ }
+ if (CanSwap) {
SDLoc SL(N);
ISD::CondCode NewCC =
getSetCCInverse(cast<CondCodeSDNode>(CC)->get(), LHS.getValueType());
SDValue NewCond = DAG.getSetCC(SL, Cond.getValueType(), LHS, RHS, NewCC);
+
+ for (SDNode *User : llvm::make_early_inc_range(Cond->users())) {
+ if (User == N)
+ continue;
+ EVT UserVT = User->getValueType(0);
+ SDValue UserTrue = User->getOperand(1);
+ SDValue UserFalse = User->getOperand(2);
+ SDValue NewUserSelect =
+ DAG.getNode(ISD::SELECT, SDLoc(User), UserVT,
+ NewCond, UserFalse, UserTrue);
+ DCI.CombineTo(User, NewUserSelect);
+ }
+
return DAG.getNode(ISD::SELECT, SL, VT, NewCond, False, True);
}
+ }
+ if (Cond.hasOneUse()) {
if (VT == MVT::f32 && Subtarget->hasFminFmaxLegacy()) {
SDValue MinMax
= combineFMinMaxLegacy(SDLoc(N), VT, LHS, RHS, True, False, CC, DCI);
diff --git a/llvm/test/CodeGen/AMDGPU/a-v-flat-atomicrmw.ll b/llvm/test/CodeGen/AMDGPU/a-v-flat-atomicrmw.ll
index 7150c8980fc78..1a03fcef5eb31 100644
--- a/llvm/test/CodeGen/AMDGPU/a-v-flat-atomicrmw.ll
+++ b/llvm/test/CodeGen/AMDGPU/a-v-flat-atomicrmw.ll
@@ -10815,9 +10815,9 @@ define void @flat_atomic_fmaximum_f64_ret_a_a(ptr %ptr) #0 {
; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] glc
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -10842,11 +10842,11 @@ define void @flat_atomic_fmaximum_f64_ret_a_a(ptr %ptr) #0 {
; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff80000
; GFX90A-NEXT: s_waitcnt vmcnt(0)
; GFX90A-NEXT: v_max_f64 v[2:3], v[0:1], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0
; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1
-; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
; GFX90A-NEXT: buffer_store_dword v2, v6, s[0:3], 0 offen
; GFX90A-NEXT: buffer_store_dword v3, v6, s[0:3], 0 offen offset:4
; GFX90A-NEXT: .LBB135_6: ; %atomicrmw.phi
@@ -10882,10 +10882,10 @@ define void @flat_atomic_fmaximum_f64_ret_a_a(ptr %ptr) #0 {
; GFX950-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
; GFX950-NEXT: s_nop 1
-; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] sc0
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -10910,11 +10910,11 @@ define void @flat_atomic_fmaximum_f64_ret_a_a(ptr %ptr) #0 {
; GFX950-NEXT: scratch_load_dwordx2 v[0:1], v6, off
; GFX950-NEXT: s_waitcnt vmcnt(0)
; GFX950-NEXT: v_max_f64 v[2:3], v[0:1], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
; GFX950-NEXT: v_accvgpr_write_b32 a0, v0
; GFX950-NEXT: v_accvgpr_write_b32 a1, v1
-; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX950-NEXT: scratch_store_dwordx2 v6, v[2:3], off
; GFX950-NEXT: .LBB135_6: ; %atomicrmw.phi
; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]
@@ -10953,9 +10953,9 @@ define void @flat_atomic_fmaximum_f64_ret_av_av(ptr %ptr) #0 {
; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] glc
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -10978,9 +10978,9 @@ define void @flat_atomic_fmaximum_f64_ret_av_av(ptr %ptr) #0 {
; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff80000
; GFX90A-NEXT: s_waitcnt vmcnt(0)
; GFX90A-NEXT: v_max_f64 v[2:3], v[0:1], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
-; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
; GFX90A-NEXT: buffer_store_dword v2, v6, s[0:3], 0 offen
; GFX90A-NEXT: buffer_store_dword v3, v6, s[0:3], 0 offen offset:4
; GFX90A-NEXT: .LBB136_6: ; %atomicrmw.phi
@@ -11014,10 +11014,10 @@ define void @flat_atomic_fmaximum_f64_ret_av_av(ptr %ptr) #0 {
; GFX950-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
; GFX950-NEXT: s_nop 1
-; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] sc0
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -11040,10 +11040,10 @@ define void @flat_atomic_fmaximum_f64_ret_av_av(ptr %ptr) #0 {
; GFX950-NEXT: scratch_load_dwordx2 v[0:1], v6, off
; GFX950-NEXT: s_waitcnt vmcnt(0)
; GFX950-NEXT: v_max_f64 v[2:3], v[0:1], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
; GFX950-NEXT: s_nop 1
-; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX950-NEXT: scratch_store_dwordx2 v6, v[2:3], off
; GFX950-NEXT: .LBB136_6: ; %atomicrmw.phi
; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]
@@ -11084,9 +11084,9 @@ define void @flat_atomic_fminimum_f64_ret_a_a(ptr %ptr) #0 {
; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_min_f64 v[0:1], v[2:3], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] glc
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -11111,11 +11111,11 @@ define void @flat_atomic_fminimum_f64_ret_a_a(ptr %ptr) #0 {
; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff80000
; GFX90A-NEXT: s_waitcnt vmcnt(0)
; GFX90A-NEXT: v_min_f64 v[2:3], v[0:1], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0
; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1
-; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
; GFX90A-NEXT: buffer_store_dword v2, v6, s[0:3], 0 offen
; GFX90A-NEXT: buffer_store_dword v3, v6, s[0:3], 0 offen offset:4
; GFX90A-NEXT: .LBB137_6: ; %atomicrmw.phi
@@ -11151,10 +11151,10 @@ define void @flat_atomic_fminimum_f64_ret_a_a(ptr %ptr) #0 {
; GFX950-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_min_f64 v[0:1], v[2:3], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
; GFX950-NEXT: s_nop 1
-; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] sc0
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -11179,11 +11179,11 @@ define void @flat_atomic_fminimum_f64_ret_a_a(ptr %ptr) #0 {
; GFX950-NEXT: scratch_load_dwordx2 v[0:1], v6, off
; GFX950-NEXT: s_waitcnt vmcnt(0)
; GFX950-NEXT: v_min_f64 v[2:3], v[0:1], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
; GFX950-NEXT: v_accvgpr_write_b32 a0, v0
; GFX950-NEXT: v_accvgpr_write_b32 a1, v1
-; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX950-NEXT: scratch_store_dwordx2 v6, v[2:3], off
; GFX950-NEXT: .LBB137_6: ; %atomicrmw.phi
; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]
@@ -11222,9 +11222,9 @@ define void @flat_atomic_fminimum_f64_ret_av_av(ptr %ptr) #0 {
; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_min_f64 v[0:1], v[2:3], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] glc
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -11247,9 +11247,9 @@ define void @flat_atomic_fminimum_f64_ret_av_av(ptr %ptr) #0 {
; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff80000
; GFX90A-NEXT: s_waitcnt vmcnt(0)
; GFX90A-NEXT: v_min_f64 v[2:3], v[0:1], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
-; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
; GFX90A-NEXT: buffer_store_dword v2, v6, s[0:3], 0 offen
; GFX90A-NEXT: buffer_store_dword v3, v6, s[0:3], 0 offen offset:4
; GFX90A-NEXT: .LBB138_6: ; %atomicrmw.phi
@@ -11283,10 +11283,10 @@ define void @flat_atomic_fminimum_f64_ret_av_av(ptr %ptr) #0 {
; GFX950-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_min_f64 v[0:1], v[2:3], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
; GFX950-NEXT: s_nop 1
-; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] sc0
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -11309,10 +11309,10 @@ define void @flat_atomic_fminimum_f64_ret_av_av(ptr %ptr) #0 {
; GFX950-NEXT: scratch_load_dwordx2 v[0:1], v6, off
; GFX950-NEXT: s_waitcnt vmcnt(0)
; GFX950-NEXT: v_min_f64 v[2:3], v[0:1], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
; GFX950-NEXT: s_nop 1
-; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX950-NEXT: scratch_store_dwordx2 v6, v[2:3], off
; GFX950-NEXT: .LBB138_6: ; %atomicrmw.phi
; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]
@@ -19552,9 +19552,9 @@ define void @flat_atomic_fmaximum_f64_saddr_ret_a_a(ptr inreg %ptr) #0 {
; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] glc
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -19579,11 +19579,11 @@ define void @flat_atomic_fmaximum_f64_saddr_ret_a_a(ptr inreg %ptr) #0 {
; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff80000
; GFX90A-NEXT: s_waitcnt vmcnt(0)
; GFX90A-NEXT: v_max_f64 v[2:3], v[0:1], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0
; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1
-; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
; GFX90A-NEXT: buffer_store_dword v2, v6, s[0:3], 0 offen
; GFX90A-NEXT: buffer_store_dword v3, v6, s[0:3], 0 offen offset:4
; GFX90A-NEXT: .LBB243_6: ; %atomicrmw.phi
@@ -19618,10 +19618,10 @@ define void @flat_atomic_fmaximum_f64_saddr_ret_a_a(ptr inreg %ptr) #0 {
; GFX950-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
; GFX950-NEXT: s_nop 1
-; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] sc0
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -19644,11 +19644,11 @@ define void @flat_atomic_fmaximum_f64_saddr_ret_a_a(ptr inreg %ptr) #0 {
; GFX950-NEXT: v_mov_b32_e32 v6, 0x7ff80000
; GFX950-NEXT: s_waitcnt vmcnt(0)
; GFX950-NEXT: v_max_f64 v[2:3], v[0:1], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
+; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
; GFX950-NEXT: v_accvgpr_write_b32 a0, v0
; GFX950-NEXT: v_accvgpr_write_b32 a1, v1
-; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v6, vcc
-; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v3, v6, v3, vcc
+; GFX950-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX950-NEXT: scratch_store_dwordx2 off, v[2:3], s0
; GFX950-NEXT: .LBB243_6: ; %atomicrmw.phi
; GFX950-NEXT: ;;#ASMSTART
@@ -19686,9 +19686,9 @@ define void @flat_atomic_fmaximum_f64_saddr_ret_av_av(ptr inreg %ptr) #0 {
; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc
-; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[2:3], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v1, v8, v1, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] glc
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -19711,9 +19711,9 @@ define void @flat_atomic_fmaximum_f64_saddr_ret_av_av(ptr inreg %ptr) #0 {
; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff80000
; GFX90A-NEXT: s_waitcnt vmcnt(0)
; GFX90A-NEXT: v_max_f64 v[2:3], v[0:1], v[4:5]
-; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[0:1], v[4:5]
-; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
-; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v7, vcc
+; GFX90A-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[4:5]
+; GFX90A-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
+; GFX90A-NEXT: v_cndmask_b32_e32 v3, v7, v3, vcc
; GFX90A-NEXT: buffer_store_dword v2, v6, s[0:3], 0 offen
; GFX90A-NEXT: buffer_store_dword v3, v6, s[0:3], 0 offen offset:4
; GFX90A-NEXT: .LBB244_6: ; %atomicrmw.phi
@@ -19746,10 +19746,10 @@ define void @flat_atomic_fmaximum_f64_saddr_ret_av_av(ptr inreg %ptr) #0 {
; GFX950-NEXT: ; =>This Inner Loop Header: Depth=1
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]
-; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]
+; GFX950-NEXT: v...
[truncated]
|
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
81db01e to
119e8c4
Compare
krzysz00
left a comment
There was a problem hiding this comment.
Is there an example of the benefit of this?
|
|
||
| bool CanSwap = true; | ||
| if (!Cond.hasOneUse()) { | ||
| for (SDNode *User : Cond->users()) { |
There was a problem hiding this comment.
This might be an all_of User == N || isConstantSwapCandidate(...)? Not sure if that's cleaner.
There was a problem hiding this comment.
Yeah i was using this earlier, but wasnt sure which one to would be more preferable, so i went with a simple for loop. I will switch it to all_of if you think that would be cleaner.
No, I havent looked into any examples where this optimization would be particularly meaningful yet. |
|
@krzysz00 Do you think it is worth moving forward with? i don't have any real example to show benefit. |
Extend
performSelectCombineto handle the cases with setcc condition having multiple select users. This enable cheapv_cndmask_b32_e32encoding in more cases.