|
3 | 3 |
|
4 | 4 | // NOTE: SPIRV codegen for resource types is not yet implemented |
5 | 5 |
|
6 | | -ByteAddressBuffer Buffer0: register(t0); |
7 | | -RWByteAddressBuffer Buffer1: register(u1, space2); |
8 | | -RasterizerOrderedByteAddressBuffer Buffer2: register(u3, space4); |
| 6 | +ByteAddressBuffer Buf1: register(t1, space2); |
| 7 | +RWByteAddressBuffer Buf2; |
9 | 8 |
|
10 | | -// CHECK: "class.hlsl::ByteAddressBuffer" = type { target("dx.RawBuffer", i8, 0, 0) } |
11 | | -// CHECK: "class.hlsl::RWByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 0) } |
12 | | -// CHECK: "class.hlsl::RasterizerOrderedByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 1) } |
| 9 | +export void foo() { |
| 10 | + RasterizerOrderedByteAddressBuffer Buf3; |
| 11 | +} |
13 | 12 |
|
14 | | -// CHECK: @_ZL7Buffer0 = internal global %"class.hlsl::ByteAddressBuffer" poison, align 4 |
15 | | -// CHECK: @_ZL7Buffer1 = internal global %"class.hlsl::RWByteAddressBuffer" poison, align 4 |
16 | | -// CHECK: @_ZL7Buffer2 = internal global %"class.hlsl::RasterizerOrderedByteAddressBuffer" poison, align 4 |
| 13 | +// CHECK: %"class.hlsl::ByteAddressBuffer" = type { target("dx.RawBuffer", i8, 0, 0) } |
| 14 | +// CHECK: %"class.hlsl::RWByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 0) } |
| 15 | +// CHECK: %"class.hlsl::RasterizerOrderedByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 1) } |
17 | 16 |
|
18 | | -// CHECK; define internal void @_init_resource_Buffer0() |
19 | | -// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false) |
20 | | -// CHECK-DXIL: store target("dx.RawBuffer", i8, 0, 0) [[H]], ptr @_ZL7Buffer0, align 4 |
| 17 | +// CHECK: @_ZL4Buf1 = internal global %"class.hlsl::ByteAddressBuffer" poison, align 4 |
| 18 | +// CHECK: @_ZL4Buf2 = internal global %"class.hlsl::RWByteAddressBuffer" poison, align 4 |
21 | 19 |
|
22 | | -// CHECK; define internal void @_init_resource_Buffer1() |
23 | | -// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", i8, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_1_0t(i32 2, i32 1, i32 1, i32 0, i1 false) |
24 | | -// CHECK-DXIL: store target("dx.RawBuffer", i8, 1, 0) [[H]], ptr @_ZL7Buffer1, align 4 |
| 20 | +// |
| 21 | +// Buf1 initialization part 1 - constructor that creates handle from binding |
| 22 | +// |
| 23 | +// CHECK: define internal void @__cxx_global_var_init() |
| 24 | +// CHECK-NEXT: entry: |
| 25 | +// CHECK-NEXT: call void @_ZN4hlsl17ByteAddressBufferC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf1, |
| 26 | +// CHECK-SAME: i32 noundef 2, i32 noundef 1, i32 noundef 1, i32 noundef 0) |
25 | 27 |
|
26 | | -// CHECK; define internal void @_init_resource_Buffer2() |
27 | | -// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", i8, 1, 1) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_1_1t(i32 4, i32 3, i32 1, i32 0, i1 false) |
28 | | -// CHECK-DXIL: store target("dx.RawBuffer", i8, 1, 1) [[H]], ptr @_ZL7Buffer2, align 4 |
| 28 | +// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this, |
| 29 | +// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %registerNo, i32 noundef %range, i32 noundef %index) |
| 30 | +// CHECK: call void @_ZN4hlsl17ByteAddressBufferC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this1, |
| 31 | +// CHECK-SAME: i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3) |
| 32 | + |
| 33 | +// |
| 34 | +// Buf2 initialization part 1 - default constructor that initializes handle to poison |
| 35 | +// |
| 36 | + |
| 37 | +// CHECK: define internal void @__cxx_global_var_init.1() |
| 38 | +// CHECK-NEXT: entry: |
| 39 | +// CHECK-NEXT: call void @_ZN4hlsl19RWByteAddressBufferC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf2) |
| 40 | + |
| 41 | +// CHECK: define linkonce_odr void @_ZN4hlsl19RWByteAddressBufferC1Ev(ptr noundef nonnull align 4 dereferenceable(4) %this) |
| 42 | +// CHECK: call void @_ZN4hlsl19RWByteAddressBufferC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this1) |
| 43 | + |
| 44 | +// |
| 45 | +// Buf3 initialization part 1 - local variable with default constructor that initializes handle to poison |
| 46 | +// |
| 47 | + |
| 48 | +// CHECK: define void @_Z3foov() #2 { |
| 49 | +// CHECK-NEXT: entry: |
| 50 | +// CHECK-NEXT: %Buf3 = alloca %"class.hlsl::RasterizerOrderedByteAddressBuffer", align 4 |
| 51 | +// CHECK-NEXT: call void @_ZN4hlsl34RasterizerOrderedByteAddressBufferC1Ev(ptr noundef nonnull align 4 dereferenceable(4) %Buf3) |
| 52 | + |
| 53 | +// CHECK: define linkonce_odr void @_ZN4hlsl34RasterizerOrderedByteAddressBufferC1Ev(ptr noundef nonnull align 4 dereferenceable(4) %this) |
| 54 | +// CHECK: call void @_ZN4hlsl34RasterizerOrderedByteAddressBufferC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this1) |
| 55 | + |
| 56 | +// |
| 57 | +// Buf1 initialization part 2 - body of constructor that creates handle from binding |
| 58 | +// |
| 59 | +// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this, |
| 60 | +// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %registerNo, i32 noundef %range, i32 noundef %index) |
| 61 | +// CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( |
| 62 | +// CHECK-SAME: i32 %0, i32 %1, i32 %2, i32 %3, i1 false) |
| 63 | +// CHECK: %[[HANDLE_PTR:.*]] = getelementptr inbounds nuw %"class.hlsl::ByteAddressBuffer", ptr %this1, i32 0, i32 0 |
| 64 | +// CHECK: store target("dx.RawBuffer", i8, 0, 0) %[[HANDLE]], ptr %[[HANDLE_PTR]], align 4 |
| 65 | + |
| 66 | +// |
| 67 | +// Buf2 initialization part 2 - body of default constructor that initializes handle to poison |
| 68 | +// |
| 69 | +// CHECK: define linkonce_odr void @_ZN4hlsl19RWByteAddressBufferC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this) |
| 70 | +// CHECK: %[[HANDLE_PTR:.*]] = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %this1, i32 0, i32 0 |
| 71 | +// CHECK: store i8 poison, ptr %[[HANDLE_PTR]], align 4 |
| 72 | + |
| 73 | +// |
| 74 | +// Buf3 initialization part 2 - body of default constructor that initializes handle to poison |
| 75 | +// |
| 76 | +// CHECK: define linkonce_odr void @_ZN4hlsl34RasterizerOrderedByteAddressBufferC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this) |
| 77 | +// CHECK: %[[HANDLE_PTR:.*]] = getelementptr inbounds nuw %"class.hlsl::RasterizerOrderedByteAddressBuffer", ptr %this1, i32 0, i32 0 |
| 78 | +// CHECK: store i8 poison, ptr %[[HANDLE_PTR]], align 4 |
| 79 | + |
| 80 | +// |
| 81 | +// Module initialization |
| 82 | +// |
29 | 83 |
|
30 | 84 | // CHECK: define internal void @_GLOBAL__sub_I_ByteAddressBuffers_constructors.hlsl() |
31 | | -// CHECK: entry: |
32 | | -// CHECK: call void @_init_resource__ZL7Buffer0() |
33 | | -// CHECK: call void @_init_resource__ZL7Buffer1() |
34 | | -// CHECK: call void @_init_resource__ZL7Buffer2() |
| 85 | +// CHECK-NEXT: entry: |
| 86 | +// CHECK-NEXT: call void @__cxx_global_var_init() |
| 87 | +// CHECK-NEXT: call void @__cxx_global_var_init.1() |
0 commit comments