[llvm] [SPIR-V] Prevent adding duplicate binding instructions for implicit binding (PR #161299)

Steven Perron via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 30 10:42:42 PDT 2025


================
@@ -112,11 +112,22 @@ uint32_t SPIRVLegalizeImplicitBinding::getAndReserveFirstUnusedBinding(
 }
 
 void SPIRVLegalizeImplicitBinding::replaceImplicitBindingCalls(Module &M) {
+  std::unordered_map<uint32_t, uint32_t> OrderIdToBinding;
+
   for (CallInst *OldCI : ImplicitBindingCalls) {
     IRBuilder<> Builder(OldCI);
+    const uint32_t OrderId =
+        cast<ConstantInt>(OldCI->getArgOperand(0))->getZExtValue();
     const uint32_t DescSet =
         cast<ConstantInt>(OldCI->getArgOperand(1))->getZExtValue();
-    const uint32_t NewBinding = getAndReserveFirstUnusedBinding(DescSet);
+
+    // Reuse an existing binding for this order ID, if one was already assigned.
+    // Otherwise, assign a new binding.
+    const uint32_t NewBinding =
+        (OrderIdToBinding.find(OrderId) != OrderIdToBinding.end())
+            ? OrderIdToBinding[OrderId]
+            : getAndReserveFirstUnusedBinding(DescSet);
+    OrderIdToBinding[OrderId] = NewBinding;
----------------
s-perron wrote:

It is what we currently do, but I don't know if that is specified. That means it could change, or another FE could use the same intrinsics. We have to either issue an error if it is not true or handle it.

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


More information about the llvm-commits mailing list