@@ -53,227 +53,6 @@ class UniqueResourceFromUseTest : public testing::Test {
5353 }
5454};
5555
56- TEST_F (UniqueResourceFromUseTest, TestTrivialUse) {
57- StringRef Assembly = R"(
58- define void @main() {
59- entry:
60- %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false)
61- call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
62- call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
63- ret void
64- }
65-
66- declare void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
67- )" ;
68-
69- auto M = parseAsm (Assembly);
70-
71- DXILResourceMap &DRM = MAM->getResult <DXILResourceAnalysis>(*M);
72- for (const Function &F : M->functions ()) {
73- if (F.getName () != " a.func" ) {
74- continue ;
75- }
76-
77- unsigned CalledResources = 0 ;
78-
79- for (const User *U : F.users ()) {
80- const CallInst *CI = cast<CallInst>(U);
81- const Value *Handle = CI->getArgOperand (0 );
82- const auto Bindings = DRM.findByUse (Handle);
83- ASSERT_EQ (Bindings.size (), 1u )
84- << " Handle should resolve into one resource" ;
85-
86- auto Binding = Bindings[0 ]->getBinding ();
87- EXPECT_EQ (0u , Binding.RecordID );
88- EXPECT_EQ (1u , Binding.Space );
89- EXPECT_EQ (2u , Binding.LowerBound );
90- EXPECT_EQ (3u , Binding.Size );
91-
92- CalledResources++;
93- }
94-
95- EXPECT_EQ (2u , CalledResources)
96- << " Expected 2 resolved call to create resource" ;
97- }
98- }
99-
100- TEST_F (UniqueResourceFromUseTest, TestIndirectUse) {
101- StringRef Assembly = R"(
102- define void @foo() {
103- %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false)
104- %handle2 = call target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %handle)
105- %handle3 = call target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %handle2)
106- %handle4 = call target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %handle3)
107- call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle4)
108- ret void
109- }
110-
111- declare void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
112- declare target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %handle)
113- )" ;
114-
115- auto M = parseAsm (Assembly);
116-
117- DXILResourceMap &DRM = MAM->getResult <DXILResourceAnalysis>(*M);
118- for (const Function &F : M->functions ()) {
119- if (F.getName () != " a.func" ) {
120- continue ;
121- }
122-
123- unsigned CalledResources = 0 ;
124-
125- for (const User *U : F.users ()) {
126- const CallInst *CI = cast<CallInst>(U);
127- const Value *Handle = CI->getArgOperand (0 );
128- const auto Bindings = DRM.findByUse (Handle);
129- ASSERT_EQ (Bindings.size (), 1u )
130- << " Handle should resolve into one resource" ;
131-
132- auto Binding = Bindings[0 ]->getBinding ();
133- EXPECT_EQ (0u , Binding.RecordID );
134- EXPECT_EQ (1u , Binding.Space );
135- EXPECT_EQ (2u , Binding.LowerBound );
136- EXPECT_EQ (3u , Binding.Size );
137-
138- CalledResources++;
139- }
140-
141- EXPECT_EQ (1u , CalledResources)
142- << " Expected 1 resolved call to create resource" ;
143- }
144- }
145-
146- TEST_F (UniqueResourceFromUseTest, TestAmbigousIndirectUse) {
147- StringRef Assembly = R"(
148- define void @foo() {
149- %foo = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 1, i32 1, i32 1, i1 false)
150- %bar = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 2, i32 2, i32 2, i1 false)
151- %baz = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 3, i32 3, i32 3, i32 3, i1 false)
152- %bat = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 4, i32 4, i32 4, i32 4, i1 false)
153- %a = call target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %foo, target("dx.RawBuffer", float, 1, 0) %bar)
154- %b = call target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %baz, target("dx.RawBuffer", float, 1, 0) %bat)
155- %handle = call target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %a, target("dx.RawBuffer", float, 1, 0) %b)
156- call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
157- ret void
158- }
159-
160- declare void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
161- declare target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %x, target("dx.RawBuffer", float, 1, 0) %y)
162- )" ;
163-
164- auto M = parseAsm (Assembly);
165-
166- DXILResourceMap &DRM = MAM->getResult <DXILResourceAnalysis>(*M);
167- for (const Function &F : M->functions ()) {
168- if (F.getName () != " a.func" ) {
169- continue ;
170- }
171-
172- unsigned CalledResources = 0 ;
173-
174- for (const User *U : F.users ()) {
175- const CallInst *CI = cast<CallInst>(U);
176- const Value *Handle = CI->getArgOperand (0 );
177- const auto Bindings = DRM.findByUse (Handle);
178- ASSERT_EQ (Bindings.size (), 4u )
179- << " Handle should resolve into four resources" ;
180-
181- auto Binding = Bindings[0 ]->getBinding ();
182- EXPECT_EQ (0u , Binding.RecordID );
183- EXPECT_EQ (1u , Binding.Space );
184- EXPECT_EQ (1u , Binding.LowerBound );
185- EXPECT_EQ (1u , Binding.Size );
186-
187- Binding = Bindings[1 ]->getBinding ();
188- EXPECT_EQ (1u , Binding.RecordID );
189- EXPECT_EQ (2u , Binding.Space );
190- EXPECT_EQ (2u , Binding.LowerBound );
191- EXPECT_EQ (2u , Binding.Size );
192-
193- Binding = Bindings[2 ]->getBinding ();
194- EXPECT_EQ (2u , Binding.RecordID );
195- EXPECT_EQ (3u , Binding.Space );
196- EXPECT_EQ (3u , Binding.LowerBound );
197- EXPECT_EQ (3u , Binding.Size );
198-
199- Binding = Bindings[3 ]->getBinding ();
200- EXPECT_EQ (3u , Binding.RecordID );
201- EXPECT_EQ (4u , Binding.Space );
202- EXPECT_EQ (4u , Binding.LowerBound );
203- EXPECT_EQ (4u , Binding.Size );
204-
205- CalledResources++;
206- }
207-
208- EXPECT_EQ (1u , CalledResources)
209- << " Expected 1 resolved call to create resource" ;
210- }
211- }
212-
213- TEST_F (UniqueResourceFromUseTest, TestConditionalUse) {
214- StringRef Assembly = R"(
215- define void @foo(i32 %n) {
216- entry:
217- %x = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 1, i32 1, i32 1, i1 false)
218- %y = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 4, i32 4, i32 4, i32 4, i1 false)
219- %cond = icmp eq i32 %n, 0
220- br i1 %cond, label %bb.true, label %bb.false
221-
222- bb.true:
223- %handle_t = call target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %x)
224- br label %bb.exit
225-
226- bb.false:
227- %handle_f = call target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %y)
228- br label %bb.exit
229-
230- bb.exit:
231- %handle = phi target("dx.RawBuffer", float, 1, 0) [ %handle_t, %bb.true ], [ %handle_f, %bb.false ]
232- call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
233- ret void
234- }
235-
236- declare void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
237- declare target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", float, 1, 0) %x)
238- )" ;
239-
240- auto M = parseAsm (Assembly);
241-
242- DXILResourceMap &DRM = MAM->getResult <DXILResourceAnalysis>(*M);
243- for (const Function &F : M->functions ()) {
244- if (F.getName () != " a.func" ) {
245- continue ;
246- }
247-
248- unsigned CalledResources = 0 ;
249-
250- for (const User *U : F.users ()) {
251- const CallInst *CI = cast<CallInst>(U);
252- const Value *Handle = CI->getArgOperand (0 );
253- const auto Bindings = DRM.findByUse (Handle);
254- ASSERT_EQ (Bindings.size (), 2u )
255- << " Handle should resolve into four resources" ;
256-
257- auto Binding = Bindings[0 ]->getBinding ();
258- EXPECT_EQ (0u , Binding.RecordID );
259- EXPECT_EQ (1u , Binding.Space );
260- EXPECT_EQ (1u , Binding.LowerBound );
261- EXPECT_EQ (1u , Binding.Size );
262-
263- Binding = Bindings[1 ]->getBinding ();
264- EXPECT_EQ (1u , Binding.RecordID );
265- EXPECT_EQ (4u , Binding.Space );
266- EXPECT_EQ (4u , Binding.LowerBound );
267- EXPECT_EQ (4u , Binding.Size );
268-
269- CalledResources++;
270- }
271-
272- EXPECT_EQ (1u , CalledResources)
273- << " Expected 1 resolved call to create resource" ;
274- }
275- }
276-
27756// Test that several calls to decrement on the same resource don't raise a
27857// Diagnositic and resolves to a single decrement entry
27958TEST_F (UniqueResourceFromUseTest, TestResourceCounterDecrement) {
0 commit comments