[llvm] 54e36d6 - [SPIR-V] Emit UniformId decoration as OpDecorateId with a Scope id operand (#207958)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 15 04:26:34 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-07-15T13:26:29+02:00
New Revision: 54e36d6ba68c3c5f91bd36c1c9bf8d8af6f8940b

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

LOG: [SPIR-V] Emit UniformId decoration as OpDecorateId with a Scope id operand (#207958)

Per spec, UniformId operand is a Scope `<id>`, not a literal

Previously it was printed via `printSymbolicOperand<ScopeOperand>`,
which asserts on a real id operand, and never emitted correctly

Added: 
    

Modified: 
    llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVInstPrinter.cpp
    llvm/lib/Target/SPIRV/SPIRVUtils.cpp
    llvm/test/CodeGen/SPIRV/hlsl-intrinsics/vk-ext-builtin-input.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVInstPrinter.cpp b/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVInstPrinter.cpp
index b7dcd10bac809..44192b963d3a1 100644
--- a/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVInstPrinter.cpp
+++ b/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVInstPrinter.cpp
@@ -398,7 +398,7 @@ void SPIRVInstPrinter::printOpDecorate(const MCInst *MI, raw_ostream &O) {
       printSymbolicOperand<OperandCategory::BuiltInOperand>(MI, NumFixedOps, O);
       break;
     case Decoration::UniformId:
-      printSymbolicOperand<OperandCategory::ScopeOperand>(MI, NumFixedOps, O);
+      printOperand(MI, NumFixedOps, O);
       break;
     case Decoration::FuncParamAttr:
       printSymbolicOperand<OperandCategory::FunctionParameterAttributeOperand>(

diff  --git a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
index 802053d6cd54b..1a1247fbe3e18 100644
--- a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
@@ -301,9 +301,26 @@ void buildOpSpirvDecorations(Register Reg, MachineIRBuilder &MIRBuilder,
             static_cast<uint32_t>(SPIRV::Decoration::FPFastMathMode)) {
       continue; // Ignored.
     }
-    auto MIB = MIRBuilder.buildInstr(SPIRV::OpDecorate)
-                   .addUse(Reg)
-                   .addImm(static_cast<uint32_t>(DecorationId->getZExtValue()));
+    uint32_t Dec = static_cast<uint32_t>(DecorationId->getZExtValue());
+    if (Dec == static_cast<uint32_t>(SPIRV::Decoration::UniformId)) {
+      ConstantInt *ScopeV =
+          OpMD->getNumOperands() == 2
+              ? mdconst::dyn_extract<ConstantInt>(OpMD->getOperand(1))
+              : nullptr;
+      assert(ScopeV && isUInt<32>(ScopeV->getZExtValue()) &&
+             "Expect Scope <id> operand of the UniformId decoration");
+      SPIRVGlobalRegistry *GR = ST.getSPIRVGlobalRegistry();
+      SPIRVTypeInst SpvTypeInt32 =
+          GR->getOrCreateSPIRVIntegerType(32, MIRBuilder);
+      Register ScopeReg = GR->buildConstantInt(
+          ScopeV->getZExtValue(), MIRBuilder, SpvTypeInt32, /*EmitIR=*/false);
+      MIRBuilder.buildInstr(SPIRV::OpDecorateId)
+          .addUse(Reg)
+          .addImm(Dec)
+          .addUse(ScopeReg);
+      continue;
+    }
+    auto MIB = MIRBuilder.buildInstr(SPIRV::OpDecorate).addUse(Reg).addImm(Dec);
     for (unsigned OpI = 1, OpE = OpMD->getNumOperands(); OpI != OpE; ++OpI) {
       if (ConstantInt *OpV =
               mdconst::dyn_extract<ConstantInt>(OpMD->getOperand(OpI)))

diff  --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/vk-ext-builtin-input.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/vk-ext-builtin-input.ll
index a551bf8078ad4..9c5300fdb080e 100644
--- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/vk-ext-builtin-input.ll
+++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/vk-ext-builtin-input.ll
@@ -3,6 +3,7 @@
 ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-vulkan-unknown %s -o - -filetype=obj | spirv-val %}
 
 ; CHECK-DAG:        OpDecorate %[[#WorkgroupId:]] BuiltIn WorkgroupId
+; CHECK-DAG:        OpDecorateId %[[#UniformVar:]] UniformId %[[#Scope:]]
 
 ; CHECK-DAG:             %[[#uint:]] = OpTypeInt 32 0
 ; CHECK-DAG:           %[[#uint_0:]] = OpConstant %[[#uint]] 0
@@ -10,7 +11,9 @@
 ; CHECK-DAG:   %[[#ptr_Input_uint:]] = OpTypePointer Input %[[#uint]]
 ; CHECK-DAG: %[[#ptr_Input_v3uint:]] = OpTypePointer Input %[[#v3uint]]
 ; CHECK-DAG:      %[[#WorkgroupId:]] = OpVariable %[[#ptr_Input_v3uint]] Input
+; CHECK-DAG:            %[[#Scope]] = OpConstant %[[#uint]] 2
 @var = external local_unnamed_addr addrspace(7) externally_initialized constant <3 x i32>, align 16, !spirv.Decorations !0
+ at uvar = external local_unnamed_addr addrspace(7) externally_initialized constant i32, !spirv.Decorations !2
 
 define i32 @foo() {
 entry:
@@ -21,5 +24,13 @@ entry:
   ret i32 %0
 }
 
+define i32 @bar() {
+entry:
+  %0 = load i32, ptr addrspace(7) @uvar
+  ret i32 %0
+}
+
 !0 = !{!1}
 !1 = !{i32 11, i32 26}
+!2 = !{!3}
+!3 = !{i32 27, i32 2} ; 27 is UniformId decoration, 2 is Workgroup scope


        


More information about the llvm-commits mailing list