[llvm] aeb1a46 - AMDGPU/UniformityAnalysis: MIR Uniformity analysis for INLINEASM (#201874)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 8 05:18:22 PDT 2026


Author: Petar Avramovic
Date: 2026-06-08T14:18:17+02:00
New Revision: aeb1a462a02c48b61faa3d0af5f505dec00b0b4e

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

LOG: AMDGPU/UniformityAnalysis: MIR Uniformity analysis for INLINEASM (#201874)

If any of the defs are divergent, need to report instruction as
NeverUniform so that isUniformReg can calculate uniformity for each def.

Added: 
    

Modified: 
    llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
    llvm/test/Analysis/UniformityAnalysis/AMDGPU/MIR/inline-asm.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index 3b72ba4bd4967..ef9d184555bd6 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -11014,6 +11014,19 @@ ValueUniformity SIInstrInfo::getValueUniformity(const MachineInstr &MI) const {
       opcode == AMDGPU::SI_RESTORE_S32_FROM_VGPR)
     return ValueUniformity::AlwaysUniform;
 
+  // If any of defs is divergent, report as NeverUniform. isUniformReg will
+  // calculate in more detail for each def from its reg class, if available.
+  if (MI.isInlineAsm()) {
+    for (const MachineOperand &MO : MI.operands()) {
+      if (!MO.isReg() || !MO.isDef())
+        continue;
+      const TargetRegisterClass *RC =
+          MI.getRegClassConstraint(MO.getOperandNo(), this, &RI);
+      if (!RC || !RI.isSGPRClass(RC))
+        return ValueUniformity::NeverUniform;
+    }
+  }
+
   if (isCopyInstr(MI)) {
     const MachineOperand &srcOp = MI.getOperand(1);
     if (srcOp.isReg() && srcOp.getReg().isPhysical()) {

diff  --git a/llvm/test/Analysis/UniformityAnalysis/AMDGPU/MIR/inline-asm.mir b/llvm/test/Analysis/UniformityAnalysis/AMDGPU/MIR/inline-asm.mir
index 8fc1a4981fa24..e5f450c612444 100644
--- a/llvm/test/Analysis/UniformityAnalysis/AMDGPU/MIR/inline-asm.mir
+++ b/llvm/test/Analysis/UniformityAnalysis/AMDGPU/MIR/inline-asm.mir
@@ -16,7 +16,7 @@ body:             |
 
 # CHECK-LABEL: MachineUniformityInfo for function:  @inlineasm_v
 # CHECK-LABEL: BLOCK bb.0
-# CHECK-NOT: DIVERGENT: %0: INLINEASM
+# CHECK: DIVERGENT: %0: INLINEASM
 ---
 name:            inlineasm_v
 tracksRegLiveness: true
@@ -30,7 +30,7 @@ body:             |
 # CHECK-LABEL: MachineUniformityInfo for function:  @inlineasm_sv
 # CHECK-LABEL: BLOCK bb.0
 # CHECK-NOT: DIVERGENT: %0: INLINEASM
-# CHECK-NOT: DIVERGENT: %1: INLINEASM
+# CHECK: DIVERGENT: %1: INLINEASM
 ---
 name:            inlineasm_sv
 tracksRegLiveness: true
@@ -45,7 +45,7 @@ body:             |
 # CHECK-LABEL: MachineUniformityInfo for function:  @inlineasm_svs
 # CHECK-LABEL: BLOCK bb.0
 # CHECK-NOT: DIVERGENT: %0: INLINEASM
-# CHECK-NOT: DIVERGENT: %1: INLINEASM
+# CHECK: DIVERGENT: %1: INLINEASM
 # CHECK-NOT: DIVERGENT: %2: INLINEASM
 ---
 name:            inlineasm_svs


        


More information about the llvm-commits mailing list