Skip to content

Commit b65d3bc

Browse files
committed
fix bug & update tests
1 parent f58e2d5 commit b65d3bc

File tree

4 files changed

+52
-34
lines changed

4 files changed

+52
-34
lines changed

llvm/lib/Analysis/DXILResource.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,9 @@ bool DXILResourceBindingInfo::RegisterSpace::findAvailableBinding(
10361036

10371037
// single resource or fixed-size array
10381038
for (BindingRange &R : FreeRanges) {
1039-
if (R.UpperBound - R.LowerBound + 1 < (uint32_t)Size)
1039+
// compare the size as uint64_t to prevent overflow for range (0,
1040+
// UINT32_MAX)
1041+
if ((uint64_t)R.UpperBound - R.LowerBound + 1 < (uint64_t)Size)
10401042
continue;
10411043
*RegSlot = R.LowerBound;
10421044
// This might create a range where (LowerBound == UpperBound + 1), but

llvm/test/CodeGen/DirectX/ImplicitBinding/arrays.ll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ define void @test_arrays() {
3535
; CHECK: %{{.*}} = call target("dx.TypedBuffer", i32, 1, 0, 0)
3636
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 0, i32 2, i32 1, i1 false)
3737

38+
; another access to resource array B to make sure it gets the same binding
39+
%bufB2 = call target("dx.TypedBuffer", float, 1, 0, 0)
40+
@llvm.dx.resource.handlefromimplicitbinding(i32 10, i32 0, i32 4, i32 0, i1 false)
41+
; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0)
42+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 3, i32 4, i32 0, i1 false)
43+
3844
; CHECK-NOT: @llvm.dx.resource.handlefromimplicitbinding
3945
ret void
4046
}

llvm/test/CodeGen/DirectX/ImplicitBinding/multiple-spaces.ll

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,54 @@
11
; RUN: opt -S -dxil-resource-implicit-binding %s | FileCheck %s
22

33
; Resources defined (with random order of handlefromimplicitbinding calls):
4-
; RWBuffer<float> A : register(u5); // defaults to space0
5-
; RWBuffer<int> B[]; // gets u6 (unbounded range)
6-
; RWBuffer<float> C[4] : register(space5); // gets u0 in space5
7-
; RWBuffer<int> D[] : register(space5); // gets u4 in space5
8-
; RWBuffer<float> E[3] : register(space10); // gets u0, space10
9-
; StructuredBuffer<int> F : register(space3);; // gets t0 in space3
4+
; RWBuffer<float> A : register(u5); // defaults to space0
5+
; RWBuffer<int> B[]; // gets u6 (unbounded range)
6+
; RWBuffer<float> C[4] : registcer(space5); // gets u0 in space5
7+
; RWBuffer<int> D[] : register(space5); // gets u4 in space5
8+
; RWBuffer<float> E[3] : register(space10); // gets u0, space10
9+
; StructuredBuffer<int> F : register(space3); // gets t0 in space3
1010

1111
target triple = "dxil-pc-shadermodel6.6-compute"
1212

1313
define void @test_many_spaces() {
1414

15-
; RWBuffer<float> A : register(u1);
15+
; RWBuffer<float> A : register(u5);
1616
%bufA = call target("dx.TypedBuffer", float, 1, 0, 0)
17-
@llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false)
17+
@llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false)
1818
; no change to llvm.dx.resource.handlefrombinding
1919
; CHECK: %bufA = call target("dx.TypedBuffer", float, 1, 0, 0)
20-
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 1, i32 1, i32 0, i1 false)
20+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 5, i32 1, i32 0, i1 false)
2121

22-
; RWBuffer<float> B[];
23-
%bufB = call target("dx.TypedBuffer", float, 1, 0, 0)
22+
; RWBuffer<int> B[];
23+
%bufB = call target("dx.TypedBuffer", i32, 1, 0, 0)
2424
@llvm.dx.resource.handlefromimplicitbinding(i32 100, i32 0, i32 -1, i32 0, i1 false)
25-
; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0)
26-
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 6, i32 -1, i32 0, i1 false)
25+
; CHECK: %{{.*}} = call target("dx.TypedBuffer", i32, 1, 0, 0)
26+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 6, i32 -1, i32 0, i1 false)
2727

28-
; RWBuffer<int> C : register(u5);
29-
%bufC = call target("dx.TypedBuffer", i32, 1, 0, 0)
30-
@llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false)
31-
; no change to llvm.dx.resource.handlefrombinding
32-
; CHECK: %bufC = call target("dx.TypedBuffer", i32, 1, 0, 0)
33-
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 5, i32 1, i32 0, i1 false)
28+
; RWBuffer<float> C[4] : register(space5);
29+
%bufC = call target("dx.TypedBuffer", i32, 1, 0, 0)
30+
@llvm.dx.resource.handlefromimplicitbinding(i32 101, i32 5, i32 4, i32 0, i1 false)
31+
; CHECK: %{{.*}} = call target("dx.TypedBuffer", i32, 1, 0, 0)
32+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 5, i32 0, i32 4, i32 0, i1 false)
3433

35-
; ; RWBuffer<float> D[3];
36-
%bufD = call target("dx.TypedBuffer", float, 1, 0, 0)
37-
@llvm.dx.resource.handlefromimplicitbinding(i32 101, i32 0, i32 3, i32 1, i1 false)
34+
; RWBuffer<int> D[] : register(space5);
35+
%bufD = call target("dx.TypedBuffer", i32, 1, 0, 0)
36+
@llvm.dx.resource.handlefromimplicitbinding(i32 102, i32 5, i32 -1, i32 0, i1 false)
37+
; CHECK: %{{.*}} = call target("dx.TypedBuffer", i32, 1, 0, 0)
38+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 5, i32 4, i32 -1, i32 0, i1 false)
39+
40+
; RWBuffer<float> E[3] : register(space10); // gets u0, space10
41+
%bufE = call target("dx.TypedBuffer", float, 1, 0, 0)
42+
@llvm.dx.resource.handlefromimplicitbinding(i32 103, i32 10, i32 4, i32 0, i1 false)
3843
; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0)
39-
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 2, i32 3, i32 1, i1 false)
44+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 10, i32 0, i32 4, i32 0, i1 false)
45+
46+
; StructuredBuffer<int> F : register(space3); // gets t0 in space3
47+
%bufF = call target("dx.RawBuffer", i32, 0, 0)
48+
@llvm.dx.resource.handlefromimplicitbinding(i32 104, i32 3, i32 1, i32 0, i1 false)
49+
; CHECK: %{{.*}} = call target("dx.RawBuffer", i32, 0, 0)
50+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_0_0t(i32 3, i32 0, i32 1, i32 0, i1 false)
4051

4152
; CHECK-NOT: @llvm.dx.resource.handlefromimplicitbinding
4253
ret void
4354
}
44-

llvm/test/CodeGen/DirectX/ImplicitBinding/simple.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@ target triple = "dxil-pc-shadermodel6.6-compute"
55
define void @test_simple_binding() {
66

77
; StructuredBuffer<float> A : register(t1);
8-
%bufA = call target("dx.RawBuffer", float, 0, 0, 0)
8+
%bufA = call target("dx.RawBuffer", float, 0, 0)
99
@llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false)
1010
; no change to llvm.dx.resource.handlefrombinding
11-
; CHECK: %bufA = call target("dx.RawBuffer", float, 0, 0, 0)
12-
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0t(i32 0, i32 1, i32 1, i32 0, i1 false)
11+
; CHECK: %bufA = call target("dx.RawBuffer", float, 0, 0)
12+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 1, i32 1, i32 0, i1 false)
1313

1414
; StructuredBuffer<float> B; // gets register(t0, space0)
15-
%bufB = call target("dx.RawBuffer", float, 0, 0, 0)
15+
%bufB = call target("dx.RawBuffer", float, 0, 0)
1616
@llvm.dx.resource.handlefromimplicitbinding(i32 5, i32 0, i32 1, i32 0, i1 false)
17-
; CHECK: %{{.*}} = call target("dx.RawBuffer", float, 0, 0, 0)
18-
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false)
17+
; CHECK: %{{.*}} = call target("dx.RawBuffer", float, 0, 0)
18+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false)
1919

2020
; StructuredBuffer<float> C; // gets register(t2, space0)
21-
%bufC = call target("dx.RawBuffer", float, 0, 0, 0)
21+
%bufC = call target("dx.RawBuffer", float, 0, 0)
2222
@llvm.dx.resource.handlefromimplicitbinding(i32 6, i32 0, i32 1, i32 0, i1 false)
23-
; CHECK: %{{.*}} = call target("dx.RawBuffer", float, 0, 0, 0)
24-
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0t(i32 0, i32 2, i32 1, i32 0, i1 false)
23+
; CHECK: %{{.*}} = call target("dx.RawBuffer", float, 0, 0)
24+
; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 2, i32 1, i32 0, i1 false)
2525

2626
; CHECK-NOT: @llvm.dx.resource.handlefromimplicitbinding
2727

0 commit comments

Comments
 (0)