From b255492acb8227126b481f4b50b370ad9ab5d62a Mon Sep 17 00:00:00 2001 From: Yonggang Luo Date: Sat, 16 Dec 2023 18:02:31 +0800 Subject: [PATCH] compiler/spirv: vtn_add_printf_string support for handling OpBitcast specifically, it's handling %48 = OpBitcast %_ptr_UniformConstant_uchar %_str %49 = OpBitcast %_ptr_UniformConstant_uchar %_str_1 ; SPIR-V ; Version: 1.4 ; Generator: Khronos SPIR-V Tools Linker; 0 ; Bound: 53 ; Schema: 0 OpCapability Addresses OpCapability Kernel OpCapability Int64 OpCapability Int8 %1 = OpExtInstImport "OpenCL.std" OpMemoryModel Physical64 OpenCL OpEntryPoint Kernel %2 "main_test" %_str %_str_1 %5 = OpString "kernel_arg_type.main_test.float*,uint*," %6 = OpString "kernel_arg_type_qual.main_test.,," OpSource OpenCL_C 102000 OpName %_str ".str" OpName %_str_1 ".str.1" OpName %main_test "main_test" OpName %src "src" OpName %dest "dest" OpName %entry "entry" OpName %src_addr "src.addr" OpName %dest_addr "dest.addr" OpName %arrayidx "arrayidx" OpName %call "call" OpName %src_0 "src" OpName %dest_0 "dest" OpModuleProcessed "Linked by SPIR-V Tools Linker" OpDecorate %_str Constant OpDecorate %_str Alignment 1 OpDecorate %_str_1 Constant OpDecorate %_str_1 Alignment 1 OpDecorate %src Alignment 4 OpDecorate %dest Alignment 4 OpDecorate %src_addr Alignment 8 OpDecorate %dest_addr Alignment 8 OpDecorate %src_0 Alignment 4 OpDecorate %dest_0 Alignment 4 %ulong = OpTypeInt 64 0 %uchar = OpTypeInt 8 0 %uint = OpTypeInt 32 0 %ulong_7 = OpConstant %ulong 7 %uchar_37 = OpConstant %uchar 37 %uchar_115 = OpConstant %uchar 115 %uchar_58 = OpConstant %uchar 58 %uchar_32 = OpConstant %uchar 32 %uchar_102 = OpConstant %uchar 102 %uchar_0 = OpConstant %uchar 0 %ulong_5 = OpConstant %ulong 5 %uchar_84 = OpConstant %uchar 84 %uchar_101 = OpConstant %uchar 101 %uchar_116 = OpConstant %uchar 116 %ulong_0 = OpConstant %ulong 0 %_arr_uchar_ulong_7 = OpTypeArray %uchar %ulong_7 %_ptr_UniformConstant__arr_uchar_ulong_7 = OpTypePointer UniformConstant %_arr_uchar_ulong_7 %_arr_uchar_ulong_5 = OpTypeArray %uchar %ulong_5 %_ptr_UniformConstant__arr_uchar_ulong_5 = OpTypePointer UniformConstant %_arr_uchar_ulong_5 %void = OpTypeVoid %float = OpTypeFloat 32 %_ptr_CrossWorkgroup_float = OpTypePointer CrossWorkgroup %float %_ptr_CrossWorkgroup_uint = OpTypePointer CrossWorkgroup %uint %40 = OpTypeFunction %void %_ptr_CrossWorkgroup_float %_ptr_CrossWorkgroup_uint %_ptr_Function__ptr_CrossWorkgroup_float = OpTypePointer Function %_ptr_CrossWorkgroup_float %_ptr_Function__ptr_CrossWorkgroup_uint = OpTypePointer Function %_ptr_CrossWorkgroup_uint %_ptr_UniformConstant_uchar = OpTypePointer UniformConstant %uchar %44 = OpConstantComposite %_arr_uchar_ulong_7 %uchar_37 %uchar_115 %uchar_58 %uchar_32 %uchar_37 %uchar_102 %uchar_0 %_str = OpVariable %_ptr_UniformConstant__arr_uchar_ulong_7 UniformConstant %44 %45 = OpConstantComposite %_arr_uchar_ulong_5 %uchar_84 %uchar_101 %uchar_115 %uchar_116 %uchar_0 %_str_1 = OpVariable %_ptr_UniformConstant__arr_uchar_ulong_5 UniformConstant %45 %main_test = OpFunction %void DontInline %40 %src = OpFunctionParameter %_ptr_CrossWorkgroup_float %dest = OpFunctionParameter %_ptr_CrossWorkgroup_uint %entry = OpLabel %src_addr = OpVariable %_ptr_Function__ptr_CrossWorkgroup_float Function %dest_addr = OpVariable %_ptr_Function__ptr_CrossWorkgroup_uint Function OpStore %src_addr %src Aligned 8 OpStore %dest_addr %dest Aligned 8 %46 = OpLoad %_ptr_CrossWorkgroup_float %src_addr Aligned 8 %arrayidx = OpInBoundsPtrAccessChain %_ptr_CrossWorkgroup_float %46 %ulong_0 %47 = OpLoad %float %arrayidx Aligned 4 %48 = OpBitcast %_ptr_UniformConstant_uchar %_str %49 = OpBitcast %_ptr_UniformConstant_uchar %_str_1 %call = OpExtInst %uint %1 printf %48 %49 %47 %50 = OpLoad %_ptr_CrossWorkgroup_uint %dest_addr Aligned 8 OpStore %50 %call Aligned 4 OpReturn OpFunctionEnd %2 = OpFunction %void DontInline %40 %src_0 = OpFunctionParameter %_ptr_CrossWorkgroup_float %dest_0 = OpFunctionParameter %_ptr_CrossWorkgroup_uint %51 = OpLabel %52 = OpFunctionCall %void %main_test %src_0 %dest_0 OpReturn OpFunctionEnd Signed-off-by: Yonggang Luo Reviewed-by: Karol Herbst Reviewed-by: Faith Ekstrand Part-of: (cherry picked from commit 616c0cd06727e19039d88a405adb4987b0d84959) --- .pick_status.json | 2 +- src/compiler/spirv/vtn_opencl.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index debfb077158..bc90d6c0c84 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -43504,7 +43504,7 @@ "description": "compiler/spirv: vtn_add_printf_string support for handling OpBitcast", "nominated": false, "nomination_type": 3, - "resolution": 4, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/compiler/spirv/vtn_opencl.c b/src/compiler/spirv/vtn_opencl.c index 59ec75da885..5785057da1d 100644 --- a/src/compiler/spirv/vtn_opencl.c +++ b/src/compiler/spirv/vtn_opencl.c @@ -743,8 +743,15 @@ vtn_add_printf_string(struct vtn_builder *b, uint32_t id, u_printf_info *info) { nir_deref_instr *deref = vtn_nir_deref(b, id); - while (deref && deref->deref_type != nir_deref_type_var) - deref = nir_deref_instr_parent(deref); + while (deref->deref_type != nir_deref_type_var) { + nir_scalar parent = nir_scalar_resolved(deref->parent.ssa, 0); + if (parent.def->parent_instr->type != nir_instr_type_deref) { + deref = NULL; + break; + } + vtn_assert(parent.comp == 0); + deref = nir_instr_as_deref(parent.def->parent_instr); + } vtn_fail_if(deref == NULL || !nir_deref_mode_is(deref, nir_var_mem_constant), "Printf string argument must be a pointer to a constant variable");