[llvm] Try To Guess SGMasks for Inline Asm Instructions (PR #155491)

Patrick Simmons via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 23 14:10:12 PST 2025


================
@@ -2391,6 +2391,56 @@ bool SchedGroup::canAddMI(const MachineInstr &MI) const {
   if (MI.isMetaInstruction())
     Result = false;
 
+  else if (MI.isInlineAsm()) {
+    const SIRegisterInfo &TRI = TII->getRegisterInfo();
+    auto &MRI = MI.getParent()->getParent()->getRegInfo();
+    bool SGPR_used = false, VGPR_used = false, VMFMA_used = false,
+         VReg32_used = false, MayLoad = MI.mayLoad(), MayStore = MI.mayStore();
+    for (const MachineOperand &Operand : MI.operands())
+      if (Operand.isReg()) {
----------------
linuxrocks123 wrote:

@arsenm I made use of the "big SGPR def" information in this patch.  Please let me know if this is what you were going for.

```
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp b/llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp
index ff003bd87fd5..f2bf5b2553c0 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp
@@ -2396,8 +2396,9 @@ bool SchedGroup::canAddMI(const MachineInstr &MI) const {
   else if (MI.isInlineAsm()) {
     const SIRegisterInfo &TRI = TII->getRegisterInfo();
     auto &MRI = MI.getParent()->getParent()->getRegInfo();
-    bool SGPR_used = false, VGPR_used = false, VMFMA_used = false,
-         VReg32_used = false, MayLoad = MI.mayLoad(), MayStore = MI.mayStore();
+    bool SGPR_used = false, SGPR_big_def = false, VGPR_used = false,
+         VMFMA_used = false, VReg32_used = false, MayLoad = MI.mayLoad(),
+         MayStore = MI.mayStore();
     for (const MachineOperand &Operand : MI.operands())
       if (Operand.isReg()) {
         const TargetRegisterClass &RegClass =
@@ -2414,6 +2415,8 @@ bool SchedGroup::canAddMI(const MachineInstr &MI) const {
           VMFMA_used = true;
         if (TRI.hasSGPRs(&RegClass))
           SGPR_used = true;
+        if (TRI.getRegSizeInBits(RegClass) > 64 && Operand.isDef())
+          SGPR_big_def = true;
       }
 
     typedef std::underlying_type_t<SchedGroupMask> SGMask_t;
@@ -2430,6 +2433,8 @@ bool SchedGroup::canAddMI(const MachineInstr &MI) const {
     if (VGPR_used && MayStore)
       InlineAsmMask |= (SGMask_t)(VReg32_used ? SchedGroupMask::DS_WRITE
                                               : SchedGroupMask::VMEM_WRITE);
+    if (SGPR_big_def)
+      InlineAsmMask |= SchedGroupMask::DS_READ;
     if (InlineAsmMask & (SGMask_t)SchedGroupMask::VALU ||
         InlineAsmMask & (SGMask_t)SchedGroupMask::SALU)
       InlineAsmMask |= (SGMask_t)SchedGroupMask::ALU;
```

https://github.com/llvm/llvm-project/pull/155491


More information about the llvm-commits mailing list