[llvm] d5824db - [AMDGPU] Rework NeedNopBeforeSetVGPRMSB flag. NFC. (#187520)

via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 26 05:09:13 PDT 2026


Author: Jay Foad
Date: 2026-03-26T12:09:09Z
New Revision: d5824db2d42db188aa16d72342f3bd08b897730c

URL: https://github.com/llvm/llvm-project/commit/d5824db2d42db188aa16d72342f3bd08b897730c
DIFF: https://github.com/llvm/llvm-project/commit/d5824db2d42db188aa16d72342f3bd08b897730c.diff

LOG: [AMDGPU] Rework NeedNopBeforeSetVGPRMSB flag. NFC. (#187520)

This avoids tracking state with a flag when it is conceptually simpler
to look at the preceding instructions to detemine whether a NOP is
needed.

Added: 
    

Modified: 
    llvm/lib/Target/AMDGPU/AMDGPULowerVGPREncoding.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AMDGPU/AMDGPULowerVGPREncoding.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerVGPREncoding.cpp
index f9e21f2a77879..bcac1dc35ae53 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPULowerVGPREncoding.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPULowerVGPREncoding.cpp
@@ -159,11 +159,6 @@ class AMDGPULowerVGPREncoding {
   // instruction that we inserted, which implicitly waits for XCNT==0.
   bool XCntIsZero;
 
-  /// S_SET_VGPR_MSB immediately after S_SETREG_IMM32_B32 targeting MODE is
-  /// silently dropped on GFX1250. When set, the next S_SET_VGPR_MSB insertion
-  /// must be preceded by S_NOP to avoid the hazard.
-  bool NeedNopBeforeSetVGPRMSB;
-
   /// Insert mode change before \p I. \returns true if mode was changed.
   bool setMode(ModeTy NewMode, MachineBasicBlock::instr_iterator I);
 
@@ -201,6 +196,11 @@ class AMDGPULowerVGPREncoding {
   MachineBasicBlock::instr_iterator
   handleCoissue(MachineBasicBlock::instr_iterator I);
 
+  /// S_SET_VGPR_MSB immediately after S_SETREG_IMM32_B32 targeting MODE is
+  /// silently dropped on GFX1250. When set, the next S_SET_VGPR_MSB insertion
+  /// must be preceded by S_NOP to avoid the hazard.
+  bool needNopBeforeSetVGPRMSB(MachineBasicBlock::instr_iterator I);
+
   /// Handle S_SETREG_IMM32_B32 targeting MODE register. On certain hardware,
   /// this instruction clobbers VGPR MSB bits[12:19], so we need to restore
   /// the current mode. \returns true if the instruction was modified or a
@@ -264,10 +264,8 @@ bool AMDGPULowerVGPREncoding::setMode(ModeTy NewMode,
   // current MSBs, but the next VALU needs 
diff erent MSBs, so this
   // S_SET_VGPR_MSB would land right after the setreg. Insert S_NOP to
   // prevent it from being silently dropped.
-  if (NeedNopBeforeSetVGPRMSB) {
+  if (needNopBeforeSetVGPRMSB(I))
     BuildMI(*MBB, InsertPt, {}, TII->get(AMDGPU::S_NOP)).addImm(0);
-    NeedNopBeforeSetVGPRMSB = false;
-  }
   MostRecentModeSet =
       BuildMI(*MBB, InsertPt, {}, TII->get(AMDGPU::S_SET_VGPR_MSB))
           .addImm(NewMode.encode() | OldModeBits);
@@ -444,6 +442,26 @@ AMDGPULowerVGPREncoding::handleCoissue(MachineBasicBlock::instr_iterator I) {
   return I;
 }
 
+bool AMDGPULowerVGPREncoding::needNopBeforeSetVGPRMSB(
+    MachineBasicBlock::instr_iterator I) {
+  while (I != MBB->begin()) {
+    I = std::prev(I);
+    if (I->getOpcode() == AMDGPU::S_SETREG_IMM32_B32) {
+      MachineOperand *SIMM16Op =
+          TII->getNamedOperand(*I, AMDGPU::OpName::simm16);
+      auto [HwRegId, Offset, Size] =
+          AMDGPU::Hwreg::HwregEncoding::decode(SIMM16Op->getImm());
+      if (HwRegId == AMDGPU::Hwreg::ID_MODE)
+        return true;
+    }
+    if (!I->isMetaInstruction())
+      return false;
+  }
+  // FIXME: Return true if the previous MBB falls through and ends with
+  // S_SETREG_IMM32_B32.
+  return false;
+}
+
 /// Convert mode value from S_SET_VGPR_MSB format to MODE register format.
 /// S_SET_VGPR_MSB uses: (src0[0-1], src1[2-3], src2[4-5], dst[6-7])
 /// MODE register uses:  (dst[0-1], src0[2-3], src1[4-5], src2[6-7])
@@ -532,7 +550,6 @@ bool AMDGPULowerVGPREncoding::handleSetregMode(MachineInstr &MI) {
     // via piggybacking (bits[12:19] are meaningful), so if CurrentMode changes,
     // a new s_set_vgpr_msb will be inserted after this instruction.
     MostRecentModeSet = nullptr;
-    NeedNopBeforeSetVGPRMSB = true;
     LLVM_DEBUG(dbgs() << "    -> bits[12:19] already correct, "
                          "invalidated MostRecentModeSet\n");
     return false;
@@ -569,7 +586,6 @@ bool AMDGPULowerVGPREncoding::run(MachineFunction &MF) {
   for (auto &MBB : MF) {
     MostRecentModeSet = nullptr;
     XCntIsZero = false;
-    NeedNopBeforeSetVGPRMSB = false;
     this->MBB = &MBB;
 
     LLVM_DEBUG(dbgs() << "BB#" << MBB.getNumber() << ' ' << MBB.getName()
@@ -586,7 +602,6 @@ bool AMDGPULowerVGPREncoding::run(MachineFunction &MF) {
           CurrentMode = {};
         else
           resetMode(MI.getIterator());
-        NeedNopBeforeSetVGPRMSB = false;
         continue;
       }
 
@@ -594,7 +609,6 @@ bool AMDGPULowerVGPREncoding::run(MachineFunction &MF) {
         LLVM_DEBUG(dbgs() << "  inline asm: " << MI);
         if (TII->hasVGPRUses(MI))
           resetMode(MI.getIterator());
-        NeedNopBeforeSetVGPRMSB = false;
         continue;
       }
 
@@ -624,7 +638,6 @@ bool AMDGPULowerVGPREncoding::run(MachineFunction &MF) {
       }
 
       Changed |= runOnMachineInstr(MI);
-      NeedNopBeforeSetVGPRMSB = false;
 
       // Any VMEM or SMEM instruction may increment XCNT.
       if (SIInstrInfo::isVMEM(MI) || SIInstrInfo::isSMRD(MI))


        


More information about the llvm-commits mailing list