1; RUN: opt -S -dxil-resource-access %s | FileCheck %s 2 3target triple = "dxil-pc-shadermodel6.6-compute" 4 5; CHECK-LABEL: define void @storef32_struct 6define void @storef32_struct(i32 %index, float %data) { 7 %buffer = call target("dx.RawBuffer", float, 1, 0, 0) 8 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) 9 10 ; CHECK-NOT: @llvm.dx.resource.getpointer 11 %ptr = call ptr @llvm.dx.resource.getpointer( 12 target("dx.RawBuffer", float, 1, 0, 0) %buffer, i32 %index) 13 14 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_f32_1_0_0t.f32(target("dx.RawBuffer", float, 1, 0, 0) %buffer, i32 %index, i32 0, float %data) 15 store float %data, ptr %ptr 16 17 ret void 18} 19 20; CHECK-LABEL: define void @storef32_byte 21define void @storef32_byte(i32 %offset, float %data) { 22 %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) 23 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) 24 25 ; CHECK-NOT: @llvm.dx.resource.getpointer 26 %ptr = call ptr @llvm.dx.resource.getpointer( 27 target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset) 28 29 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_i8_1_0_0t.f32(target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset, i32 0, float %data) 30 store float %data, ptr %ptr 31 32 ret void 33} 34 35; CHECK-LABEL: define void @storev4f32_struct 36define void @storev4f32_struct(i32 %index, <4 x float> %data) { 37 %buffer = call target("dx.RawBuffer", <4 x float>, 1, 0, 0) 38 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) 39 40 ; CHECK-NOT: @llvm.dx.resource.getpointer 41 %ptr = call ptr @llvm.dx.resource.getpointer( 42 target("dx.RawBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) 43 44 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_v4f32_1_0_0t.v4f32(target("dx.RawBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, i32 0, <4 x float> %data) 45 store <4 x float> %data, ptr %ptr 46 47 ret void 48} 49 50; CHECK-LABEL: define void @storev4f32_byte 51define void @storev4f32_byte(i32 %offset, <4 x float> %data) { 52 %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) 53 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) 54 55 ; CHECK-NOT: @llvm.dx.resource.getpointer 56 %ptr = call ptr @llvm.dx.resource.getpointer( 57 target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset) 58 59 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_i8_1_0_0t.v4f32(target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset, i32 0, <4 x float> %data) 60 store <4 x float> %data, ptr %ptr 61 62 ret void 63} 64 65; CHECK-LABEL: define void @storeelements 66define void @storeelements(i32 %index, <4 x float> %dataf32, <4 x i32> %datai32) { 67 %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 1, 0, 0) 68 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) 69 70 ; CHECK-NOT: @llvm.dx.resource.getpointer 71 %ptr = call ptr @llvm.dx.resource.getpointer( 72 target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 1, 0, 0) %buffer, 73 i32 %index) 74 75 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_v4f32v4i32s_1_0_0t.v4f32(target("dx.RawBuffer", { <4 x float>, <4 x i32> }, 1, 0, 0) %buffer, i32 %index, i32 0, <4 x float> %dataf32) 76 store <4 x float> %dataf32, ptr %ptr 77 78 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_v4f32v4i32s_1_0_0t.v4i32(target("dx.RawBuffer", { <4 x float>, <4 x i32> }, 1, 0, 0) %buffer, i32 %index, i32 16, <4 x i32> %datai32) 79 %addri32 = getelementptr inbounds nuw i8, ptr %ptr, i32 16 80 store <4 x i32> %datai32, ptr %addri32 81 82 ret void 83} 84 85; CHECK-LABEL: define void @storenested 86define void @storenested(i32 %index, i32 %datai32, <4 x float> %dataf32, <3 x half> %dataf16) { 87 %buffer = call 88 target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 1, 0, 0) 89 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) 90 91 ; CHECK-NOT: @llvm.dx.resource.getpointer 92 %ptr = call ptr @llvm.dx.resource.getpointer( 93 target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 1, 0, 0) %buffer, 94 i32 %index) 95 96 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_1_0_0t.i32(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 1, 0, 0) %buffer, i32 %index, i32 0, i32 %datai32) 97 store i32 %datai32, ptr %ptr 98 99 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_1_0_0t.v4f32(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 1, 0, 0) %buffer, i32 %index, i32 4, <4 x float> %dataf32) 100 %addrf32 = getelementptr inbounds nuw i8, ptr %ptr, i32 4 101 store <4 x float> %dataf32, ptr %addrf32 102 103 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_1_0_0t.v3f16(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 1, 0, 0) %buffer, i32 %index, i32 20, <3 x half> %dataf16) 104 %addrf16 = getelementptr inbounds nuw i8, ptr %ptr, i32 20 105 store <3 x half> %dataf16, ptr %addrf16 106 107 ret void 108} 109 110; byteaddressbuf.Store<int64_t4> 111; CHECK-LABEL: define void @storev4f64_byte 112define void @storev4f64_byte(i32 %offset, <4 x double> %data) { 113 %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) 114 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) 115 116 ; CHECK-NOT: @llvm.dx.resource.getpointer 117 %ptr = call ptr @llvm.dx.resource.getpointer( 118 target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset) 119 120 ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_i8_1_0_0t.v4f64(target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset, i32 0, <4 x double> %data) 121 store <4 x double> %data, ptr %ptr 122 123 ret void 124} 125