Skip to content

Commit 2995c8c

Browse files
Konstantina MitropoulouKonstantina Mitropoulou
Konstantina Mitropoulou
authored and
Konstantina Mitropoulou
committed
[AMDGPU] Emit S_CBRANCH_SCC for floating-point conditions.
1 parent cb0b753 commit 2995c8c

File tree

3 files changed

+11
-21
lines changed

3 files changed

+11
-21
lines changed

llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2390,12 +2390,14 @@ bool AMDGPUDAGToDAGISel::isCBranchSCC(const SDNode *N) const {
23902390
return true;
23912391

23922392
if (VT == MVT::i64) {
2393-
const auto *ST = static_cast<const GCNSubtarget *>(Subtarget);
2394-
23952393
ISD::CondCode CC = cast<CondCodeSDNode>(Cond.getOperand(2))->get();
2396-
return (CC == ISD::SETEQ || CC == ISD::SETNE) && ST->hasScalarCompareEq64();
2394+
return (CC == ISD::SETEQ || CC == ISD::SETNE) &&
2395+
Subtarget->hasScalarCompareEq64();
23972396
}
23982397

2398+
if ((VT == MVT::f16 || VT == MVT::f32) && ST->hasSALUFloatInsts())
2399+
return true;
2400+
23992401
return false;
24002402
}
24012403

llvm/test/CodeGen/AMDGPU/branch-relaxation.ll

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,7 @@ define amdgpu_kernel void @uniform_conditional_min_long_forward_vcnd_branch(ptr
297297
; GFX12-NEXT: s_load_b32 s0, s[4:5], 0x2c
298298
; GFX12-NEXT: s_wait_kmcnt 0x0
299299
; GFX12-NEXT: s_cmp_eq_f32 s0, 0
300-
; GFX12-NEXT: s_cselect_b32 s1, -1, 0
301-
; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
302-
; GFX12-NEXT: s_and_b32 vcc_lo, exec_lo, s1
303-
; GFX12-NEXT: s_cbranch_vccz .LBB2_1
300+
; GFX12-NEXT: s_cbranch_scc0 .LBB2_1
304301
; GFX12-NEXT: ; %bb.3: ; %bb0
305302
; GFX12-NEXT: s_getpc_b64 s[2:3]
306303
; GFX12-NEXT: .Lpost_getpc2:

llvm/test/CodeGen/AMDGPU/uniform_branch_with_floating_point_cond.ll

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@ define void @test() {
1515
; CHECK-NEXT: [[S_LOAD_DWORD_IMM:%[0-9]+]]:sreg_32_xm0_xexec = S_LOAD_DWORD_IMM killed [[S_LOAD_DWORDX2_IMM]], 0, 0 :: (dereferenceable invariant load (s32) from @external_constant1, addrspace 4)
1616
; CHECK-NEXT: [[S_MOV_B32_:%[0-9]+]]:sgpr_32 = S_MOV_B32 0
1717
; CHECK-NEXT: nofpexcept S_CMP_LG_F32 killed [[S_LOAD_DWORD_IMM]], killed [[S_MOV_B32_]], implicit-def $scc, implicit $mode
18-
; CHECK-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $scc
19-
; CHECK-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 $exec_lo, killed [[COPY]], implicit-def dead $scc
20-
; CHECK-NEXT: $vcc_lo = COPY [[S_AND_B32_]]
21-
; CHECK-NEXT: S_CBRANCH_VCCNZ %bb.3, implicit $vcc
18+
; CHECK-NEXT: S_CBRANCH_SCC1 %bb.3, implicit $scc
2219
; CHECK-NEXT: S_BRANCH %bb.1
2320
; CHECK-NEXT: {{ $}}
2421
; CHECK-NEXT: bb.1.bb1:
@@ -31,12 +28,9 @@ define void @test() {
3128
; CHECK-NEXT: [[GLOBAL_LOAD_DWORD_SADDR:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD_SADDR killed [[S_LOAD_DWORDX2_IMM2]], killed [[V_MOV_B32_e32_]], 0, 0, implicit $exec :: (load (s32) from %ir.0, addrspace 1)
3229
; CHECK-NEXT: [[S_MOV_B32_1:%[0-9]+]]:sgpr_32 = S_MOV_B32 1092616192
3330
; CHECK-NEXT: [[S_MOV_B32_2:%[0-9]+]]:sgpr_32 = S_MOV_B32 1065353216
34-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY [[GLOBAL_LOAD_DWORD_SADDR]]
35-
; CHECK-NEXT: nofpexcept S_CMP_LT_F32 killed [[COPY1]], killed [[S_MOV_B32_2]], implicit-def $scc, implicit $mode
36-
; CHECK-NEXT: [[COPY2:%[0-9]+]]:sreg_32 = COPY $scc
37-
; CHECK-NEXT: [[S_AND_B32_1:%[0-9]+]]:sreg_32 = S_AND_B32 $exec_lo, killed [[COPY2]], implicit-def dead $scc
38-
; CHECK-NEXT: $vcc_lo = COPY [[S_AND_B32_1]]
39-
; CHECK-NEXT: S_CBRANCH_VCCNZ %bb.4, implicit $vcc
31+
; CHECK-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY [[GLOBAL_LOAD_DWORD_SADDR]]
32+
; CHECK-NEXT: nofpexcept S_CMP_LT_F32 killed [[COPY]], killed [[S_MOV_B32_2]], implicit-def $scc, implicit $mode
33+
; CHECK-NEXT: S_CBRANCH_SCC1 %bb.4, implicit $scc
4034
; CHECK-NEXT: S_BRANCH %bb.2
4135
; CHECK-NEXT: {{ $}}
4236
; CHECK-NEXT: bb.2.bb2:
@@ -56,10 +50,7 @@ define void @test() {
5650
; CHECK-NEXT: [[PHI:%[0-9]+]]:sgpr_32 = PHI [[S_MOV_B32_1]], %bb.1, [[S_MOV_B32_3]], %bb.2
5751
; CHECK-NEXT: [[S_MOV_B32_4:%[0-9]+]]:sgpr_32 = S_MOV_B32 0
5852
; CHECK-NEXT: nofpexcept S_CMP_NEQ_F32 [[PHI]], killed [[S_MOV_B32_4]], implicit-def $scc, implicit $mode
59-
; CHECK-NEXT: [[COPY3:%[0-9]+]]:sreg_32 = COPY $scc
60-
; CHECK-NEXT: [[S_AND_B32_2:%[0-9]+]]:sreg_32 = S_AND_B32 $exec_lo, killed [[COPY3]], implicit-def dead $scc
61-
; CHECK-NEXT: $vcc_lo = COPY [[S_AND_B32_2]]
62-
; CHECK-NEXT: S_CBRANCH_VCCNZ %bb.6, implicit $vcc
53+
; CHECK-NEXT: S_CBRANCH_SCC1 %bb.6, implicit $scc
6354
; CHECK-NEXT: S_BRANCH %bb.5
6455
; CHECK-NEXT: {{ $}}
6556
; CHECK-NEXT: bb.5.bb4:

0 commit comments

Comments
 (0)