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 Bognerdeclare void @f32_user(float) 6*2f39d138SJustin Bognerdeclare void @v4f32_user(<4 x float>) 7*2f39d138SJustin Bognerdeclare void @i32_user(i32) 8*2f39d138SJustin Bognerdeclare void @v4i32_user(<4 x i32>) 9*2f39d138SJustin Bognerdeclare void @v3f16_user(<3 x half>) 10*2f39d138SJustin Bognerdeclare void @v4f64_user(<4 x double>) 11*2f39d138SJustin Bogner 12*2f39d138SJustin Bogner; CHECK-LABEL: define void @loadf32_struct 13*2f39d138SJustin Bognerdefine void @loadf32_struct(i32 %index) { 14*2f39d138SJustin Bogner %buffer = call target("dx.RawBuffer", float, 0, 0, 0) 15*2f39d138SJustin Bogner @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0( 16*2f39d138SJustin Bogner i32 0, i32 0, i32 1, i32 0, i1 false) 17*2f39d138SJustin Bogner 18*2f39d138SJustin Bogner ; CHECK-NOT: @llvm.dx.resource.getpointer 19*2f39d138SJustin Bogner %ptr = call ptr @llvm.dx.resource.getpointer( 20*2f39d138SJustin Bogner target("dx.RawBuffer", float, 0, 0, 0) %buffer, i32 %index) 21*2f39d138SJustin Bogner 22*2f39d138SJustin Bogner ; CHECK: %[[LOAD:.*]] = call { float, i1 } @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_f32_0_0_0t(target("dx.RawBuffer", float, 0, 0, 0) %buffer, i32 %index, i32 0) 23*2f39d138SJustin Bogner ; CHECK: %[[VAL:.*]] = extractvalue { float, i1 } %[[LOAD]], 0 24*2f39d138SJustin Bogner ; CHECK: call void @f32_user(float %[[VAL]]) 25*2f39d138SJustin Bogner %data = load float, ptr %ptr 26*2f39d138SJustin Bogner call void @f32_user(float %data) 27*2f39d138SJustin Bogner 28*2f39d138SJustin Bogner ret void 29*2f39d138SJustin Bogner} 30*2f39d138SJustin Bogner 31*2f39d138SJustin Bogner; CHECK-LABEL: define void @loadf32_byte 32*2f39d138SJustin Bognerdefine void @loadf32_byte(i32 %offset) { 33*2f39d138SJustin Bogner %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) 34*2f39d138SJustin Bogner @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( 35*2f39d138SJustin Bogner i32 0, i32 0, i32 1, i32 0, i1 false) 36*2f39d138SJustin Bogner 37*2f39d138SJustin Bogner ; CHECK-NOT: @llvm.dx.resource.getpointer 38*2f39d138SJustin Bogner %ptr = call ptr @llvm.dx.resource.getpointer( 39*2f39d138SJustin Bogner target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset) 40*2f39d138SJustin Bogner 41*2f39d138SJustin Bogner ; CHECK: %[[LOAD:.*]] = call { float, i1 } @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_i8_0_0_0t(target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset, i32 0) 42*2f39d138SJustin Bogner ; CHECK: %[[VAL:.*]] = extractvalue { float, i1 } %[[LOAD]], 0 43*2f39d138SJustin Bogner ; CHECK: call void @f32_user(float %[[VAL]]) 44*2f39d138SJustin Bogner %data = load float, ptr %ptr 45*2f39d138SJustin Bogner call void @f32_user(float %data) 46*2f39d138SJustin Bogner 47*2f39d138SJustin Bogner ret void 48*2f39d138SJustin Bogner} 49*2f39d138SJustin Bogner 50*2f39d138SJustin Bogner; CHECK-LABEL: define void @loadv4f32_struct 51*2f39d138SJustin Bognerdefine void @loadv4f32_struct(i32 %index) { 52*2f39d138SJustin Bogner %buffer = call target("dx.RawBuffer", <4 x float>, 0, 0, 0) 53*2f39d138SJustin Bogner @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_0_0_0( 54*2f39d138SJustin Bogner i32 0, i32 0, i32 1, i32 0, i1 false) 55*2f39d138SJustin Bogner 56*2f39d138SJustin Bogner ; CHECK-NOT: @llvm.dx.resource.getpointer 57*2f39d138SJustin Bogner %ptr = call ptr @llvm.dx.resource.getpointer( 58*2f39d138SJustin Bogner target("dx.RawBuffer", <4 x float>, 0, 0, 0) %buffer, i32 %index) 59*2f39d138SJustin Bogner 60*2f39d138SJustin Bogner ; CHECK: %[[LOAD:.*]] = call { <4 x float>, i1 } @llvm.dx.resource.load.rawbuffer.v4f32.tdx.RawBuffer_v4f32_0_0_0t(target("dx.RawBuffer", <4 x float>, 0, 0, 0) %buffer, i32 %index, i32 0) 61*2f39d138SJustin Bogner ; CHECK: %[[VAL:.*]] = extractvalue { <4 x float>, i1 } %[[LOAD]], 0 62*2f39d138SJustin Bogner ; CHECK: call void @v4f32_user(<4 x float> %[[VAL]]) 63*2f39d138SJustin Bogner %data = load <4 x float>, ptr %ptr 64*2f39d138SJustin Bogner call void @v4f32_user(<4 x float> %data) 65*2f39d138SJustin Bogner 66*2f39d138SJustin Bogner ret void 67*2f39d138SJustin Bogner} 68*2f39d138SJustin Bogner 69*2f39d138SJustin Bogner; CHECK-LABEL: define void @loadv4f32_byte 70*2f39d138SJustin Bognerdefine void @loadv4f32_byte(i32 %offset) { 71*2f39d138SJustin Bogner %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) 72*2f39d138SJustin Bogner @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( 73*2f39d138SJustin Bogner i32 0, i32 0, i32 1, i32 0, i1 false) 74*2f39d138SJustin Bogner 75*2f39d138SJustin Bogner ; CHECK-NOT: @llvm.dx.resource.getpointer 76*2f39d138SJustin Bogner %ptr = call ptr @llvm.dx.resource.getpointer( 77*2f39d138SJustin Bogner target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset) 78*2f39d138SJustin Bogner 79*2f39d138SJustin Bogner ; CHECK: %[[LOAD:.*]] = call { <4 x float>, i1 } @llvm.dx.resource.load.rawbuffer.v4f32.tdx.RawBuffer_i8_0_0_0t(target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset, i32 0) 80*2f39d138SJustin Bogner ; CHECK: %[[VAL:.*]] = extractvalue { <4 x float>, i1 } %[[LOAD]], 0 81*2f39d138SJustin Bogner ; CHECK: call void @v4f32_user(<4 x float> %[[VAL]] 82*2f39d138SJustin Bogner %data = load <4 x float>, ptr %ptr 83*2f39d138SJustin Bogner call void @v4f32_user(<4 x float> %data) 84*2f39d138SJustin Bogner 85*2f39d138SJustin Bogner ret void 86*2f39d138SJustin Bogner} 87*2f39d138SJustin Bogner 88*2f39d138SJustin Bogner; CHECK-LABEL: define void @loadelements 89*2f39d138SJustin Bognerdefine void @loadelements(i32 %index) { 90*2f39d138SJustin Bogner %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0) 91*2f39d138SJustin Bogner @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0( 92*2f39d138SJustin Bogner i32 0, i32 0, i32 1, i32 0, i1 false) 93*2f39d138SJustin Bogner 94*2f39d138SJustin Bogner ; CHECK-NOT: @llvm.dx.resource.getpointer 95*2f39d138SJustin Bogner %ptr = call ptr @llvm.dx.resource.getpointer( 96*2f39d138SJustin Bogner target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0) %buffer, 97*2f39d138SJustin Bogner i32 %index) 98*2f39d138SJustin Bogner 99*2f39d138SJustin Bogner ; CHECK: %[[LOADF32:.*]] = call { <4 x float>, i1 } @llvm.dx.resource.load.rawbuffer.v4f32.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0t(target("dx.RawBuffer", { <4 x float>, <4 x i32> }, 0, 0, 0) %buffer, i32 %index, i32 0) 100*2f39d138SJustin Bogner ; CHECK: %[[VALF32:.*]] = extractvalue { <4 x float>, i1 } %[[LOADF32]], 0 101*2f39d138SJustin Bogner ; CHECK: call void @v4f32_user(<4 x float> %[[VALF32]] 102*2f39d138SJustin Bogner %dataf32 = load <4 x float>, ptr %ptr 103*2f39d138SJustin Bogner call void @v4f32_user(<4 x float> %dataf32) 104*2f39d138SJustin Bogner 105*2f39d138SJustin Bogner ; CHECK: %[[LOADI32:.*]] = call { <4 x i32>, i1 } @llvm.dx.resource.load.rawbuffer.v4i32.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0t(target("dx.RawBuffer", { <4 x float>, <4 x i32> }, 0, 0, 0) %buffer, i32 %index, i32 16) 106*2f39d138SJustin Bogner ; CHECK: %[[VALI32:.*]] = extractvalue { <4 x i32>, i1 } %[[LOADI32]], 0 107*2f39d138SJustin Bogner ; CHECK: call void @v4i32_user(<4 x i32> %[[VALI32]] 108*2f39d138SJustin Bogner %addri32 = getelementptr inbounds nuw i8, ptr %ptr, i32 16 109*2f39d138SJustin Bogner %datai32 = load <4 x i32>, ptr %addri32 110*2f39d138SJustin Bogner call void @v4i32_user(<4 x i32> %datai32) 111*2f39d138SJustin Bogner 112*2f39d138SJustin Bogner ret void 113*2f39d138SJustin Bogner} 114*2f39d138SJustin Bogner 115*2f39d138SJustin Bogner; CHECK-LABEL: define void @loadnested 116*2f39d138SJustin Bognerdefine void @loadnested(i32 %index) { 117*2f39d138SJustin Bogner %buffer = call 118*2f39d138SJustin Bogner target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) 119*2f39d138SJustin Bogner @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) 120*2f39d138SJustin Bogner 121*2f39d138SJustin Bogner ; CHECK-NOT: @llvm.dx.resource.getpointer 122*2f39d138SJustin Bogner %ptr = call ptr @llvm.dx.resource.getpointer( 123*2f39d138SJustin Bogner target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) %buffer, 124*2f39d138SJustin Bogner i32 %index) 125*2f39d138SJustin Bogner 126*2f39d138SJustin Bogner ; CHECK: %[[LOADI32:.*]] = call { i32, i1 } @llvm.dx.resource.load.rawbuffer.i32.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_0_0_0t(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 0, 0, 0) %buffer, i32 %index, i32 0) 127*2f39d138SJustin Bogner ; CHECK: %[[VALI32:.*]] = extractvalue { i32, i1 } %[[LOADI32]], 0 128*2f39d138SJustin Bogner ; CHECK: call void @i32_user(i32 %[[VALI32]]) 129*2f39d138SJustin Bogner %datai32 = load i32, ptr %ptr 130*2f39d138SJustin Bogner call void @i32_user(i32 %datai32) 131*2f39d138SJustin Bogner 132*2f39d138SJustin Bogner ; CHECK: %[[LOADF32:.*]] = call { <4 x float>, i1 } @llvm.dx.resource.load.rawbuffer.v4f32.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_0_0_0t(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 0, 0, 0) %buffer, i32 %index, i32 4) 133*2f39d138SJustin Bogner ; CHECK: %[[VALF32:.*]] = extractvalue { <4 x float>, i1 } %[[LOADF32]], 0 134*2f39d138SJustin Bogner ; CHECK: call void @v4f32_user(<4 x float> %[[VALF32]]) 135*2f39d138SJustin Bogner %addrf32 = getelementptr inbounds nuw i8, ptr %ptr, i32 4 136*2f39d138SJustin Bogner %dataf32 = load <4 x float>, ptr %addrf32 137*2f39d138SJustin Bogner call void @v4f32_user(<4 x float> %dataf32) 138*2f39d138SJustin Bogner 139*2f39d138SJustin Bogner ; CHECK: %[[LOADF16:.*]] = call { <3 x half>, i1 } @llvm.dx.resource.load.rawbuffer.v3f16.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_0_0_0t(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 0, 0, 0) %buffer, i32 %index, i32 20) 140*2f39d138SJustin Bogner ; CHECK: %[[VALF16:.*]] = extractvalue { <3 x half>, i1 } %[[LOADF16]], 0 141*2f39d138SJustin Bogner ; CHECK: call void @v3f16_user(<3 x half> %[[VALF16]]) 142*2f39d138SJustin Bogner %addrf16 = getelementptr inbounds nuw i8, ptr %ptr, i32 20 143*2f39d138SJustin Bogner %dataf16 = load <3 x half>, ptr %addrf16 144*2f39d138SJustin Bogner call void @v3f16_user(<3 x half> %dataf16) 145*2f39d138SJustin Bogner 146*2f39d138SJustin Bogner ret void 147*2f39d138SJustin Bogner} 148*2f39d138SJustin Bogner 149*2f39d138SJustin Bogner; byteaddressbuf.Load<int64_t4> 150*2f39d138SJustin Bogner; CHECK-LABEL: define void @loadv4f64_byte 151*2f39d138SJustin Bognerdefine void @loadv4f64_byte(i32 %offset) { 152*2f39d138SJustin Bogner %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) 153*2f39d138SJustin Bogner @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( 154*2f39d138SJustin Bogner i32 0, i32 0, i32 1, i32 0, i1 false) 155*2f39d138SJustin Bogner 156*2f39d138SJustin Bogner ; CHECK-NOT: @llvm.dx.resource.getpointer 157*2f39d138SJustin Bogner %ptr = call ptr @llvm.dx.resource.getpointer( 158*2f39d138SJustin Bogner target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset) 159*2f39d138SJustin Bogner 160*2f39d138SJustin Bogner ; CHECK: %[[LOAD:.*]] = call { <4 x double>, i1 } @llvm.dx.resource.load.rawbuffer.v4f64.tdx.RawBuffer_i8_0_0_0t(target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset, i32 0) 161*2f39d138SJustin Bogner ; CHECK: %[[VAL:.*]] = extractvalue { <4 x double>, i1 } %[[LOAD]], 0 162*2f39d138SJustin Bogner ; CHECK: call void @v4f64_user(<4 x double> %[[VAL]]) 163*2f39d138SJustin Bogner %data = load <4 x double>, ptr %ptr 164*2f39d138SJustin Bogner call void @v4f64_user(<4 x double> %data) 165*2f39d138SJustin Bogner 166*2f39d138SJustin Bogner ret void 167*2f39d138SJustin Bogner} 168