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