Skip to content

Commit a3ba00a

Browse files
authored
[HLSL][NFC] Simplify resource constructors codegen tests (#139842)
Verification of the local allocas and load/store is not that useful and it makes the test fragile.
1 parent 0afa62c commit a3ba00a

File tree

3 files changed

+24
-145
lines changed

3 files changed

+24
-145
lines changed

clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,8 @@ export void foo() {
3535
// Buf1 initialization part 2 - body of ByteAddressBuffer C1 constructor with explicit binding that calls the C2 constructor
3636
// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this,
3737
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index)
38-
// CHECK-NEXT: entry:
39-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
40-
// CHECK-NEXT: %registerNo.addr = alloca i32, align 4
41-
// CHECK-NEXT: %spaceNo.addr = alloca i32, align 4
42-
// CHECK-NEXT: %range.addr = alloca i32, align 4
43-
// CHECK-NEXT: %index.addr = alloca i32, align 4
44-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
45-
// CHECK-NEXT: store i32 %registerNo, ptr %registerNo.addr, align 4
46-
// CHECK-NEXT: store i32 %spaceNo, ptr %spaceNo.addr, align 4
47-
// CHECK-NEXT: store i32 %range, ptr %range.addr, align 4
48-
// CHECK-NEXT: store i32 %index, ptr %index.addr, align 4
49-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
50-
// CHECK-NEXT: %0 = load i32, ptr %registerNo.addr, align 4
51-
// CHECK-NEXT: %1 = load i32, ptr %spaceNo.addr, align 4
52-
// CHECK-NEXT: %2 = load i32, ptr %range.addr, align 4
53-
// CHECK-NEXT: %3 = load i32, ptr %index.addr, align 4
54-
// CHECK: call void @_ZN4hlsl17ByteAddressBufferC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this1,
55-
// CHECK-SAME: i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3)
56-
// CHECK-NEXT: ret void
38+
// CHECK: call void @_ZN4hlsl17ByteAddressBufferC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4)
39+
// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}})
5740

5841
// Buf2 initialization part 1 - FIXME: constructor with implicit binding does not exist yet;
5942
// the global init function currently calls the default RWByteAddressBuffer C1 constructor
@@ -71,43 +54,23 @@ export void foo() {
7154
// Buf3 initialization part 2 - body of RasterizerOrderedByteAddressBuffer default C1 constructor that
7255
// calls the default C2 constructor
7356
// CHECK: define linkonce_odr void @_ZN4hlsl34RasterizerOrderedByteAddressBufferC1Ev(ptr noundef nonnull align 4 dereferenceable(4) %this)
74-
// CHECK-NEXT: entry:
75-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
76-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
77-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
78-
// CHECK: call void @_ZN4hlsl34RasterizerOrderedByteAddressBufferC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this1)
57+
// CHECK: call void @_ZN4hlsl34RasterizerOrderedByteAddressBufferC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %{{.*}})
7958
// CHECK-NEXT: ret void
8059

8160
// Buf1 initialization part 3 - ByteAddressBuffer C2 constructor with explicit binding that initializes
8261
// handle with @llvm.dx.resource.handlefrombinding
8362
// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this,
8463
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index)
85-
// CHECK-NEXT: entry:
86-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
87-
// CHECK-NEXT: %registerNo.addr = alloca i32, align 4
88-
// CHECK-NEXT: %spaceNo.addr = alloca i32, align 4
89-
// CHECK-NEXT: %range.addr = alloca i32, align 4
90-
// CHECK-NEXT: %index.addr = alloca i32, align 4
91-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
92-
// CHECK-NEXT: store i32 %registerNo, ptr %registerNo.addr, align 4
93-
// CHECK-NEXT: store i32 %spaceNo, ptr %spaceNo.addr, align 4
94-
// CHECK-NEXT: store i32 %range, ptr %range.addr, align 4
95-
// CHECK-NEXT: store i32 %index, ptr %index.addr, align 4
96-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
97-
// CHECK-NEXT: %0 = load i32, ptr %registerNo.addr, align 4
98-
// CHECK-NEXT: %1 = load i32, ptr %spaceNo.addr, align 4
99-
// CHECK-NEXT: %2 = load i32, ptr %range.addr, align 4
100-
// CHECK-NEXT: %3 = load i32, ptr %index.addr, align 4
101-
// CHECK-DXIL-NEXT: %4 = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t(
102-
// CHECK-DXIL-SAME: i32 %1, i32 %0, i32 %2, i32 %3, i1 false)
103-
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::ByteAddressBuffer", ptr %this1, i32 0, i32 0
104-
// CHECK-DXIL-NEXT: store target("dx.RawBuffer", i8, 0, 0) %4, ptr %__handle, align 4
64+
// CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t(
65+
// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
66+
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::ByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
67+
// CHECK-DXIL-NEXT: store target("dx.RawBuffer", i8, 0, 0) %[[HANDLE]], ptr %__handle, align 4
10568
// CHECK-NEXT: ret void
10669

10770
// Buf3 initialization part 3 - body of RasterizerOrderedByteAddressBuffer default C2 constructor that
10871
// initializes handle to poison
10972
// CHECK: define linkonce_odr void @_ZN4hlsl34RasterizerOrderedByteAddressBufferC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this)
110-
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RasterizerOrderedByteAddressBuffer", ptr %this1, i32 0, i32 0
73+
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RasterizerOrderedByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
11174
// CHECK: store target("dx.RawBuffer", i8, 1, 1) poison, ptr %__handle, align 4
11275

11376
// Module initialization

clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl

Lines changed: 8 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,8 @@ export void foo() {
3535
// Buf1 initialization part 2 - body of RWBuffer<float> C1 constructor with explicit binding that calls the C2 constructor
3636
// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this,
3737
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index)
38-
// CHECK-NEXT: entry:
39-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
40-
// CHECK-NEXT: %registerNo.addr = alloca i32, align 4
41-
// CHECK-NEXT: %spaceNo.addr = alloca i32, align 4
42-
// CHECK-NEXT: %range.addr = alloca i32, align 4
43-
// CHECK-NEXT: %index.addr = alloca i32, align 4
44-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
45-
// CHECK-NEXT: store i32 %registerNo, ptr %registerNo.addr, align 4
46-
// CHECK-NEXT: store i32 %spaceNo, ptr %spaceNo.addr, align 4
47-
// CHECK-NEXT: store i32 %range, ptr %range.addr, align 4
48-
// CHECK-NEXT: store i32 %index, ptr %index.addr, align 4
49-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
50-
// CHECK-NEXT: %0 = load i32, ptr %registerNo.addr, align 4
51-
// CHECK-NEXT: %1 = load i32, ptr %spaceNo.addr, align 4
52-
// CHECK-NEXT: %2 = load i32, ptr %range.addr, align 4
53-
// CHECK-NEXT: %3 = load i32, ptr %index.addr, align 4
54-
// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this1,
55-
// CHECK-SAME: i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3)
56-
// CHECK-NEXT: ret void
38+
// CHECK: call void @_ZN4hlsl8RWBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4)
39+
// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}})
5740

5841
// Buf2 initialization part 1 - FIXME: constructor with implicit binding does not exist yet;
5942
// the global init function currently calls the default RWBufer<double> C1 constructor
@@ -69,48 +52,22 @@ export void foo() {
6952

7053
// Buf3 initialization part 2 - body of RWBuffer<int> default C1 constructor that calls the default C2 constructor
7154
// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) %this)
72-
// CHECK-NEXT: entry:
73-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
74-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
75-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
76-
// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this1)
77-
// CHECK-NEXT: ret void
55+
// CHECK: call void @_ZN4hlsl8RWBufferIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %{{.*}})
7856

7957
// Buf1 initialization part 3 - body of RWBuffer<float> C2 constructor with explicit binding that initializes
8058
// handle with @llvm.dx.resource.handlefrombinding
8159
// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this,
8260
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index)
83-
// CHECK-NEXT: entry:
84-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
85-
// CHECK-NEXT: %registerNo.addr = alloca i32, align 4
86-
// CHECK-NEXT: %spaceNo.addr = alloca i32, align 4
87-
// CHECK-NEXT: %range.addr = alloca i32, align 4
88-
// CHECK-NEXT: %index.addr = alloca i32, align 4
89-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
90-
// CHECK-NEXT: store i32 %registerNo, ptr %registerNo.addr, align 4
91-
// CHECK-NEXT: store i32 %spaceNo, ptr %spaceNo.addr, align 4
92-
// CHECK-NEXT: store i32 %range, ptr %range.addr, align 4
93-
// CHECK-NEXT: store i32 %index, ptr %index.addr, align 4
94-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
95-
// CHECK-NEXT: %0 = load i32, ptr %registerNo.addr, align 4
96-
// CHECK-NEXT: %1 = load i32, ptr %spaceNo.addr, align 4
97-
// CHECK-NEXT: %2 = load i32, ptr %range.addr, align 4
98-
// CHECK-NEXT: %3 = load i32, ptr %index.addr, align 4
99-
// CHECK-DXIL-NEXT: %4 = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(
100-
// CHECK-DXIL-SAME: i32 %1, i32 %0, i32 %2, i32 %3, i1 false)
101-
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer", ptr %this1, i32 0, i32 0
102-
// CHECK-DXIL-NEXT: store target("dx.TypedBuffer", float, 1, 0, 0) %4, ptr %__handle, align 4
61+
// CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(
62+
// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
63+
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer", ptr %{{.*}}, i32 0, i32 0
64+
// CHECK-DXIL-NEXT: store target("dx.TypedBuffer", float, 1, 0, 0) %[[HANDLE]], ptr %__handle, align 4
10365
// CHECK-NEXT: ret void
10466

10567
// Buf3 initialization part 3 - body of RWBuffer<int> default C2 constructor that initializes handle to poison
10668
// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this)
107-
// CHECK-NEXT: entry:
108-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
109-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
110-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
111-
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer.1", ptr %this1, i32 0, i32 0
69+
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer.1", ptr %{{.*}}, i32 0, i32 0
11270
// CHECK-NEXT: store target("dx.TypedBuffer", i32, 1, 0, 1) poison, ptr %__handle, align 4
113-
// CHECK-NEXT: ret void
11471

11572
// Module initialization
11673
// CHECK: define internal void @_GLOBAL__sub_I_RWBuffer_constructor.hlsl()

clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl

Lines changed: 8 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,8 @@ export void foo() {
3636
// that calls the C2 constructor
3737
// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this,
3838
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index)
39-
// CHECK-NEXT: entry:
40-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
41-
// CHECK-NEXT: %registerNo.addr = alloca i32, align 4
42-
// CHECK-NEXT: %spaceNo.addr = alloca i32, align 4
43-
// CHECK-NEXT: %range.addr = alloca i32, align 4
44-
// CHECK-NEXT: %index.addr = alloca i32, align 4
45-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
46-
// CHECK-NEXT: store i32 %registerNo, ptr %registerNo.addr, align 4
47-
// CHECK-NEXT: store i32 %spaceNo, ptr %spaceNo.addr, align 4
48-
// CHECK-NEXT: store i32 %range, ptr %range.addr, align 4
49-
// CHECK-NEXT: store i32 %index, ptr %index.addr, align 4
50-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
51-
// CHECK-NEXT: %0 = load i32, ptr %registerNo.addr, align 4
52-
// CHECK-NEXT: %1 = load i32, ptr %spaceNo.addr, align 4
53-
// CHECK-NEXT: %2 = load i32, ptr %range.addr, align 4
54-
// CHECK-NEXT: %3 = load i32, ptr %index.addr, align 4
55-
// CHECK: call void @_ZN4hlsl16StructuredBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this1,
56-
// CHECK-SAME: i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3)
57-
// CHECK-NEXT: ret void
39+
// CHECK: call void @_ZN4hlsl16StructuredBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4)
40+
// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}})
5841

5942
// Buf2 initialization part 1 - FIXME: constructor with implicit binding does not exist yet;
6043
// the global init function currently calls the default RWStructuredBufer<double> C1 constructor
@@ -72,47 +55,23 @@ export void foo() {
7255
// Buf3 initialization part 2 - body of AppendStructuredBuffer<float> default C1 constructor that calls
7356
// the default C2 constructor
7457
// CHECK: define linkonce_odr void @_ZN4hlsl22AppendStructuredBufferIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) %this)
75-
// CHECK-NEXT: entry:
76-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
77-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
78-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
79-
// CHECK: call void @_ZN4hlsl22AppendStructuredBufferIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this1)
58+
// CHECK: call void @_ZN4hlsl22AppendStructuredBufferIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %{{.*}})
8059
// CHECK-NEXT: ret void
8160

8261
// Buf1 initialization part 3 - body of AppendStructuredBuffer<float> C2 constructor with explicit binding
8362
// that initializes handle with @llvm.dx.resource.handlefrombinding
8463
// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this,
8564
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index)
86-
// CHECK-NEXT: entry:
87-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
88-
// CHECK-NEXT: %registerNo.addr = alloca i32, align 4
89-
// CHECK-NEXT: %spaceNo.addr = alloca i32, align 4
90-
// CHECK-NEXT: %range.addr = alloca i32, align 4
91-
// CHECK-NEXT: %index.addr = alloca i32, align 4
92-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
93-
// CHECK-NEXT: store i32 %registerNo, ptr %registerNo.addr, align 4
94-
// CHECK-NEXT: store i32 %spaceNo, ptr %spaceNo.addr, align 4
95-
// CHECK-NEXT: store i32 %range, ptr %range.addr, align 4
96-
// CHECK-NEXT: store i32 %index, ptr %index.addr, align 4
97-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
98-
// CHECK-NEXT: %0 = load i32, ptr %registerNo.addr, align 4
99-
// CHECK-NEXT: %1 = load i32, ptr %spaceNo.addr, align 4
100-
// CHECK-NEXT: %2 = load i32, ptr %range.addr, align 4
101-
// CHECK-NEXT: %3 = load i32, ptr %index.addr, align 4
102-
// CHECK-DXIL-NEXT: %4 = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(
103-
// CHECK-DXIL-SAME: i32 %1, i32 %0, i32 %2, i32 %3, i1 false)
104-
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %this1, i32 0, i32 0
105-
// CHECK-DXIL-NEXT: store target("dx.RawBuffer", float, 0, 0) %4, ptr %__handle, align 4
65+
// CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(
66+
// CHECK-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
67+
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %{{.*}}, i32 0, i32 0
68+
// CHECK-DXIL-NEXT: store target("dx.RawBuffer", float, 0, 0) %[[HANDLE]], ptr %__handle, align 4
10669
// CHECK-NEXT: ret void
10770

10871
// Buf3 initialization part 3 - body of AppendStructuredBuffer<float> default C2 constructor that
10972
// initializes handle to poison
11073
// CHECK: define linkonce_odr void @_ZN4hlsl22AppendStructuredBufferIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this)
111-
// CHECK-NEXT: entry:
112-
// CHECK-NEXT: %this.addr = alloca ptr, align 4
113-
// CHECK-NEXT: store ptr %this, ptr %this.addr, align 4
114-
// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 4
115-
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::AppendStructuredBuffer", ptr %this1, i32 0, i32 0
74+
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::AppendStructuredBuffer", ptr %{{.*}}, i32 0, i32 0
11675
// CHECK: store target("dx.RawBuffer", float, 1, 0) poison, ptr %__handle, align 4
11776

11877
// Module initialization

0 commit comments

Comments
 (0)