233 lines · plain
1; RUN: opt -S -dxil-op-lower %s | FileCheck %s2 3target triple = "dxil-pc-shadermodel6.6-compute"4 5declare void @f32_user(float)6declare void @v4f32_user(<4 x float>)7declare void @i32_user(i32)8declare void @v4i32_user(<4 x i32>)9declare void @v3f16_user(<3 x half>)10declare void @v4f64_user(<4 x double>)11 12; CHECK-LABEL: define void @loadf32_struct13define void @loadf32_struct(i32 %index) {14 %buffer = call target("dx.RawBuffer", float, 0, 0, 0)15 @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0(16 i32 0, i32 0, i32 1, i32 0, ptr null)17 18 ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 1, i32 4)19 %load = call {float, i1}20 @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_f32_0_0_0t(21 target("dx.RawBuffer", float, 0, 0, 0) %buffer,22 i32 %index,23 i32 0)24 %data = extractvalue {float, i1} %load, 025 26 ; CHECK: [[VAL:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA]], 027 ; CHECK: call void @f32_user(float [[VAL]])28 call void @f32_user(float %data)29 30 ret void31}32 33; CHECK-LABEL: define void @loadf32_byte34define void @loadf32_byte(i32 %offset) {35 %buffer = call target("dx.RawBuffer", i8, 0, 0, 0)36 @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0(37 i32 0, i32 0, i32 1, i32 0, ptr null)38 39 ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 1, i32 4)40 %load = call {float, i1}41 @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_i8_0_0_0t(42 target("dx.RawBuffer", i8, 0, 0, 0) %buffer,43 i32 %offset,44 i32 0)45 %data = extractvalue {float, i1} %load, 046 47 ; CHECK: [[VAL:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA]], 048 ; CHECK: call void @f32_user(float [[VAL]])49 call void @f32_user(float %data)50 51 ret void52}53 54; CHECK-LABEL: define void @loadv4f32_struct55define void @loadv4f32_struct(i32 %index) {56 %buffer = call target("dx.RawBuffer", <4 x float>, 0, 0, 0)57 @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_0_0_0(58 i32 0, i32 0, i32 1, i32 0, ptr null)59 60 ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 15, i32 4)61 %load = call {<4 x float>, i1}62 @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_v4f32_0_0_0t(63 target("dx.RawBuffer", <4 x float>, 0, 0, 0) %buffer,64 i32 %index,65 i32 0)66 %data = extractvalue {<4 x float>, i1} %load, 067 68 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 069 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 170 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 271 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 372 ; CHECK: insertelement <4 x float> poison73 ; CHECK: insertelement <4 x float>74 ; CHECK: insertelement <4 x float>75 ; CHECK: insertelement <4 x float>76 ; CHECK: call void @v4f32_user(<4 x float>77 call void @v4f32_user(<4 x float> %data)78 79 ret void80}81 82; CHECK-LABEL: define void @loadv4f32_byte83define void @loadv4f32_byte(i32 %offset) {84 %buffer = call target("dx.RawBuffer", i8, 0, 0, 0)85 @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0(86 i32 0, i32 0, i32 1, i32 0, ptr null)87 88 ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 15, i32 4)89 %load = call {<4 x float>, i1}90 @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_i8_0_0_0t(91 target("dx.RawBuffer", i8, 0, 0, 0) %buffer,92 i32 %offset,93 i32 0)94 %data = extractvalue {<4 x float>, i1} %load, 095 96 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 097 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 198 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 299 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 3100 ; CHECK: insertelement <4 x float> poison101 ; CHECK: insertelement <4 x float>102 ; CHECK: insertelement <4 x float>103 ; CHECK: insertelement <4 x float>104 ; CHECK: call void @v4f32_user(<4 x float>105 call void @v4f32_user(<4 x float> %data)106 107 ret void108}109 110; CHECK-LABEL: define void @loadelements111define void @loadelements(i32 %index) {112 %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0)113 @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0(114 i32 0, i32 0, i32 1, i32 0, ptr null)115 116 ; CHECK: [[DATAF32:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 15, i32 4)117 %loadf32 = call {<4 x float>, i1}118 @llvm.dx.resource.load.rawbuffer.v4f32(119 target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0) %buffer,120 i32 %index,121 i32 0)122 %dataf32 = extractvalue {<4 x float>, i1} %loadf32, 0123 124 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 0125 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 1126 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 2127 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 3128 ; CHECK: insertelement <4 x float> poison129 ; CHECK: insertelement <4 x float>130 ; CHECK: insertelement <4 x float>131 ; CHECK: insertelement <4 x float>132 ; CHECK: call void @v4f32_user(<4 x float>133 call void @v4f32_user(<4 x float> %dataf32)134 135 ; CHECK: [[DATAI32:%.*]] = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 1, i8 15, i32 4)136 %loadi32 = call {<4 x i32>, i1}137 @llvm.dx.resource.load.rawbuffer.v4i32(138 target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0) %buffer,139 i32 %index,140 i32 1)141 %datai32 = extractvalue {<4 x i32>, i1} %loadi32, 0142 143 ; CHECK: extractvalue %dx.types.ResRet.i32 [[DATAI32]], 0144 ; CHECK: extractvalue %dx.types.ResRet.i32 [[DATAI32]], 1145 ; CHECK: extractvalue %dx.types.ResRet.i32 [[DATAI32]], 2146 ; CHECK: extractvalue %dx.types.ResRet.i32 [[DATAI32]], 3147 ; CHECK: insertelement <4 x i32> poison148 ; CHECK: insertelement <4 x i32>149 ; CHECK: insertelement <4 x i32>150 ; CHECK: insertelement <4 x i32>151 ; CHECK: call void @v4i32_user(<4 x i32>152 call void @v4i32_user(<4 x i32> %datai32)153 154 ret void155}156 157; CHECK-LABEL: define void @loadnested158define void @loadnested(i32 %index) {159 %buffer = call160 target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0)161 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, ptr null)162 163 ; CHECK: [[DATAI32:%.*]] = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 1, i32 4)164 %loadi32 = call {i32, i1} @llvm.dx.resource.load.rawbuffer.i32(165 target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) %buffer,166 i32 %index, i32 0)167 %datai32 = extractvalue {i32, i1} %loadi32, 0168 169 ; CHECK: [[VALI32:%.*]] = extractvalue %dx.types.ResRet.i32 [[DATAI32]], 0170 ; CHECK: call void @i32_user(i32 [[VALI32]])171 call void @i32_user(i32 %datai32)172 173 ; CHECK: [[DATAF32:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 4, i8 15, i32 4)174 %loadf32 = call {<4 x float>, i1} @llvm.dx.resource.load.rawbuffer.v4f32(175 target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) %buffer,176 i32 %index, i32 4)177 %dataf32 = extractvalue {<4 x float>, i1} %loadf32, 0178 179 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 0180 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 1181 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 2182 ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 3183 ; CHECK: insertelement <4 x float> poison184 ; CHECK: insertelement <4 x float>185 ; CHECK: insertelement <4 x float>186 ; CHECK: insertelement <4 x float>187 ; CHECK: call void @v4f32_user(<4 x float>188 call void @v4f32_user(<4 x float> %dataf32)189 190 ; CHECK: [[DATAF16:%.*]] = call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 20, i8 7, i32 2)191 %loadf16 = call {<3 x half>, i1} @llvm.dx.resource.load.rawbuffer.v3f16(192 target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) %buffer,193 i32 %index, i32 20)194 %dataf16 = extractvalue {<3 x half>, i1} %loadf16, 0195 196 ; CHECK: extractvalue %dx.types.ResRet.f16 [[DATAF16]], 0197 ; CHECK: extractvalue %dx.types.ResRet.f16 [[DATAF16]], 1198 ; CHECK: extractvalue %dx.types.ResRet.f16 [[DATAF16]], 2199 ; CHECK: insertelement <3 x half> poison200 ; CHECK: insertelement <3 x half>201 ; CHECK: insertelement <3 x half>202 ; CHECK: call void @v3f16_user(<3 x half>203 call void @v3f16_user(<3 x half> %dataf16)204 205 ret void206}207 208; byteaddressbuf.Load<int64_t4>209; CHECK-LABEL: define void @loadv4f64_byte210define void @loadv4f64_byte(i32 %offset) {211 %buffer = call target("dx.RawBuffer", i8, 0, 0, 0)212 @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0(213 i32 0, i32 0, i32 1, i32 0, ptr null)214 215 ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f64 @dx.op.rawBufferLoad.f64(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 15, i32 8)216 %load = call {<4 x double>, i1} @llvm.dx.resource.load.rawbuffer.v4i64(217 target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset, i32 0)218 %data = extractvalue {<4 x double>, i1} %load, 0219 220 ; CHECK: extractvalue %dx.types.ResRet.f64 [[DATA]], 0221 ; CHECK: extractvalue %dx.types.ResRet.f64 [[DATA]], 1222 ; CHECK: extractvalue %dx.types.ResRet.f64 [[DATA]], 2223 ; CHECK: extractvalue %dx.types.ResRet.f64 [[DATA]], 3224 ; CHECK: insertelement <4 x double> poison225 ; CHECK: insertelement <4 x double>226 ; CHECK: insertelement <4 x double>227 ; CHECK: insertelement <4 x double>228 ; CHECK: call void @v4f64_user(<4 x double>229 call void @v4f64_user(<4 x double> %data)230 231 ret void232}233