[llvm] [SPIR-V] Support `nonuniformindex` intrsinsic in SPIRV CodeGen. (PR #162540)

Lucie Choi via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 10 10:49:19 PDT 2025


================
@@ -3734,41 +3732,38 @@ bool SPIRVInstructionSelector::selectResourceNonUniformIndex(
   // load/store/sample/atomic must be decorated, so we need to propagate the
   // decoration through access chains and copies.
   // https://docs.vulkan.org/samples/latest/samples/extensions/descriptor_indexing/README.html#_when_to_use_non_uniform_indexing_qualifier
-  recursivelyDecorateChildAsNonUniform(ResVReg, ResType, I);
+  decorateUsesAsNonUniform(ResVReg);
   return true;
 }
 
-void SPIRVInstructionSelector::recursivelyDecorateChildAsNonUniform(
-    Register &NonUniformReg, const SPIRVType *RegType, MachineInstr &I) const {
-  std::vector<std::tuple<Register, const SPIRVType *, MachineInstr *>> WorkList;
-  bool isDecorated = false;
-  for (MachineInstr &Use :
-       RegType->getMF()->getRegInfo().use_instructions(NonUniformReg)) {
-    if (Use.getOpcode() != SPIRV::OpDecorate &&
-        Use.getOpcode() != SPIRV::OpAccessChain &&
-        Use.getOpcode() != SPIRV::OpCopyObject &&
-        Use.getOpcode() != SPIRV::OpLoad)
-      continue;
-
-    if (Use.getOpcode() == SPIRV::OpDecorate &&
-        Use.getOperand(1).getImm() == SPIRV::Decoration::NonUniformEXT) {
-      isDecorated = true;
-      continue;
+void SPIRVInstructionSelector::decorateUsesAsNonUniform(
+    Register &NonUniformReg) const {
+  std::vector<Register> WorkList = {NonUniformReg};
+  while (WorkList.size() > 0) {
+    Register CurrentReg = WorkList.at(0);
+    WorkList.erase(WorkList.begin());
----------------
luciechoi wrote:

Done

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


More information about the llvm-commits mailing list