llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-analysis @llvm/pr-subscribers-backend-directx Author: Helena Kotas (hekota) <details> <summary>Changes</summary> This change uses resource name during DXIL resource binding analysis to detect when two (or more) resources have identical overlapping binding. The DXIL resource analysis just detects that there is a problem with the binding and sets the `hasOverlappingBinding` flag. Full error reporting will happen later in DXILPostOptimizationValidation pass (llvm/llvm-project#<!-- -->110723). Depends on #<!-- -->139991 --- Full diff: https://github.com/llvm/llvm-project/pull/140645.diff 2 Files Affected: - (modified) llvm/lib/Analysis/DXILResource.cpp (+9-8) - (modified) llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp (+5-7) ``````````diff diff --git a/llvm/lib/Analysis/DXILResource.cpp b/llvm/lib/Analysis/DXILResource.cpp index 36b3901246285..d0c1e1e9ba2d3 100644 --- a/llvm/lib/Analysis/DXILResource.cpp +++ b/llvm/lib/Analysis/DXILResource.cpp @@ -892,10 +892,11 @@ void DXILResourceBindingInfo::populate(Module &M, DXILResourceTypeMap &DRTM) { uint32_t Space; uint32_t LowerBound; uint32_t UpperBound; + Value *Name; Binding(ResourceClass RC, uint32_t Space, uint32_t LowerBound, - uint32_t UpperBound) - : RC(RC), Space(Space), LowerBound(LowerBound), UpperBound(UpperBound) { - } + uint32_t UpperBound, Value *Name) + : RC(RC), Space(Space), LowerBound(LowerBound), UpperBound(UpperBound), + Name(Name) {} }; SmallVector<Binding> Bindings; @@ -920,6 +921,7 @@ void DXILResourceBindingInfo::populate(Module &M, DXILResourceTypeMap &DRTM) { cast<ConstantInt>(CI->getArgOperand(1))->getZExtValue(); int32_t Size = cast<ConstantInt>(CI->getArgOperand(2))->getZExtValue(); + Value *Name = CI->getArgOperand(5); // negative size means unbounded resource array; // upper bound register overflow should be detected in Sema @@ -927,7 +929,7 @@ void DXILResourceBindingInfo::populate(Module &M, DXILResourceTypeMap &DRTM) { "upper bound register overflow"); uint32_t UpperBound = Size < 0 ? UINT32_MAX : LowerBound + Size - 1; Bindings.emplace_back(RTI.getResourceClass(), Space, LowerBound, - UpperBound); + UpperBound, Name); } break; } @@ -946,8 +948,9 @@ void DXILResourceBindingInfo::populate(Module &M, DXILResourceTypeMap &DRTM) { // remove duplicates Binding *NewEnd = llvm::unique(Bindings, [](auto &LHS, auto &RHS) { - return std::tie(LHS.RC, LHS.Space, LHS.LowerBound, LHS.UpperBound) == - std::tie(RHS.RC, RHS.Space, RHS.LowerBound, RHS.UpperBound); + return std::tie(LHS.RC, LHS.Space, LHS.LowerBound, LHS.UpperBound, + LHS.Name) == std::tie(RHS.RC, RHS.Space, RHS.LowerBound, + RHS.UpperBound, RHS.Name); }); if (NewEnd != Bindings.end()) Bindings.erase(NewEnd); @@ -987,8 +990,6 @@ void DXILResourceBindingInfo::populate(Module &M, DXILResourceTypeMap &DRTM) { if (B.UpperBound < UINT32_MAX) S->FreeRanges.emplace_back(B.UpperBound + 1, UINT32_MAX); } else { - // FIXME: This only detects overlapping bindings that are not an exact - // match (llvm/llvm-project#110723) OverlappingBinding = true; if (B.UpperBound < UINT32_MAX) LastFreeRange.LowerBound = diff --git a/llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp b/llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp index 6cd0d9f4fc5e7..6cd1a48d8d5fd 100644 --- a/llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp +++ b/llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp @@ -167,7 +167,6 @@ TEST_F(ResourceBindingAnalysisTest, TestUnboundedAndOverlap) { // StructuredBuffer<float> C[] : register(t0, space2); // StructuredBuffer<float> D : register(t4, space2); /* overlapping */ StringRef Assembly = R"( -%__cblayout_CB = type <{ i32 }> define void @main() { entry: %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 -1, i32 10, i1 false, ptr null) @@ -198,11 +197,12 @@ TEST_F(ResourceBindingAnalysisTest, TestExactOverlap) { // StructuredBuffer<float> A : register(t5); // StructuredBuffer<float> B : register(t5); StringRef Assembly = R"( -%__cblayout_CB = type <{ i32 }> +@A.str = private unnamed_addr constant [2 x i8] c"A\00", align 1 +@B.str = private unnamed_addr constant [2 x i8] c"B\00", align 1 define void @main() { entry: - %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) - %handleB = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) + %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr @A.str) + %handleB = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr @B.str) ret void } )"; @@ -213,9 +213,7 @@ define void @main() { MAM->getResult<DXILResourceBindingAnalysis>(*M); EXPECT_EQ(false, DRBI.hasImplicitBinding()); - // FIXME (XFAIL): detecting overlap of two resource with identical binding - // is not yet supported (llvm/llvm-project#110723). - EXPECT_EQ(false, DRBI.hasOverlappingBinding()); + EXPECT_EQ(true, DRBI.hasOverlappingBinding()); DXILResourceBindingInfo::BindingSpaces &SRVSpaces = DRBI.getBindingSpaces(ResourceClass::SRV); `````````` </details> https://github.com/llvm/llvm-project/pull/140645 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits