125 lines · plain
1; RUN: opt -S -dxil-resource-access %s | FileCheck %s2 3target triple = "dxil-pc-shadermodel6.6-compute"4 5; CHECK-LABEL: define void @storef32_struct6define 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, ptr null)9 10 ; CHECK-NOT: @llvm.dx.resource.getpointer11 %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 %ptr16 17 ret void18}19 20; CHECK-LABEL: define void @storef32_byte21define 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, ptr null)24 25 ; CHECK-NOT: @llvm.dx.resource.getpointer26 %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 %ptr31 32 ret void33}34 35; CHECK-LABEL: define void @storev4f32_struct36define 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, ptr null)39 40 ; CHECK-NOT: @llvm.dx.resource.getpointer41 %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 %ptr46 47 ret void48}49 50; CHECK-LABEL: define void @storev4f32_byte51define 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, ptr null)54 55 ; CHECK-NOT: @llvm.dx.resource.getpointer56 %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 %ptr61 62 ret void63}64 65; CHECK-LABEL: define void @storeelements66define 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, ptr null)69 70 ; CHECK-NOT: @llvm.dx.resource.getpointer71 %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 %ptr77 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 1680 store <4 x i32> %datai32, ptr %addri3281 82 ret void83}84 85; CHECK-LABEL: define void @storenested86define void @storenested(i32 %index, i32 %datai32, <4 x float> %dataf32, <3 x half> %dataf16) {87 %buffer = call88 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, ptr null)90 91 ; CHECK-NOT: @llvm.dx.resource.getpointer92 %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 %ptr98 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 4101 store <4 x float> %dataf32, ptr %addrf32102 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 20105 store <3 x half> %dataf16, ptr %addrf16106 107 ret void108}109 110; byteaddressbuf.Store<int64_t4>111; CHECK-LABEL: define void @storev4f64_byte112define 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, ptr null)115 116 ; CHECK-NOT: @llvm.dx.resource.getpointer117 %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 %ptr122 123 ret void124}125