@@ -281,17 +281,14 @@ declare target("dx.RawBuffer", float, 1, 0) @ind.func(target("dx.RawBuffer", flo
281
281
}
282
282
}
283
283
284
- TEST_F (UniqueResourceFromUseTest, TestResourceCounter ) {
284
+ TEST_F (UniqueResourceFromUseTest, TestResourceCounterDecrement ) {
285
285
StringRef Assembly = R"(
286
286
define void @main() {
287
287
entry:
288
288
%handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 1, i32 2, i32 3, i32 4, i1 false)
289
289
call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1)
290
290
call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1)
291
291
call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1)
292
- call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1)
293
- call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1)
294
- call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1)
295
292
call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
296
293
ret void
297
294
}
@@ -325,4 +322,129 @@ declare void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
325
322
}
326
323
}
327
324
325
+ TEST_F (UniqueResourceFromUseTest, TestResourceCounterIncrement) {
326
+ StringRef Assembly = R"(
327
+ define void @main() {
328
+ entry:
329
+ %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 1, i32 2, i32 3, i32 4, i1 false)
330
+ call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 1)
331
+ call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 1)
332
+ call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle, i8 1)
333
+ call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
334
+ ret void
335
+ }
336
+
337
+ declare target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32, i32, i32, i32, i1)
338
+ declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i8)
339
+ declare void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
340
+ )" ;
341
+
342
+ LLVMContext Context;
343
+ SMDiagnostic Error;
344
+ auto M = parseAssemblyString (Assembly, Error, Context);
345
+ ASSERT_TRUE (M) << " Bad assembly?" ;
346
+
347
+ const DXILBindingMap &DBM = MAM->getResult <DXILResourceBindingAnalysis>(*M);
348
+ const DXILResourceCounterDirectionMap &DCDM =
349
+ MAM->getResult <DXILResourceCounterDirectionAnalysis>(*M);
350
+
351
+ for (const Function &F : M->functions ()) {
352
+ if (F.getName () != " a.func" ) {
353
+ continue ;
354
+ }
355
+
356
+ for (const User *U : F.users ()) {
357
+ const CallInst *CI = cast<CallInst>(U);
358
+ const Value *Handle = CI->getArgOperand (0 );
359
+ const auto Bindings = DBM.findByUse (Handle);
360
+ ASSERT_EQ (Bindings.size (), 1u );
361
+ ASSERT_EQ (DCDM[Bindings.front ()], ResourceCounterDirection::Increment);
362
+ }
363
+ }
364
+ }
365
+
366
+ TEST_F (UniqueResourceFromUseTest, TestResourceCounterUnknown) {
367
+ StringRef Assembly = R"(
368
+ define void @main() {
369
+ entry:
370
+ %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 1, i32 2, i32 3, i32 4, i1 false)
371
+ call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
372
+ ret void
373
+ }
374
+
375
+ declare target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32, i32, i32, i32, i1)
376
+ declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i8)
377
+ declare void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
378
+ )" ;
379
+
380
+ LLVMContext Context;
381
+ SMDiagnostic Error;
382
+ auto M = parseAssemblyString (Assembly, Error, Context);
383
+ ASSERT_TRUE (M) << " Bad assembly?" ;
384
+
385
+ const DXILBindingMap &DBM = MAM->getResult <DXILResourceBindingAnalysis>(*M);
386
+ const DXILResourceCounterDirectionMap &DCDM =
387
+ MAM->getResult <DXILResourceCounterDirectionAnalysis>(*M);
388
+
389
+ for (const Function &F : M->functions ()) {
390
+ if (F.getName () != " a.func" ) {
391
+ continue ;
392
+ }
393
+
394
+ for (const User *U : F.users ()) {
395
+ const CallInst *CI = cast<CallInst>(U);
396
+ const Value *Handle = CI->getArgOperand (0 );
397
+ const auto Bindings = DBM.findByUse (Handle);
398
+ ASSERT_EQ (Bindings.size (), 1u );
399
+ ASSERT_EQ (DCDM[Bindings.front ()], ResourceCounterDirection::Unknown);
400
+ }
401
+ }
402
+ }
403
+
404
+ TEST_F (UniqueResourceFromUseTest, TestResourceCounterMultiple) {
405
+ StringRef Assembly = R"(
406
+ define void @main() {
407
+ entry:
408
+ %handle1 = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 1, i32 2, i32 3, i32 4, i1 false)
409
+ %handle2 = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 4, i32 3, i32 2, i32 1, i1 false)
410
+ call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle1, i8 -1)
411
+ call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %handle2, i8 1)
412
+ call void @a.func(target("dx.RawBuffer", float, 1, 0) %handle1)
413
+ call void @b.func(target("dx.RawBuffer", float, 1, 0) %handle2)
414
+ ret void
415
+ }
416
+
417
+ declare target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32, i32, i32, i32, i1)
418
+ declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i8)
419
+ declare void @a.func(target("dx.RawBuffer", float, 1, 0) %handle)
420
+ declare void @b.func(target("dx.RawBuffer", float, 1, 0) %handle)
421
+ )" ;
422
+
423
+ LLVMContext Context;
424
+ SMDiagnostic Error;
425
+ auto M = parseAssemblyString (Assembly, Error, Context);
426
+ ASSERT_TRUE (M) << " Bad assembly?" ;
427
+
428
+ const DXILBindingMap &DBM = MAM->getResult <DXILResourceBindingAnalysis>(*M);
429
+ const DXILResourceCounterDirectionMap &DCDM =
430
+ MAM->getResult <DXILResourceCounterDirectionAnalysis>(*M);
431
+
432
+ for (const Function &F : M->functions ()) {
433
+ StringRef FName = F.getName ();
434
+ if (FName != " a.func" && FName != " b.func" ) {
435
+ continue ;
436
+ }
437
+
438
+ auto Dir = FName == " a.func" ? ResourceCounterDirection::Decrement : ResourceCounterDirection::Increment;
439
+
440
+ for (const User *U : F.users ()) {
441
+ const CallInst *CI = cast<CallInst>(U);
442
+ const Value *Handle = CI->getArgOperand (0 );
443
+ const auto Bindings = DBM.findByUse (Handle);
444
+ ASSERT_EQ (Bindings.size (), 1u );
445
+ ASSERT_EQ (DCDM[Bindings.front ()], Dir);
446
+ }
447
+ }
448
+ }
449
+
328
450
} // namespace
0 commit comments