Skip to content

Commit f774697

Browse files
committed
[SPIR-V] Prevent duplicate binding for implicit binding
1 parent 5d39b87 commit f774697

File tree

2 files changed

+39
-24
lines changed

2 files changed

+39
-24
lines changed

llvm/lib/Target/SPIRV/SPIRVLegalizeImplicitBinding.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,22 @@ uint32_t SPIRVLegalizeImplicitBinding::getAndReserveFirstUnusedBinding(
112112
}
113113

114114
void SPIRVLegalizeImplicitBinding::replaceImplicitBindingCalls(Module &M) {
115+
std::unordered_map<uint32_t, uint32_t> OrderIdToBinding;
116+
115117
for (CallInst *OldCI : ImplicitBindingCalls) {
116118
IRBuilder<> Builder(OldCI);
119+
const uint32_t OrderId =
120+
cast<ConstantInt>(OldCI->getArgOperand(0))->getZExtValue();
117121
const uint32_t DescSet =
118122
cast<ConstantInt>(OldCI->getArgOperand(1))->getZExtValue();
119-
const uint32_t NewBinding = getAndReserveFirstUnusedBinding(DescSet);
123+
124+
// Reuse an existing binding for this order ID, if one was already assigned.
125+
// Otherwise, assign a new binding.
126+
const uint32_t NewBinding =
127+
(OrderIdToBinding.find(OrderId) != OrderIdToBinding.end())
128+
? OrderIdToBinding[OrderId]
129+
: getAndReserveFirstUnusedBinding(DescSet);
130+
OrderIdToBinding[OrderId] = NewBinding;
120131

121132
SmallVector<Value *, 8> Args;
122133
Args.push_back(Builder.getInt32(DescSet));

llvm/test/CodeGen/SPIRV/hlsl-resources/ImplicitBinding.ll

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,34 @@ entry:
4444
%3 = tail call target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) @llvm.spv.resource.handlefrombinding.tspirv.SignedImage_i32_5_2_0_0_2_0t(i32 0, i32 2, i32 1, i32 0, ptr nonnull @.str.6)
4545
%4 = tail call target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) @llvm.spv.resource.handlefrombinding.tspirv.SignedImage_i32_5_2_0_0_2_0t(i32 10, i32 1, i32 1, i32 0, ptr nonnull @.str.8)
4646
%5 = tail call target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) @llvm.spv.resource.handlefromimplicitbinding.tspirv.SignedImage_i32_5_2_0_0_2_0t(i32 2, i32 10, i32 1, i32 0, ptr nonnull @.str.10)
47-
%6 = tail call target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) @llvm.spv.resource.handlefromimplicitbinding.tspirv.SignedImage_i32_5_2_0_0_2_0t(i32 3, i32 10, i32 1, i32 0, ptr nonnull @.str.12)
47+
%6 = tail call target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) @llvm.spv.resource.handlefromimplicitbinding.tspirv.SignedImage_i32_5_2_0_0_2_0t(i32 3, i32 10, i32 2, i32 0, ptr nonnull @.str.12)
4848
%7 = tail call target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) @llvm.spv.resource.handlefrombinding.tspirv.SignedImage_i32_5_2_0_0_2_0t(i32 10, i32 2, i32 1, i32 0, ptr nonnull @.str.14)
49-
%8 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %1, i32 0)
50-
%9 = load i32, ptr addrspace(11) %8, align 4
51-
%10 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %2, i32 0)
52-
%11 = load i32, ptr addrspace(11) %10, align 4
53-
%add.i = add nsw i32 %11, %9
54-
%12 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %3, i32 0)
55-
%13 = load i32, ptr addrspace(11) %12, align 4
56-
%add4.i = add nsw i32 %add.i, %13
57-
%14 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %4, i32 0)
58-
%15 = load i32, ptr addrspace(11) %14, align 4
59-
%add6.i = add nsw i32 %add4.i, %15
60-
%16 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %5, i32 0)
61-
%17 = load i32, ptr addrspace(11) %16, align 4
62-
%add8.i = add nsw i32 %add6.i, %17
63-
%18 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %6, i32 0)
64-
%19 = load i32, ptr addrspace(11) %18, align 4
65-
%add10.i = add nsw i32 %add8.i, %19
66-
%20 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %7, i32 0)
67-
%21 = load i32, ptr addrspace(11) %20, align 4
68-
%add12.i = add nsw i32 %add10.i, %21
69-
%22 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %0, i32 0)
70-
store i32 %add12.i, ptr addrspace(11) %22, align 4
49+
%8 = tail call target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) @llvm.spv.resource.handlefromimplicitbinding.tspirv.SignedImage_i32_5_2_0_0_2_0t(i32 3, i32 10, i32 2, i32 1, ptr nonnull @.str.12)
50+
%9 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %1, i32 0)
51+
%10 = load i32, ptr addrspace(11) %9, align 4
52+
%11 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %2, i32 0)
53+
%12 = load i32, ptr addrspace(11) %11, align 4
54+
%add.i = add nsw i32 %12, %10
55+
%13 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %3, i32 0)
56+
%14 = load i32, ptr addrspace(11) %13, align 4
57+
%add4.i = add nsw i32 %add.i, %14
58+
%15 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %4, i32 0)
59+
%16 = load i32, ptr addrspace(11) %15, align 4
60+
%add6.i = add nsw i32 %add4.i, %16
61+
%17 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %5, i32 0)
62+
%18 = load i32, ptr addrspace(11) %17, align 4
63+
%add8.i = add nsw i32 %add6.i, %18
64+
%19 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %6, i32 0)
65+
%20 = load i32, ptr addrspace(11) %19, align 4
66+
%add10.i = add nsw i32 %add8.i, %20
67+
%21 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %7, i32 0)
68+
%22 = load i32, ptr addrspace(11) %21, align 4
69+
%add12.i = add nsw i32 %add10.i, %22
70+
%23 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %8, i32 0)
71+
%24 = load i32, ptr addrspace(11) %23, align 4
72+
%add14.i = add nsw i32 %add12.i, %24
73+
%25 = tail call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %0, i32 0)
74+
store i32 %add14.i, ptr addrspace(11) %25, align 4
7175
ret void
7276
}
7377

0 commit comments

Comments
 (0)