brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.6 KiB · 3726032 Raw
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