Skip to content

Commit 4f34c74

Browse files
authored
[AMDGPU] w/a for s_setreg_b32 gfx1250 hazard with MODE register (#153879)
1 parent acdbb00 commit 4f34c74

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed

llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,8 @@ void GCNHazardRecognizer::fixHazards(MachineInstr *MI) {
12061206
fixDsAtomicAsyncBarrierArriveB64(MI);
12071207
if (ST.hasScratchBaseForwardingHazard())
12081208
fixScratchBaseForwardingHazard(MI);
1209+
if (ST.setRegModeNeedsVNOPs())
1210+
fixSetRegMode(MI);
12091211
}
12101212

12111213
static bool isVCmpXWritesExec(const SIInstrInfo &TII, const SIRegisterInfo &TRI,
@@ -3546,3 +3548,13 @@ bool GCNHazardRecognizer::fixScratchBaseForwardingHazard(MachineInstr *MI) {
35463548
AMDGPU::DepCtr::encodeFieldSaSdst(0), 0));
35473549
return true;
35483550
}
3551+
3552+
bool GCNHazardRecognizer::fixSetRegMode(MachineInstr *MI) {
3553+
if (!isSSetReg(MI->getOpcode()) ||
3554+
MI->getOperand(1).getImm() != AMDGPU::Hwreg::ID_MODE)
3555+
return false;
3556+
3557+
BuildMI(*MI->getParent(), MI, MI->getDebugLoc(), TII.get(AMDGPU::V_NOP_e32));
3558+
BuildMI(*MI->getParent(), MI, MI->getDebugLoc(), TII.get(AMDGPU::V_NOP_e32));
3559+
return true;
3560+
}

llvm/lib/Target/AMDGPU/GCNHazardRecognizer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class GCNHazardRecognizer final : public ScheduleHazardRecognizer {
113113
bool fixGetRegWaitIdle(MachineInstr *MI);
114114
bool fixDsAtomicAsyncBarrierArriveB64(MachineInstr *MI);
115115
bool fixScratchBaseForwardingHazard(MachineInstr *MI);
116+
bool fixSetRegMode(MachineInstr *MI);
116117

117118
int checkMAIHazards(MachineInstr *MI);
118119
int checkMAIHazards908(MachineInstr *MI);

llvm/lib/Target/AMDGPU/GCNSubtarget.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,6 +1345,10 @@ class GCNSubtarget final : public AMDGPUGenSubtargetInfo,
13451345

13461346
bool hasVALUReadSGPRHazard() const { return GFX12Insts && !GFX1250Insts; }
13471347

1348+
bool setRegModeNeedsVNOPs() const {
1349+
return GFX1250Insts && getGeneration() == GFX12;
1350+
}
1351+
13481352
/// Return if operations acting on VGPR tuples require even alignment.
13491353
bool needsAlignedVGPRs() const { return GFX90AInsts || GFX1250Insts; }
13501354

llvm/test/CodeGen/AMDGPU/hazards-gfx1250.mir

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,3 +493,57 @@ body: |
493493
liveins: $vgpr0
494494
$vgpr0 = V_ADD_U32_e32 $src_flat_scratch_base_lo, $vgpr0, implicit $exec
495495
...
496+
497+
---
498+
name: s_setreg_b32_hwreg_mode
499+
tracksRegLiveness: true
500+
body: |
501+
bb.0:
502+
liveins: $sgpr0
503+
; GCN-LABEL: name: s_setreg_b32_hwreg_mode
504+
; GCN: liveins: $sgpr0
505+
; GCN-NEXT: {{ $}}
506+
; GCN-NEXT: V_NOP_e32 implicit $exec
507+
; GCN-NEXT: V_NOP_e32 implicit $exec
508+
; GCN-NEXT: S_SETREG_B32 $sgpr0, 1, implicit-def $mode, implicit $mode
509+
S_SETREG_B32 $sgpr0, 1, implicit-def $mode, implicit $mode
510+
...
511+
512+
---
513+
name: s_setreg_b32_mode
514+
tracksRegLiveness: true
515+
body: |
516+
bb.0:
517+
liveins: $sgpr0
518+
; GCN-LABEL: name: s_setreg_b32_mode
519+
; GCN: liveins: $sgpr0
520+
; GCN-NEXT: {{ $}}
521+
; GCN-NEXT: V_NOP_e32 implicit $exec
522+
; GCN-NEXT: V_NOP_e32 implicit $exec
523+
; GCN-NEXT: S_SETREG_B32_mode $sgpr0, 1, implicit-def $mode, implicit $mode
524+
S_SETREG_B32_mode $sgpr0, 1, implicit-def $mode, implicit $mode
525+
...
526+
527+
---
528+
name: s_setreg_imm32_b32_hwreg_mode
529+
tracksRegLiveness: true
530+
body: |
531+
bb.0:
532+
; GCN-LABEL: name: s_setreg_imm32_b32_hwreg_mode
533+
; GCN: V_NOP_e32 implicit $exec
534+
; GCN-NEXT: V_NOP_e32 implicit $exec
535+
; GCN-NEXT: S_SETREG_IMM32_B32 1, 1, implicit-def $mode, implicit $mode
536+
S_SETREG_IMM32_B32 1, 1, implicit-def $mode, implicit $mode
537+
...
538+
539+
---
540+
name: s_setreg_imm32_b32_mode
541+
tracksRegLiveness: true
542+
body: |
543+
bb.0:
544+
; GCN-LABEL: name: s_setreg_imm32_b32_mode
545+
; GCN: V_NOP_e32 implicit $exec
546+
; GCN-NEXT: V_NOP_e32 implicit $exec
547+
; GCN-NEXT: S_SETREG_IMM32_B32_mode 1, 1, implicit-def $mode, implicit $mode
548+
S_SETREG_IMM32_B32_mode 1, 1, implicit-def $mode, implicit $mode
549+
...

0 commit comments

Comments
 (0)