From ba4c9fe53464ca29ee3501ca46cc9a9cd693bbe2 Mon Sep 17 00:00:00 2001 From: Jeremy Gebben Date: Mon, 16 Jan 2023 13:57:37 -0700 Subject: [PATCH] Instrument: Fix bindless checking for BufferDeviceAddress (#5049) Avoid using OpConstantNull with types that do not allow it. Update existing tests for slight changes in code generation. Add new tests based on the Vulkan Validation layer test case that exposed this problem. --- source/opt/inst_bindless_check_pass.cpp | 30 +- source/opt/inst_buff_addr_check_pass.cpp | 9 +- test/opt/inst_bindless_check_test.cpp | 595 +++++++++++++---------- test/opt/inst_buff_addr_check_test.cpp | 128 +++++ 4 files changed, 478 insertions(+), 284 deletions(-) diff --git a/source/opt/inst_bindless_check_pass.cpp b/source/opt/inst_bindless_check_pass.cpp index ca36dd606..ad581e14c 100644 --- a/source/opt/inst_bindless_check_pass.cpp +++ b/source/opt/inst_bindless_check_pass.cpp @@ -536,6 +536,8 @@ void InstBindlessCheckPass::GenCheckCode( new BasicBlock(std::move(valid_label))); builder.SetInsertPoint(&*new_blk_ptr); uint32_t new_ref_id = CloneOriginalReference(ref, &builder); + uint32_t null_id = 0; + uint32_t ref_type_id = ref->ref_inst->type_id(); (void)builder.AddBranch(merge_blk_id); new_blocks->push_back(std::move(new_blk_ptr)); // Gen invalid block @@ -563,10 +565,23 @@ void InstBindlessCheckPass::GenCheckCode( GenDebugStreamWrite(uid2offset_[ref->ref_inst->unique_id()], stage_idx, {error_id, u_index_id, u_length_id}, &builder); } + // Generate a ConstantNull, converting to uint64 if the type cannot be a null. + if (new_ref_id != 0) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::Type* ref_type = type_mgr->GetType(ref_type_id); + if (ref_type->AsPointer() != nullptr) { + context()->AddCapability(spv::Capability::Int64); + uint32_t null_u64_id = GetNullId(GetUint64Id()); + Instruction* null_ptr_inst = builder.AddUnaryOp( + ref_type_id, spv::Op::OpConvertUToPtr, null_u64_id); + null_id = null_ptr_inst->result_id(); + } else { + null_id = GetNullId(ref_type_id); + } + } // Remember last invalid block id uint32_t last_invalid_blk_id = new_blk_ptr->GetLabelInst()->result_id(); // Gen zero for invalid reference - uint32_t ref_type_id = ref->ref_inst->type_id(); (void)builder.AddBranch(merge_blk_id); new_blocks->push_back(std::move(new_blk_ptr)); // Gen merge block @@ -577,8 +592,7 @@ void InstBindlessCheckPass::GenCheckCode( // reference. if (new_ref_id != 0) { Instruction* phi_inst = builder.AddPhi( - ref_type_id, {new_ref_id, valid_blk_id, GetNullId(ref_type_id), - last_invalid_blk_id}); + ref_type_id, {new_ref_id, valid_blk_id, null_id, last_invalid_blk_id}); context()->ReplaceAllUsesWith(ref->ref_inst->result_id(), phi_inst->result_id()); } @@ -734,15 +748,7 @@ void InstBindlessCheckPass::GenTexBuffCheckCode( if (image_ty_inst->GetSingleWordInOperand(kSpvTypeImageArrayed) != 0) return; if (image_ty_inst->GetSingleWordInOperand(kSpvTypeImageMS) != 0) return; // Enable ImageQuery Capability if not yet enabled - if (!get_feature_mgr()->HasCapability(spv::Capability::ImageQuery)) { - std::unique_ptr cap_image_query_inst( - new Instruction(context(), spv::Op::OpCapability, 0, 0, - std::initializer_list{ - {SPV_OPERAND_TYPE_CAPABILITY, - {uint32_t(spv::Capability::ImageQuery)}}})); - get_def_use_mgr()->AnalyzeInstDefUse(&*cap_image_query_inst); - context()->AddCapability(std::move(cap_image_query_inst)); - } + context()->AddCapability(spv::Capability::ImageQuery); // Move original block's preceding instructions into first new block std::unique_ptr new_blk_ptr; MovePreludeCode(ref_inst_itr, ref_block_itr, &new_blk_ptr); diff --git a/source/opt/inst_buff_addr_check_pass.cpp b/source/opt/inst_buff_addr_check_pass.cpp index be361e69b..97d25f3c9 100644 --- a/source/opt/inst_buff_addr_check_pass.cpp +++ b/source/opt/inst_buff_addr_check_pass.cpp @@ -408,14 +408,7 @@ uint32_t InstBuffAddrCheckPass::GenSearchAndTest(Instruction* ref_inst, InstructionBuilder* builder, uint32_t* ref_uptr_id) { // Enable Int64 if necessary - if (!get_feature_mgr()->HasCapability(spv::Capability::Int64)) { - std::unique_ptr cap_int64_inst(new Instruction( - context(), spv::Op::OpCapability, 0, 0, - std::initializer_list{{SPV_OPERAND_TYPE_CAPABILITY, - {uint32_t(spv::Capability::Int64)}}})); - get_def_use_mgr()->AnalyzeInstDefUse(&*cap_int64_inst); - context()->AddCapability(std::move(cap_int64_inst)); - } + context()->AddCapability(spv::Capability::Int64); // Convert reference pointer to uint64 uint32_t ref_ptr_id = ref_inst->GetSingleWordInOperand(0); Instruction* ref_uptr_inst = diff --git a/test/opt/inst_bindless_check_test.cpp b/test/opt/inst_bindless_check_test.cpp index 4f4b6681c..3600d0d22 100644 --- a/test/opt/inst_bindless_check_test.cpp +++ b/test/opt/inst_bindless_check_test.cpp @@ -159,9 +159,9 @@ static const std::string kStreamWrite4Ray = kStreamWrite4Begin + R"( ; CHECK: {{%\w+}} = OpAccessChain %_ptr_StorageBuffer_uint [[output_buffer_var]] %uint_2 {{%\w+}} ; CHECK: OpStore {{%\w+}} {{%\w+}} ; CHECK: {{%\w+}} = OpLoad %v3uint {{%\w+}} -; CHECK: {{%\w+}} = OpCompositeExtract %uint %90 0 -; CHECK: {{%\w+}} = OpCompositeExtract %uint %90 1 -; CHECK: {{%\w+}} = OpCompositeExtract %uint %90 2 +; CHECK: {{%\w+}} = OpCompositeExtract %uint {{%\w+}} 0 +; CHECK: {{%\w+}} = OpCompositeExtract %uint {{%\w+}} 1 +; CHECK: {{%\w+}} = OpCompositeExtract %uint {{%\w+}} 2 ; CHECK: {{%\w+}} = OpIAdd %uint {{%\w+}} %uint_4 ; CHECK: {{%\w+}} = OpAccessChain %_ptr_StorageBuffer_uint [[output_buffer_var]] %uint_2 {{%\w+}} ; CHECK: OpStore {{%\w+}} {{%\w+}} @@ -567,14 +567,12 @@ OpDecorate %_entryPointOutput_vColor Location 0 %_ptr_Output_v4float = OpTypePointer Output %v4float %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output ; CHECK: %bool = OpTypeBool -; CHECK: %48 = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input -; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %103 = OpConstantNull %v4float +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -601,10 +599,10 @@ OpStore %_entryPointOutput_vColor %37 ; CHECK: %46 = OpImageSampleImplicitLod %v4float %45 %30 ; CHECK: OpBranch %41 ; CHECK: %43 = OpLabel -; CHECK: %102 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_56 %uint_0 %32 %uint_128 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_56 %uint_0 %32 %uint_128 ; CHECK: OpBranch %41 ; CHECK: %41 = OpLabel -; CHECK: %104 = OpPhi %v4float %46 %42 %103 %43 +; CHECK: %104 = OpPhi %v4float %46 %42 [[null_v4float]] %43 ; CHECK: OpStore %_entryPointOutput_vColor %104 OpReturn OpFunctionEnd @@ -706,14 +704,14 @@ OpDecorate %_entryPointOutput_vColor Location 0 %_ptr_Output_v4float = OpTypePointer Output %v4float %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output ; CHECK: %bool = OpTypeBool -; CHECK: %56 = OpTypeFunction %void %uint %uint %uint %uint +; CHECK: {{%\w+}} = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %111 = OpConstantNull %v4float +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -738,10 +736,10 @@ OpDecorate %_entryPointOutput_vColor Location 0 ; CHECK: %54 = OpImageSampleImplicitLod %v4float %53 %31 ; CHECK: OpBranch %49 ; CHECK: %51 = OpLabel -; CHECK: %110 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_58 %uint_0 %33 %uint_128 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_58 %uint_0 %33 %uint_128 ; CHECK: OpBranch %49 ; CHECK: %49 = OpLabel -; CHECK: %112 = OpPhi %v4float %54 %50 %111 %51 +; CHECK: %112 = OpPhi %v4float %54 %50 [[null_v4float]] %51 %39 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 %40 = OpLoad %uint %39 %41 = OpAccessChain %_ptr_UniformConstant_17 %g_tColor %40 @@ -763,7 +761,7 @@ OpDecorate %_entryPointOutput_vColor Location 0 ; CHECK: %121 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_64 %uint_0 %40 %uint_128 ; CHECK: OpBranch %114 ; CHECK: %114 = OpLabel -; CHECK: %122 = OpPhi %v4float %119 %115 %111 %116 +; CHECK: %122 = OpPhi %v4float %119 %115 [[null_v4float]] %116 ; CHECK: %45 = OpFAdd %v4float %112 %122 OpStore %_entryPointOutput_vColor %45 OpReturn @@ -835,14 +833,13 @@ OpDecorate %_entryPointOutput_vColor Location 0 %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output ; CHECK: uint_0 = OpConstant %uint 0 ; CHECK: bool = OpTypeBool -; CHECK: %86 = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %141 = OpConstantNull %v4float +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -868,10 +865,10 @@ OpStore %_entryPointOutput_vColor %71 ; CHECK: %84 = OpImageRead %v4float %83 %53 ; CHECK: OpBranch %79 ; CHECK: %81 = OpLabel -; CHECK: %140 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %64 %uint_128 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %64 %uint_128 ; CHECK: OpBranch %79 ; CHECK: %79 = OpLabel -; CHECK: %142 = OpPhi %v4float %84 %80 %141 %81 +; CHECK: %142 = OpPhi %v4float %84 %80 [[null_v4float]] %81 ; CHECK: OpStore %_entryPointOutput_vColor %142 OpReturn OpFunctionEnd @@ -940,14 +937,13 @@ OpDecorate %_entryPointOutput_vColor Location 0 %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output ; CHECK: uint_0 = OpConstant %uint 0 ; CHECK: bool = OpTypeBool -; CHECK: %81 = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %136 = OpConstantNull %v4float +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -971,10 +967,10 @@ OpStore %_entryPointOutput_vColor %71 ; CHECK: %79 = OpImageSampleImplicitLod %v4float %78 %53 ; CHECK: OpBranch %75 ; CHECK: %77 = OpLabel -; CHECK: %135 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_49 %uint_0 %64 %uint_128 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_49 %uint_0 %64 %uint_128 ; CHECK: OpBranch %75 ; CHECK: %75 = OpLabel -; CHECK: %137 = OpPhi %v4float %79 %76 %136 %77 +; CHECK: %137 = OpPhi %v4float %79 %76 [[null_v4float]] %77 ; CHECK: OpStore %_entryPointOutput_vColor %137 OpReturn OpFunctionEnd @@ -1167,14 +1163,13 @@ OpDecorate %coords2D Location 0 %_ptr_Input_v2float = OpTypePointer Input %v2float %coords2D = OpVariable %_ptr_Input_v2float Input ; CHECK: %bool = OpTypeBool -; CHECK: %54 = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %_ptr_Input_uint = OpTypePointer Input %uint ; CHECK: %gl_VertexIndex = OpVariable %_ptr_Input_uint Input ; CHECK: %gl_InstanceIndex = OpVariable %_ptr_Input_uint Input -; CHECK: %106 = OpConstantNull %v4float +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -1205,11 +1200,11 @@ OpStore %40 %38 ; CHECK: %51 = OpImageSampleExplicitLod %v4float %50 %40 Lod %41 ; CHECK: OpBranch %47 ; CHECK: %49 = OpLabel -; CHECK: %52 = OpBitcast %uint %37 -; CHECK: %105 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_74 %uint_0 %52 %uint_128 +; CHECK: [[bitcast_result:%\w+]] = OpBitcast %uint %37 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_74 %uint_0 [[bitcast_result]] %uint_128 ; CHECK: OpBranch %47 ; CHECK: %47 = OpLabel -; CHECK: %107 = OpPhi %v4float %51 %48 %106 %49 +; CHECK: %107 = OpPhi %v4float %51 %48 [[null_v4float]] %49 ; CHECK: %43 = OpAccessChain %_ptr_Output_v4float %_ %int_0 ; CHECK: OpStore %43 %107 OpReturn @@ -1309,7 +1304,6 @@ OpDecorate %uniform_index_buffer Binding 0 %_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float %_ptr_Output_v4float = OpTypePointer Output %v4float ; CHECK: %bool = OpTypeBool -; CHECK: %40 = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint @@ -1319,7 +1313,7 @@ OpDecorate %uniform_index_buffer Binding 0 ; CHECK: %_ptr_Input_v3float = OpTypePointer Input %v3float ; CHECK: %gl_TessCoord = OpVariable %_ptr_Input_v3float Input ; CHECK: %v3uint = OpTypeVector %uint 3 -; CHECK: %101 = OpConstantNull %v4float +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -1338,10 +1332,10 @@ OpDecorate %uniform_index_buffer Binding 0 ; CHECK: %38 = OpLoad %v4float %29 ; CHECK: OpBranch %35 ; CHECK: %37 = OpLabel -; CHECK: %100 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_63 %uint_0 %28 %uint_11 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_63 %uint_0 %28 %uint_11 ; CHECK: OpBranch %35 ; CHECK: %35 = OpLabel -; CHECK: %102 = OpPhi %v4float %38 %36 %101 %37 +; CHECK: %102 = OpPhi %v4float %38 %36 [[null_v4float]] %37 %31 = OpAccessChain %_ptr_Output_v4float %_ %int_0 OpStore %31 %29 ; CHECK-NOT: OpStore %31 %29 @@ -1435,14 +1429,13 @@ OpDecorate %_entryPointOutput_vColor Location 0 %_ptr_Output_v4float = OpTypePointer Output %v4float %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output ; CHECK: %bool = OpTypeBool -; CHECK: %70 = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %125 = OpConstantNull %v4float +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -1492,13 +1485,16 @@ OpLine %1 24 0 ; CHECK: OpNoLine ; CHECK: OpBranch %63 ; CHECK: %65 = OpLabel -; CHECK: %124 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_109 %uint_0 %50 %uint_128 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_109 %uint_0 %50 %uint_128 ; CHECK: OpBranch %63 ; CHECK: %63 = OpLabel -; CHECK: %126 = OpPhi %v4float %68 %64 %125 %65 +; CHECK: [[phi_result:%\w+]] = OpPhi %v4float %68 %64 [[null_v4float]] %65 ; CHECK: OpLine %5 24 0 %47 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 OpStore %47 %45 +; CHECK-NOT: OpStore %47 %45 +; CHECK: [[store_loc:%\w+]] = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 +; CHECK: OpStore [[store_loc]] [[phi_result]] OpLine %1 25 0 %48 = OpLoad %PS_OUTPUT %ps_output OpReturnValue %48 @@ -1580,13 +1576,11 @@ OpDecorate %_entryPointOutput_vColor Location 0 )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %65 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %116 = OpConstantNull %v4float -; CHECK: %119 = OpTypeFunction %uint %uint %uint %uint %uint +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -1624,14 +1618,14 @@ OpStore %_entryPointOutput_vColor %71 ; CHECK: %144 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_59 %uint_1 %32 %uint_0 ; CHECK: OpBranch %138 ; CHECK: %138 = OpLabel -; CHECK: %145 = OpPhi %v4float %143 %139 %116 %140 +; CHECK: [[phi_result_1:%\w+]] = OpPhi %v4float %143 %139 [[null_v4float]] %140 ; CHECK: OpBranch %58 ; CHECK: %60 = OpLabel -; CHECK: %115 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_59 %uint_0 %32 %55 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_59 %uint_0 %32 %55 ; CHECK: OpBranch %58 ; CHECK: %58 = OpLabel -; CHECK: %117 = OpPhi %v4float %145 %138 %116 %60 -; CHECK: OpStore %_entryPointOutput_vColor %117 +; CHECK: [[phi_result_2:%\w+]] = OpPhi %v4float [[phi_result_1]] %138 [[null_v4float]] %60 +; CHECK: OpStore %_entryPointOutput_vColor [[phi_result_2]] OpReturn OpFunctionEnd )"; @@ -1698,12 +1692,11 @@ OpDecorate %_entryPointOutput_vColor Location 0 )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %61 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %113 = OpConstantNull %v4float +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )"; // clang-format on @@ -1728,11 +1721,11 @@ OpStore %_entryPointOutput_vColor %24 ; CHECK: %59 = OpImageSampleImplicitLod %v4float %58 %20 ; CHECK: OpBranch %54 ; CHECK: %56 = OpLabel -; CHECK: %112 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_39 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_39 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %54 ; CHECK: %54 = OpLabel -; CHECK: %114 = OpPhi %v4float %59 %55 %113 %56 -; CHECK: OpStore %_entryPointOutput_vColor %114 +; CHECK: [[phi_result:%\w+]] = OpPhi %v4float %59 %55 [[null_v4float]] %56 +; CHECK: OpStore %_entryPointOutput_vColor [[phi_result]] OpReturn OpFunctionEnd )"; @@ -1932,14 +1925,12 @@ OpDecorate %20 NonUniform )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %49 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( ; CHECK: %v4float = OpTypeVector %float 4 ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %101 = OpConstantNull %float -; CHECK: %105 = OpTypeFunction %uint %uint %uint %uint %uint +; CHECK: [[null_float:%\w+]] = OpConstantNull %float )"; // clang-format on @@ -1970,15 +1961,15 @@ OpStore %b %20 ; CHECK: %129 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_1 %128 %uint_0 ; CHECK: OpBranch %124 ; CHECK: %124 = OpLabel -; CHECK: %130 = OpPhi %float %127 %125 %101 %126 +; CHECK: [[phi_result_1:%\w+]] = OpPhi %float %127 %125 [[null_float]] %126 ; CHECK: OpBranch %43 ; CHECK: %45 = OpLabel -; CHECK: %47 = OpBitcast %uint %7 -; CHECK: %100 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_0 %47 %40 +; CHECK: [[bitcast_result:%\w+]] = OpBitcast %uint %7 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_0 [[bitcast_result]] %40 ; CHECK: OpBranch %43 ; CHECK: %43 = OpLabel -; CHECK: %102 = OpPhi %float %130 %124 %101 %45 -; CHECK: OpStore %b %102 +; CHECK: [[phi_result_2:%\w+]] = OpPhi %float [[phi_result_1]] %124 [[null_float]] %45 +; CHECK: OpStore %b [[phi_result_2]] OpReturn OpFunctionEnd )"; @@ -2062,14 +2053,12 @@ OpDecorate %20 NonUniform )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %49 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( ; CHECK: %v4float = OpTypeVector %float 4 ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %101 = OpConstantNull %float -; CHECK: %105 = OpTypeFunction %uint %uint %uint %uint %uint +; CHECK: [[null_float:%\w+]] = OpConstantNull %float )"; // clang-format on @@ -2087,8 +2076,8 @@ OpStore %b %20 ; CHECK: OpSelectionMerge %43 None ; CHECK: OpBranchConditional %42 %44 %45 ; CHECK: %44 = OpLabel -; CHECK: %103 = OpBitcast %uint %7 -; CHECK: %122 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_3 %103 +; CHECK: [[bitcast_result_1:%\w+]] = OpBitcast %uint %7 +; CHECK: %122 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_3 [[bitcast_result_1]] ; CHECK: %123 = OpULessThan %bool %uint_0 %122 ; CHECK: OpSelectionMerge %124 None ; CHECK: OpBranchConditional %123 %125 %126 @@ -2100,15 +2089,15 @@ OpStore %b %20 ; CHECK: %129 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_1 %128 %uint_0 ; CHECK: OpBranch %124 ; CHECK: %124 = OpLabel -; CHECK: %130 = OpPhi %float %127 %125 %101 %126 +; CHECK: [[phi_result_1:%\w+]] = OpPhi %float %127 %125 [[null_float]] %126 ; CHECK: OpBranch %43 ; CHECK: %45 = OpLabel -; CHECK: %47 = OpBitcast %uint %7 -; CHECK: %100 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_0 %47 %40 +; CHECK: [[bitcast_result_2:%\w+]] = OpBitcast %uint %7 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_0 [[bitcast_result_2]] %40 ; CHECK: OpBranch %43 ; CHECK: %43 = OpLabel -; CHECK: %102 = OpPhi %float %130 %124 %101 %45 -; CHECK: OpStore %b %102 +; CHECK: [[phi_result_2:%\w+]] = OpPhi %float [[phi_result_1]] %124 [[null_float]] %45 +; CHECK: OpStore %b [[phi_result_2]] OpReturn OpFunctionEnd )"; @@ -2181,14 +2170,12 @@ OpDecorate %20 NonUniform )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %49 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( ; CHECK: %v4float = OpTypeVector %float 4 ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %101 = OpConstantNull %float -; CHECK: %105 = OpTypeFunction %uint %uint %uint %uint %uint +; CHECK: [[null_float:%\w+]] = OpConstantNull %float )"; // clang-format on @@ -2219,15 +2206,15 @@ OpStore %b %20 ; CHECK: %129 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_1 %128 %uint_0 ; CHECK: OpBranch %124 ; CHECK: %124 = OpLabel -; CHECK: %130 = OpPhi %float %127 %125 %101 %126 +; CHECK: [[phi_result_1:%\w+]] = OpPhi %float %127 %125 [[null_float]] %126 ; CHECK: OpBranch %43 ; CHECK: %45 = OpLabel -; CHECK: %47 = OpBitcast %uint %7 -; CHECK: %100 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_0 %47 %40 +; CHECK: [[bitcast_result:%\w+]] = OpBitcast %uint %7 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_45 %uint_0 [[bitcast_result]] %40 ; CHECK: OpBranch %43 ; CHECK: %43 = OpLabel -; CHECK: %102 = OpPhi %float %130 %124 %101 %45 -; CHECK: OpStore %b %102 +; CHECK: [[phi_result_2:%\w+]] = OpPhi %float [[phi_result_1]] %124 [[null_float]] %45 +; CHECK: OpStore %b [[phi_result_2]] OpReturn OpFunctionEnd )"; @@ -2296,13 +2283,12 @@ OpDecorate %uniformBuffer Binding 3 )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %52 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( ; CHECK: %v4float = OpTypeVector %float 4 ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %104 = OpConstantNull %float +; CHECK: [[null_float:%\w+]] = OpConstantNull %float )"; // clang-format on @@ -2322,11 +2308,11 @@ OpStore %b %16 ; CHECK: %50 = OpLoad %float %15 ; CHECK: OpBranch %47 ; CHECK: %49 = OpLabel -; CHECK: %103 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_32 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_32 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %47 ; CHECK: %47 = OpLabel -; CHECK: %105 = OpPhi %float %50 %48 %104 %49 -; CHECK: OpStore %b %105 +; CHECK: [[phi_result:%\w+]] = OpPhi %float %50 %48 [[null_float]] %49 +; CHECK: OpStore %b [[phi_result]] OpReturn OpFunctionEnd )"; @@ -2523,7 +2509,6 @@ OpDecorate %22 NonUniform %int_0 = OpConstant %int 0 %_ptr_Uniform_float = OpTypePointer Uniform %float ; CHECK: %bool = OpTypeBool -; CHECK: %32 = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint @@ -2531,8 +2516,7 @@ OpDecorate %22 NonUniform ; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input ; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %88 = OpConstantNull %float -; CHECK: %92 = OpTypeFunction %uint %uint %uint %uint %uint +; CHECK: [[null_float:%\w+]] = OpConstantNull %float )" + kInputGlobals; // clang-format on @@ -2562,15 +2546,15 @@ OpStore %b %22 ; CHECK: %119 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_46 %uint_1 %118 %uint_0 ; CHECK: OpBranch %114 ; CHECK: %114 = OpLabel -; CHECK: %120 = OpPhi %float %117 %115 %88 %116 +; CHECK: [[phi_result_1:%\w+]] = OpPhi %float %117 %115 [[null_float]] %116 ; CHECK: OpBranch %26 ; CHECK: %28 = OpLabel -; CHECK: %30 = OpBitcast %uint %7 -; CHECK: %87 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_46 %uint_0 %30 %uint_128 +; CHECK: [[bitcast_result:%\w+]] = OpBitcast %uint %7 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_46 %uint_0 [[bitcast_result]] %uint_128 ; CHECK: OpBranch %26 ; CHECK: %26 = OpLabel -; CHECK: %89 = OpPhi %float %120 %114 %88 %28 -; CHECK: OpStore %b %89 +; CHECK: [[phi_result_2:%\w+]] = OpPhi %float [[phi_result_1]] %114 [[null_float]] %28 +; CHECK: OpStore %b [[phi_result_2]] OpReturn OpFunctionEnd )"; @@ -2653,19 +2637,16 @@ OpDecorate %images NonWritable %v4float = OpTypeVector %float 4 %uint_0 = OpConstant %uint 0 %_ptr_Uniform_float = OpTypePointer Uniform %float -; CHECK: %34 = OpTypeFunction %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %57 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( ; CHECK: %v3uint = OpTypeVector %uint 3 ; CHECK: %_ptr_Input_v3uint = OpTypePointer Input %v3uint ; CHECK: %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input -; CHECK: %112 = OpConstantNull %v4float -; CHECK: %115 = OpTypeFunction %uint %uint %uint %uint %uint -; CHECK: %140 = OpConstantNull %uint +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float +; CHECK: [[null_uint:%\w+]] = OpConstantNull %uint )"; // clang-format on @@ -2689,10 +2670,10 @@ OpStore %31 %29 ; CHECK: %137 = OpLoad %uint %25 ; CHECK: OpBranch %134 ; CHECK: %136 = OpLabel -; CHECK: %139 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_47 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_47 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %134 ; CHECK: %134 = OpLabel -; CHECK: %141 = OpPhi %uint %137 %135 %140 %136 +; CHECK: [[phi_result_1:%\w+]] = OpPhi %uint %137 %135 [[null_uint]] %136 ; CHECK: %27 = OpAccessChain %_ptr_UniformConstant_13 %images %141 ; CHECK: %28 = OpLoad %13 %27 ; CHECK: %48 = OpFunctionCall %uint %inst_bindless_direct_read_2 %uint_1 %uint_1 @@ -2701,7 +2682,7 @@ OpStore %31 %29 ; CHECK: OpBranchConditional %50 %52 %53 ; CHECK: %52 = OpLabel ; CHECK: %54 = OpLoad %13 %27 -; CHECK: %142 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_1 %141 +; CHECK: {{%\w+}} = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_1 [[phi_result_1]] ; CHECK: %143 = OpULessThan %bool %uint_0 %142 ; CHECK: OpSelectionMerge %144 None ; CHECK: OpBranchConditional %143 %145 %146 @@ -2713,13 +2694,13 @@ OpStore %31 %29 ; CHECK: %149 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_50 %uint_1 %141 %uint_0 ; CHECK: OpBranch %144 ; CHECK: %144 = OpLabel -; CHECK: %150 = OpPhi %v4float %148 %145 %112 %146 +; CHECK: [[phi_result_2:%\w+]] = OpPhi %v4float %148 %145 [[null_v4float]] %146 ; CHECK: OpBranch %51 ; CHECK: %53 = OpLabel -; CHECK: %111 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_50 %uint_0 %141 %48 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_50 %uint_0 %141 %48 ; CHECK: OpBranch %51 ; CHECK: %51 = OpLabel -; CHECK: %113 = OpPhi %v4float %150 %144 %112 %53 +; CHECK: %113 = OpPhi %v4float [[phi_result_2]] %144 [[null_v4float]] %53 ; CHECK: %30 = OpCompositeExtract %float %113 0 ; CHECK: %31 = OpAccessChain %_ptr_Uniform_float %sbo %int_1 ; CHECK: %151 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_0 %uint_0 @@ -2774,7 +2755,7 @@ OpExtension "SPV_NV_ray_tracing" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint RayGenerationNV %main "main" -; CHECK: OpEntryPoint RayGenerationNV %main "main" %89 +; CHECK: OpEntryPoint RayGenerationNV %main "main" [[launch_id:%\w+]] OpSource GLSL 460 OpSourceExtension "GL_EXT_nonuniform_qualifier" OpSourceExtension "GL_NV_ray_tracing" @@ -2794,7 +2775,7 @@ OpDecorate %images Binding 1 OpDecorate %images NonWritable ; CHECK: OpDecorate %_runtimearr_uint ArrayStride 4 )" + kInputDecorations + kOutputDecorations + R"( -; CHECK: OpDecorate %89 BuiltIn LaunchIdNV +; CHECK: OpDecorate [[launch_id]] BuiltIn LaunchIdNV %void = OpTypeVoid %3 = OpTypeFunction %void %uint = OpTypeInt 32 0 @@ -2821,14 +2802,9 @@ OpDecorate %images NonWritable )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %57 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( -; CHECK: %v3uint = OpTypeVector %uint 3 -; CHECK: %_ptr_Input_v3uint = OpTypePointer Input %v3uint -; CHECK: %89 = OpVariable %_ptr_Input_v3uint Input -; CHECK: %113 = OpConstantNull %v4float -; CHECK: %116 = OpTypeFunction %uint %uint %uint %uint %uint -; CHECK: %141 = OpConstantNull %uint +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float +; CHECK: [[null_uint:%\w+]] = OpConstantNull %uint )"; // clang-format on @@ -2852,10 +2828,10 @@ OpStore %31 %29 ; CHECK: %138 = OpLoad %uint %25 ; CHECK: OpBranch %135 ; CHECK: %137 = OpLabel -; CHECK: %140 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %135 ; CHECK: %135 = OpLabel -; CHECK: %142 = OpPhi %uint %138 %136 %141 %137 +; CHECK: %142 = OpPhi %uint %138 %136 [[null_uint]] %137 ; CHECK: %27 = OpAccessChain %_ptr_UniformConstant_13 %images %142 ; CHECK: %28 = OpLoad %13 %27 ; CHECK: %48 = OpFunctionCall %uint %inst_bindless_direct_read_2 %uint_1 %uint_1 @@ -2876,13 +2852,13 @@ OpStore %31 %29 ; CHECK: %150 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_1 %142 %uint_0 ; CHECK: OpBranch %145 ; CHECK: %145 = OpLabel -; CHECK: %151 = OpPhi %v4float %149 %146 %113 %147 +; CHECK: %151 = OpPhi %v4float %149 %146 [[null_v4float]] %147 ; CHECK: OpBranch %51 ; CHECK: %53 = OpLabel -; CHECK: %112 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 ; CHECK: OpBranch %51 ; CHECK: %51 = OpLabel -; CHECK: %114 = OpPhi %v4float %151 %145 %113 %53 +; CHECK: %114 = OpPhi %v4float %151 %145 [[null_v4float]] %53 ; CHECK: %30 = OpCompositeExtract %float %114 0 ; CHECK: %31 = OpAccessChain %_ptr_Uniform_float %sbo %int_1 ; CHECK: %152 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_0 %uint_0 @@ -2936,7 +2912,7 @@ OpExtension "SPV_NV_ray_tracing" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint IntersectionNV %main "main" -; CHECK: OpEntryPoint IntersectionNV %main "main" %89 +; CHECK: OpEntryPoint IntersectionNV %main "main" [[launch_id:%\w+]] OpSource GLSL 460 OpSourceExtension "GL_EXT_nonuniform_qualifier" OpSourceExtension "GL_NV_ray_tracing" @@ -2956,7 +2932,7 @@ OpDecorate %images Binding 1 OpDecorate %images NonWritable ; CHECK: OpDecorate %_runtimearr_uint ArrayStride 4 )" + kInputDecorations + kOutputDecorations + R"( -; CHECK: OpDecorate %89 BuiltIn LaunchIdNV +; CHECK: OpDecorate [[launch_id]] BuiltIn LaunchIdNV %void = OpTypeVoid %3 = OpTypeFunction %void %uint = OpTypeInt 32 0 @@ -2984,12 +2960,9 @@ OpDecorate %images NonWritable ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool )" + kOutputGlobals + R"( -; CHECK: %v3uint = OpTypeVector %uint 3 -; CHECK: %_ptr_Input_v3uint = OpTypePointer Input %v3uint -; CHECK: %89 = OpVariable %_ptr_Input_v3uint Input -; CHECK: %113 = OpConstantNull %v4float -; CHECK: %116 = OpTypeFunction %uint %uint %uint %uint %uint -; CHECK: %141 = OpConstantNull %uint +; CHECK: [[launch_id]] = OpVariable %_ptr_Input_v3uint Input +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float +; CHECK: [[null_uint:%\w+]] = OpConstantNull %uint )"; // clang-format on @@ -3013,10 +2986,10 @@ OpStore %31 %29 ; CHECK: %138 = OpLoad %uint %25 ; CHECK: OpBranch %135 ; CHECK: %137 = OpLabel -; CHECK: %140 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %135 ; CHECK: %135 = OpLabel -; CHECK: %142 = OpPhi %uint %138 %136 %141 %137 +; CHECK: %142 = OpPhi %uint %138 %136 [[null_uint]] %137 ; CHECK: %27 = OpAccessChain %_ptr_UniformConstant_13 %images %142 ; CHECK: %28 = OpLoad %13 %27 ; CHECK: %48 = OpFunctionCall %uint %inst_bindless_direct_read_2 %uint_1 %uint_1 @@ -3037,13 +3010,13 @@ OpStore %31 %29 ; CHECK: %150 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_1 %142 %uint_0 ; CHECK: OpBranch %145 ; CHECK: %145 = OpLabel -; CHECK: %151 = OpPhi %v4float %149 %146 %113 %147 +; CHECK: %151 = OpPhi %v4float %149 %146 [[null_v4float]] %147 ; CHECK: OpBranch %51 ; CHECK: %53 = OpLabel -; CHECK: %112 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 ; CHECK: OpBranch %51 ; CHECK: %51 = OpLabel -; CHECK: %114 = OpPhi %v4float %151 %145 %113 %53 +; CHECK: %114 = OpPhi %v4float %151 %145 [[null_v4float]] %53 ; CHECK: %30 = OpCompositeExtract %float %114 0 ; CHECK: %31 = OpAccessChain %_ptr_Uniform_float %sbo %int_1 ; CHECK: %152 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_0 %uint_0 @@ -3097,7 +3070,7 @@ OpExtension "SPV_NV_ray_tracing" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint AnyHitNV %main "main" -; CHECK: OpEntryPoint AnyHitNV %main "main" %89 +; CHECK: OpEntryPoint AnyHitNV %main "main" [[launch_id:%\w+]] OpSource GLSL 460 OpSourceExtension "GL_EXT_nonuniform_qualifier" OpSourceExtension "GL_NV_ray_tracing" @@ -3117,7 +3090,7 @@ OpDecorate %images Binding 1 OpDecorate %images NonWritable ; CHECK: OpDecorate %_runtimearr_uint ArrayStride 4 )" + kInputDecorations + kOutputDecorations + R"( -; CHECK: OpDecorate %89 BuiltIn LaunchIdNV +; CHECK: OpDecorate [[launch_id]] BuiltIn LaunchIdNV %void = OpTypeVoid %3 = OpTypeFunction %void %uint = OpTypeInt 32 0 @@ -3144,14 +3117,10 @@ OpDecorate %images NonWritable )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %57 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( -; CHECK: %v3uint = OpTypeVector %uint 3 -; CHECK: %_ptr_Input_v3uint = OpTypePointer Input %v3uint -; CHECK: %89 = OpVariable %_ptr_Input_v3uint Input -; CHECK: %113 = OpConstantNull %v4float -; CHECK: %116 = OpTypeFunction %uint %uint %uint %uint %uint -; CHECK: %141 = OpConstantNull %uint +; CHECK: [[launch_id]] = OpVariable %_ptr_Input_v3uint Input +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float +; CHECK: [[null_uint:%\w+]] = OpConstantNull %uint )"; // clang-format on @@ -3175,10 +3144,10 @@ OpStore %31 %29 ; CHECK: %138 = OpLoad %uint %25 ; CHECK: OpBranch %135 ; CHECK: %137 = OpLabel -; CHECK: %140 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %135 ; CHECK: %135 = OpLabel -; CHECK: %142 = OpPhi %uint %138 %136 %141 %137 +; CHECK: %142 = OpPhi %uint %138 %136 [[null_uint]] %137 ; CHECK: %27 = OpAccessChain %_ptr_UniformConstant_13 %images %142 ; CHECK: %28 = OpLoad %13 %27 ; CHECK: %48 = OpFunctionCall %uint %inst_bindless_direct_read_2 %uint_1 %uint_1 @@ -3199,13 +3168,13 @@ OpStore %31 %29 ; CHECK: %150 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_1 %142 %uint_0 ; CHECK: OpBranch %145 ; CHECK: %145 = OpLabel -; CHECK: %151 = OpPhi %v4float %149 %146 %113 %147 +; CHECK: %151 = OpPhi %v4float %149 %146 [[null_v4float]] %147 ; CHECK: OpBranch %51 ; CHECK: %53 = OpLabel -; CHECK: %112 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 ; CHECK: OpBranch %51 ; CHECK: %51 = OpLabel -; CHECK: %114 = OpPhi %v4float %151 %145 %113 %53 +; CHECK: %114 = OpPhi %v4float %151 %145 [[null_v4float]] %53 ; CHECK: %30 = OpCompositeExtract %float %114 0 ; CHECK: %31 = OpAccessChain %_ptr_Uniform_float %sbo %int_1 ; CHECK: %152 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_0 %uint_0 @@ -3259,7 +3228,7 @@ OpExtension "SPV_NV_ray_tracing" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint ClosestHitNV %main "main" -; CHECK: OpEntryPoint ClosestHitNV %main "main" %89 +; CHECK: OpEntryPoint ClosestHitNV %main "main" [[launch_id:%\w+]] OpSource GLSL 460 OpSourceExtension "GL_EXT_nonuniform_qualifier" OpSourceExtension "GL_NV_ray_tracing" @@ -3279,7 +3248,7 @@ OpDecorate %images Binding 1 OpDecorate %images NonWritable ; CHECK: OpDecorate %_runtimearr_uint ArrayStride 4 )" + kInputDecorations + kOutputDecorations + R"( -; CHECK: OpDecorate %89 BuiltIn LaunchIdNV +; CHECK: OpDecorate [[launch_id]] BuiltIn LaunchIdNV %void = OpTypeVoid %3 = OpTypeFunction %void %uint = OpTypeInt 32 0 @@ -3306,14 +3275,10 @@ OpDecorate %images NonWritable )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %57 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( -; CHECK: %v3uint = OpTypeVector %uint 3 -; CHECK: %_ptr_Input_v3uint = OpTypePointer Input %v3uint -; CHECK: %89 = OpVariable %_ptr_Input_v3uint Input -; CHECK: %113 = OpConstantNull %v4float -; CHECK: %116 = OpTypeFunction %uint %uint %uint %uint %uint -; CHECK: %141 = OpConstantNull %uint +; CHECK: [[launch_id]] = OpVariable %_ptr_Input_v3uint Input +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float +; CHECK: [[null_uint:%\w+]] = OpConstantNull %uint )"; // clang-format on @@ -3337,10 +3302,10 @@ OpStore %31 %29 ; CHECK: %138 = OpLoad %uint %25 ; CHECK: OpBranch %135 ; CHECK: %137 = OpLabel -; CHECK: %140 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %135 ; CHECK: %135 = OpLabel -; CHECK: %142 = OpPhi %uint %138 %136 %141 %137 +; CHECK: %142 = OpPhi %uint %138 %136 [[null_uint]] %137 ; CHECK: %27 = OpAccessChain %_ptr_UniformConstant_13 %images %142 ; CHECK: %28 = OpLoad %13 %27 ; CHECK: %48 = OpFunctionCall %uint %inst_bindless_direct_read_2 %uint_1 %uint_1 @@ -3361,13 +3326,13 @@ OpStore %31 %29 ; CHECK: %150 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_1 %142 %uint_0 ; CHECK: OpBranch %145 ; CHECK: %145 = OpLabel -; CHECK: %151 = OpPhi %v4float %149 %146 %113 %147 +; CHECK: %151 = OpPhi %v4float %149 %146 [[null_v4float]] %147 ; CHECK: OpBranch %51 ; CHECK: %53 = OpLabel -; CHECK: %112 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 ; CHECK: OpBranch %51 ; CHECK: %51 = OpLabel -; CHECK: %114 = OpPhi %v4float %151 %145 %113 %53 +; CHECK: %114 = OpPhi %v4float %151 %145 [[null_v4float]] %53 ; CHECK: %30 = OpCompositeExtract %float %114 0 ; CHECK: %31 = OpAccessChain %_ptr_Uniform_float %sbo %int_1 ; CHECK: %152 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_0 %uint_0 @@ -3421,7 +3386,7 @@ OpExtension "SPV_NV_ray_tracing" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint MissNV %main "main" -; CHECK: OpEntryPoint MissNV %main "main" %89 +; CHECK: OpEntryPoint MissNV %main "main" [[launch_id:%\w+]] OpSource GLSL 460 OpSourceExtension "GL_EXT_nonuniform_qualifier" OpSourceExtension "GL_NV_ray_tracing" @@ -3441,7 +3406,7 @@ OpDecorate %images Binding 1 OpDecorate %images NonWritable ; CHECK: OpDecorate %_runtimearr_uint ArrayStride 4 )" + kInputDecorations + kOutputDecorations + R"( -; CHECK: OpDecorate %89 BuiltIn LaunchIdNV +; CHECK: OpDecorate [[launch_id]] BuiltIn LaunchIdNV %void = OpTypeVoid %3 = OpTypeFunction %void %uint = OpTypeInt 32 0 @@ -3468,14 +3433,10 @@ OpDecorate %images NonWritable )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %57 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( -; CHECK: %v3uint = OpTypeVector %uint 3 -; CHECK: %_ptr_Input_v3uint = OpTypePointer Input %v3uint -; CHECK: %89 = OpVariable %_ptr_Input_v3uint Input -; CHECK: %113 = OpConstantNull %v4float -; CHECK: %116 = OpTypeFunction %uint %uint %uint %uint %uint -; CHECK: %141 = OpConstantNull %uint +; CHECK: [[launch_id]] = OpVariable %_ptr_Input_v3uint Input +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float +; CHECK: [[null_uint:%\w+]] = OpConstantNull %uint )"; // clang-format on @@ -3499,10 +3460,10 @@ OpStore %31 %29 ; CHECK: %138 = OpLoad %uint %25 ; CHECK: OpBranch %135 ; CHECK: %137 = OpLabel -; CHECK: %140 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %135 ; CHECK: %135 = OpLabel -; CHECK: %142 = OpPhi %uint %138 %136 %141 %137 +; CHECK: %142 = OpPhi %uint %138 %136 [[null_uint]] %137 ; CHECK: %27 = OpAccessChain %_ptr_UniformConstant_13 %images %142 ; CHECK: %28 = OpLoad %13 %27 ; CHECK: %48 = OpFunctionCall %uint %inst_bindless_direct_read_2 %uint_1 %uint_1 @@ -3523,13 +3484,13 @@ OpStore %31 %29 ; CHECK: %150 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_1 %142 %uint_0 ; CHECK: OpBranch %145 ; CHECK: %145 = OpLabel -; CHECK: %151 = OpPhi %v4float %149 %146 %113 %147 +; CHECK: %151 = OpPhi %v4float %149 %146 [[null_v4float]] %147 ; CHECK: OpBranch %51 ; CHECK: %53 = OpLabel -; CHECK: %112 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 ; CHECK: OpBranch %51 ; CHECK: %51 = OpLabel -; CHECK: %114 = OpPhi %v4float %151 %145 %113 %53 +; CHECK: %114 = OpPhi %v4float %151 %145 [[null_v4float]] %53 ; CHECK: %30 = OpCompositeExtract %float %114 0 ; CHECK: %31 = OpAccessChain %_ptr_Uniform_float %sbo %int_1 ; CHECK: %152 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_0 %uint_0 @@ -3583,7 +3544,7 @@ OpExtension "SPV_NV_ray_tracing" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint CallableNV %main "main" -; CHECK: OpEntryPoint CallableNV %main "main" %89 +; CHECK: OpEntryPoint CallableNV %main "main" [[launch_id:%\w+]] OpSource GLSL 460 OpSourceExtension "GL_EXT_nonuniform_qualifier" OpSourceExtension "GL_NV_ray_tracing" @@ -3603,7 +3564,7 @@ OpDecorate %images Binding 1 OpDecorate %images NonWritable ; CHECK: OpDecorate %_runtimearr_uint ArrayStride 4 )" + kInputDecorations + kOutputDecorations + R"( -; CHECK: OpDecorate %89 BuiltIn LaunchIdNV +; CHECK: OpDecorate [[launch_id]] BuiltIn LaunchIdNV %void = OpTypeVoid %3 = OpTypeFunction %void %uint = OpTypeInt 32 0 @@ -3630,14 +3591,9 @@ OpDecorate %images NonWritable )" + kInputGlobals + R"( ; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ; CHECK: %bool = OpTypeBool -; CHECK: %57 = OpTypeFunction %void %uint %uint %uint %uint )" + kOutputGlobals + R"( -; CHECK: %v3uint = OpTypeVector %uint 3 -; CHECK: %_ptr_Input_v3uint = OpTypePointer Input %v3uint -; CHECK: %89 = OpVariable %_ptr_Input_v3uint Input -; CHECK: %113 = OpConstantNull %v4float -; CHECK: %116 = OpTypeFunction %uint %uint %uint %uint %uint -; CHECK: %141 = OpConstantNull %uint +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float +; CHECK: [[null_uint:%\w+]] = OpConstantNull %uint )"; // clang-format on @@ -3661,10 +3617,10 @@ OpStore %31 %29 ; CHECK: %138 = OpLoad %uint %25 ; CHECK: OpBranch %135 ; CHECK: %137 = OpLabel -; CHECK: %140 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_48 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %135 ; CHECK: %135 = OpLabel -; CHECK: %142 = OpPhi %uint %138 %136 %141 %137 +; CHECK: %142 = OpPhi %uint %138 %136 [[null_uint]] %137 ; CHECK: %27 = OpAccessChain %_ptr_UniformConstant_13 %images %142 ; CHECK: %28 = OpLoad %13 %27 ; CHECK: %48 = OpFunctionCall %uint %inst_bindless_direct_read_2 %uint_1 %uint_1 @@ -3685,13 +3641,13 @@ OpStore %31 %29 ; CHECK: %150 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_1 %142 %uint_0 ; CHECK: OpBranch %145 ; CHECK: %145 = OpLabel -; CHECK: %151 = OpPhi %v4float %149 %146 %113 %147 +; CHECK: %151 = OpPhi %v4float %149 %146 [[null_v4float]] %147 ; CHECK: OpBranch %51 ; CHECK: %53 = OpLabel -; CHECK: %112 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_51 %uint_0 %142 %48 ; CHECK: OpBranch %51 ; CHECK: %51 = OpLabel -; CHECK: %114 = OpPhi %v4float %151 %145 %113 %53 +; CHECK: %114 = OpPhi %v4float %151 %145 [[null_v4float]] %53 ; CHECK: %30 = OpCompositeExtract %float %114 0 ; CHECK: %31 = OpAccessChain %_ptr_Uniform_float %sbo %int_1 ; CHECK: %152 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_0 %uint_0 @@ -3822,17 +3778,11 @@ OpDecorate %outColor Location 0 %outColor = OpVariable %_ptr_Output_v4float Output %float_0 = OpConstant %float 0 ; CHECK: %bool = OpTypeBool -; CHECK: %68 = OpTypeFunction %void %uint %uint %uint %uint ; CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( -; CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint -; CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float -; CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input -; CHECK: %v4uint = OpTypeVector %uint 4 -; CHECK: %122 = OpConstantNull %v4float -; CHECK: %126 = OpTypeFunction %uint %uint %uint %uint %uint +; CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )" + kInputGlobals + R"( -; CHECK: %165 = OpConstantNull %v2float +; CHECK: [[null_v2float:%\w+]] = OpConstantNull %v2float )"; // clang-format on @@ -3870,10 +3820,10 @@ OpStore %x %36 ; CHECK: %162 = OpLoad %v2float %47 ; CHECK: OpBranch %159 ; CHECK: %161 = OpLabel -; CHECK: %164 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_87 %uint_1 %uint_0 %uint_0 +; CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_87 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %159 ; CHECK: %159 = OpLabel -; CHECK: %166 = OpPhi %v2float %162 %160 %165 %161 +; CHECK: %166 = OpPhi %v2float %162 %160 [[null_v2float]] %161 ; CHECK: %49 = OpFMul %v2float %42 %166 ; CHECK: %167 = OpSampledImage %27 %39 %40 ; CHECK: %168 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_2 %uint_0 @@ -3889,7 +3839,7 @@ OpStore %x %36 ; CHECK: %177 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_89 %uint_1 %uint_0 %uint_0 ; CHECK: OpBranch %170 ; CHECK: %170 = OpLabel -; CHECK: %178 = OpPhi %v4float %175 %171 %122 %172 +; CHECK: %178 = OpPhi %v4float %175 %171 [[null_v4float]] %172 ; CHECK: %51 = OpCompositeExtract %float %178 0 OpStore %y %51 %54 = OpLoad %float %x @@ -4017,12 +3967,11 @@ TEST_F(InstBindlessTest, MultipleUniformNonAggregateRefsNoDescInit) { ;CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kInputGlobals + R"( ;CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint - ;CHECK: %148 = OpTypeFunction %void %uint %uint %uint %uint %uint )" + kOutputGlobals + R"( ;CHECK:%_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK:%gl_FragCoord = OpVariable %_ptr_Input_v4float Input ;CHECK: %v4uint = OpTypeVector %uint 4 - ;CHECK: %202 = OpConstantNull %v2float + ;CHECK: [[null_v2float:%\w+]] = OpConstantNull %v2float %MainPs = OpFunction %void None %3 %5 = OpLabel ;CHECK: %140 = OpFunctionCall %uint %inst_bindless_direct_read_3 %uint_1 %uint_1 %uint_0 @@ -4048,10 +3997,10 @@ TEST_F(InstBindlessTest, MultipleUniformNonAggregateRefsNoDescInit) { ;CHECK: %146 = OpLoad %v2float %86 ;CHECK: OpBranch %143 ;CHECK: %145 = OpLabel - ;CHECK: %201 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_71 %uint_4 %uint_0 %119 %140 + ;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_71 %uint_4 %uint_0 %119 %140 ;CHECK: OpBranch %143 ;CHECK: %143 = OpLabel - ;CHECK: %203 = OpPhi %v2float %146 %144 %202 %145 + ;CHECK: %203 = OpPhi %v2float %146 %144 [[null_v2float]] %145 OpBranch %91 %88 = OpLabel %89 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_1 @@ -4068,7 +4017,7 @@ TEST_F(InstBindlessTest, MultipleUniformNonAggregateRefsNoDescInit) { ;CHECK: %211 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_75 %uint_4 %uint_0 %204 %140 ;CHECK: OpBranch %206 ;CHECK: %206 = OpLabel - ;CHECK: %212 = OpPhi %v2float %209 %207 %202 %208 + ;CHECK: %212 = OpPhi %v2float %209 %207 [[null_v2float]] %208 OpBranch %91 %91 = OpLabel %115 = OpPhi %v2float %87 %85 %90 %88 @@ -4210,12 +4159,11 @@ TEST_F(InstBindlessTest, UniformArrayRefNoDescInit) { )" + kInputGlobals + R"( ;CHECK:%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %bool = OpTypeBool -;CHECK: %132 = OpTypeFunction %void %uint %uint %uint %uint %uint )" + kOutputGlobals + R"( ;CHECK:%_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK:%gl_FragCoord = OpVariable %_ptr_Input_v4float Input ;CHECK: %v4uint = OpTypeVector %uint 4 -;CHECK: %185 = OpConstantNull %v2float +;CHECK: [[null_v2float:%\w+]] = OpConstantNull %v2float %MainPs = OpFunction %void None %3 %5 = OpLabel ;CHECK: %123 = OpFunctionCall %uint %inst_bindless_direct_read_3 %uint_1 %uint_2 %uint_0 @@ -4240,10 +4188,10 @@ TEST_F(InstBindlessTest, UniformArrayRefNoDescInit) { ;CHECK: %130 = OpLoad %v2float %81 ;CHECK: OpBranch %127 ;CHECK: %129 = OpLabel -;CHECK: %184 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_78 %uint_4 %uint_0 %101 %123 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_78 %uint_4 %uint_0 %101 %123 ;CHECK: OpBranch %127 ;CHECK: %127 = OpLabel -;CHECK: %186 = OpPhi %v2float %130 %128 %185 %129 +;CHECK: %186 = OpPhi %v2float %130 %128 [[null_v2float]] %129 %86 = OpFAdd %v2float %66 %82 ;CHECK-NOT: %86 = OpFAdd %v2float %66 %82 ;CHECK: %86 = OpFAdd %v2float %66 %186 @@ -4353,13 +4301,12 @@ TEST_F(InstBindlessTest, UniformArrayRefWithDescInit) { )" + kInputGlobals + R"( ;CHECK:%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %bool = OpTypeBool -;CHECK: %135 = OpTypeFunction %void %uint %uint %uint %uint %uint )" + kOutputGlobals + R"( ;CHECK:%_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK:%gl_FragCoord = OpVariable %_ptr_Input_v4float Input ;CHECK: %v4uint = OpTypeVector %uint 4 -;CHECK: %189 = OpConstantNull %v2float -;CHECK: %201 = OpConstantNull %v4float +;CHECK: [[null_v2float:%\w+]] = OpConstantNull %v2float +;CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float %MainPs = OpFunction %void None %3 %5 = OpLabel ;CHECK: %126 = OpFunctionCall %uint %inst_bindless_direct_read_4 %uint_0 %uint_0 %uint_2 %uint_0 @@ -4387,10 +4334,10 @@ TEST_F(InstBindlessTest, UniformArrayRefWithDescInit) { ;CHECK: %133 = OpLoad %v2float %81 ;CHECK: OpBranch %130 ;CHECK: %132 = OpLabel -;CHECK: %188 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_78 %uint_4 %uint_0 %101 %126 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_78 %uint_4 %uint_0 %101 %126 ;CHECK: OpBranch %130 ;CHECK: %130 = OpLabel -;CHECK: %190 = OpPhi %v2float %133 %131 %189 %132 +;CHECK: %190 = OpPhi %v2float %133 %131 [[null_v2float]] %132 ;CHECK: %86 = OpFAdd %v2float %66 %190 %87 = OpLoad %46 %g_tColor %88 = OpLoad %50 %g_sAniso @@ -4408,10 +4355,10 @@ TEST_F(InstBindlessTest, UniformArrayRefWithDescInit) { ;CHECK: %198 = OpImageSampleImplicitLod %v4float %197 %86 ;CHECK: OpBranch %193 ;CHECK: %195 = OpLabel -;CHECK: %200 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_83 %uint_1 %uint_0 %uint_0 %uint_0 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_83 %uint_1 %uint_0 %uint_0 %uint_0 ;CHECK: OpBranch %193 ;CHECK: %193 = OpLabel -;CHECK: %202 = OpPhi %v4float %198 %194 %201 %195 +;CHECK: %202 = OpPhi %v4float %198 %194 [[null_v4float]] %195 ;CHECK: OpStore %_entryPointOutput_vColor %202 OpReturn OpFunctionEnd @@ -4490,15 +4437,12 @@ TEST_F(InstBindlessTest, Descriptor16BitIdxRef) { %_ptr_Output_v4float = OpTypePointer Output %v4float %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output ;CHECK: %bool = OpTypeBool -;CHECK: %51 = OpTypeFunction %void %uint %uint %uint %uint ;CHECK:%_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ;CHECK:%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK:%_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK:%gl_FragCoord = OpVariable %_ptr_Input_v4float Input -;CHECK: %v4uint = OpTypeVector %uint 4 -;CHECK: %106 = OpConstantNull %v4float -;CHECK: %111 = OpTypeFunction %uint %uint %uint %uint %uint +;CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float )" + kInputGlobals + R"( %MainPs = OpFunction %void None %10 %30 = OpLabel @@ -4539,14 +4483,14 @@ TEST_F(InstBindlessTest, Descriptor16BitIdxRef) { ;CHECK: %140 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_60 %uint_1 %139 %uint_0 ;CHECK: OpBranch %133 ;CHECK: %133 = OpLabel -;CHECK: %141 = OpPhi %v4float %138 %134 %106 %135 +;CHECK: [[phi_result_1:%\w+]] = OpPhi %v4float %138 %134 [[null_v4float]] %135 ;CHECK: OpBranch %44 ;CHECK: %46 = OpLabel -;CHECK: %105 = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_60 %uint_0 %41 %uint_128 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_4 %uint_60 %uint_0 %41 %uint_128 ;CHECK: OpBranch %44 ;CHECK: %44 = OpLabel -;CHECK: %107 = OpPhi %v4float %141 %133 %106 %46 -;CHECK: OpStore %_entryPointOutput_vColor %107 +;CHECK: [[phi_result_2:%\w+]] = OpPhi %v4float [[phi_result_1]] %133 [[null_v4float]] %46 +;CHECK: OpStore %_entryPointOutput_vColor [[phi_result_2]] OpReturn OpFunctionEnd )" + kStreamWrite4Frag + kDirectRead4; @@ -4681,12 +4625,10 @@ TEST_F(InstBindlessTest, UniformArray16bitIdxRef) { )" + kInputGlobals + R"( ;CHECK:%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %bool = OpTypeBool -;CHECK: %88 = OpTypeFunction %void %uint %uint %uint %uint %uint )" + kOutputGlobals + R"( ;CHECK:%_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK:%gl_FragCoord = OpVariable %_ptr_Input_v4float Input -;CHECK: %v4uint = OpTypeVector %uint 4 -;CHECK: %142 = OpConstantNull %v2float +;CHECK: [[null_v2float:%\w+]] = OpConstantNull %v2float %MainPs = OpFunction %void None %14 %37 = OpLabel ;CHECK: %79 = OpFunctionCall %uint %inst_bindless_direct_read_3 %uint_1 %uint_0 %uint_0 @@ -4714,10 +4656,10 @@ TEST_F(InstBindlessTest, UniformArray16bitIdxRef) { ;CHECK: %86 = OpLoad %v2float %41 ;CHECK: OpBranch %83 ;CHECK: %85 = OpLabel -;CHECK: %141 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_81 %uint_4 %uint_0 %58 %79 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_81 %uint_4 %uint_0 %58 %79 ;CHECK: OpBranch %83 ;CHECK: %83 = OpLabel -;CHECK: %143 = OpPhi %v2float %86 %84 %142 %85 +;CHECK: %143 = OpPhi %v2float %86 %84 [[null_v2float]] %85 ;CHECK: %43 = OpFAdd %v2float %38 %143 %44 = OpLoad %30 %g_tColor %45 = OpLoad %32 %g_sAniso @@ -4808,23 +4750,16 @@ TEST_F(InstBindlessTest, UniformMatrixRefRowMajor) { %v4float = OpTypeVector %float 4 %_ptr_Input_v4float = OpTypePointer Input %v4float %a_position = OpVariable %_ptr_Input_v4float Input -;CHECK; %37 = OpTypeFunction %uint %uint %uint %uint -;CHECK;%_runtimearr_uint = OpTypeRuntimeArray %uint +;CHECK: %37 = OpTypeFunction %uint %uint %uint %uint +;CHECK:%_runtimearr_uint = OpTypeRuntimeArray %uint )" + kInputGlobals + R"( -;CHECK;%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint -;CHECK; %bool = OpTypeBool -;CHECK; %63 = OpTypeFunction %void %uint %uint %uint %uint %uint +;CHECK:%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +;CHECK: %bool = OpTypeBool )" + kOutputGlobals + R"( -;CHECK;%_ptr_Input_uint = OpTypePointer Input %uint -;CHECK;%gl_VertexIndex = OpVariable %_ptr_Input_uint Input -;CHECK;%gl_InstanceIndex = OpVariable %_ptr_Input_uint Input -;CHECK; %uint_5 = OpConstant %uint 5 -;CHECK; %uint_7 = OpConstant %uint 7 -;CHECK; %uint_8 = OpConstant %uint 8 -;CHECK; %uint_9 = OpConstant %uint 9 -;CHECK; %uint_10 = OpConstant %uint 10 -;CHECK; %uint_45 = OpConstant %uint 45 -;CHECK; %115 = OpConstantNull %float +;CHECK:%_ptr_Input_uint = OpTypePointer Input %uint +;CHECK:%gl_VertexIndex = OpVariable %_ptr_Input_uint Input +;CHECK:%gl_InstanceIndex = OpVariable %_ptr_Input_uint Input +;CHECK: [[null_float:%\w+]] = OpConstantNull %float %main = OpFunction %void None %3 %5 = OpLabel ;CHECK: %55 = OpFunctionCall %uint %inst_bindless_direct_read_3 %uint_1 %uint_0 %uint_0 @@ -4847,10 +4782,10 @@ TEST_F(InstBindlessTest, UniformMatrixRefRowMajor) { ;CHECK: %61 = OpLoad %float %20 ;CHECK: OpBranch %58 ;CHECK: %60 = OpLabel -;CHECK: %114 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_45 %uint_4 %uint_0 %35 %55 +;CHECK: {{\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_45 %uint_4 %uint_0 %35 %55 ;CHECK: OpBranch %58 ;CHECK: %58 = OpLabel -;CHECK: %116 = OpPhi %float %61 %59 %115 %60 +;CHECK: %116 = OpPhi %float %61 %59 [[null_float]] %60 OpStore %v_vtxResult %21 ;CHECK-NOT: OpStore %v_vtxResult %21 ;CHECK: OpStore %v_vtxResult %116 @@ -4943,12 +4878,11 @@ TEST_F(InstBindlessTest, UniformMatrixRefColumnMajor) { )" + kInputGlobals + R"( ;CHECK:%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %bool = OpTypeBool -;CHECK: %63 = OpTypeFunction %void %uint %uint %uint %uint %uint )" + kOutputGlobals + R"( ;CHECK:%_ptr_Input_uint = OpTypePointer Input %uint ;CHECK:%gl_VertexIndex = OpVariable %_ptr_Input_uint Input ;CHECK:%gl_InstanceIndex = OpVariable %_ptr_Input_uint Input -;CHECK: %114 = OpConstantNull %float +;CHECK: [[null_float:%\w+]] = OpConstantNull %float %main = OpFunction %void None %3 %5 = OpLabel ;CHECK: %55 = OpFunctionCall %uint %inst_bindless_direct_read_3 %uint_1 %uint_0 %uint_0 @@ -4971,10 +4905,10 @@ TEST_F(InstBindlessTest, UniformMatrixRefColumnMajor) { ;CHECK: %61 = OpLoad %float %20 ;CHECK: OpBranch %58 ;CHECK: %60 = OpLabel -;CHECK: %113 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_45 %uint_4 %uint_0 %35 %55 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_45 %uint_4 %uint_0 %35 %55 ;CHECK: OpBranch %58 ;CHECK: %58 = OpLabel -;CHECK: %115 = OpPhi %float %61 %59 %114 %60 +;CHECK: %115 = OpPhi %float %61 %59 [[null_float]] %60 OpStore %v_vtxResult %21 ;CHECK-NOT: OpStore %v_vtxResult %21 ;CHECK: OpStore %v_vtxResult %115 @@ -5074,12 +5008,11 @@ TEST_F(InstBindlessTest, UniformMatrixVecRefRowMajor) { )" + kInputGlobals + R"( ;CHECK:%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %bool = OpTypeBool -;CHECK: %72 = OpTypeFunction %void %uint %uint %uint %uint %uint )" + kOutputGlobals + R"( ;CHECK:%_ptr_Input_uint = OpTypePointer Input %uint ;CHECK:%gl_VertexIndex = OpVariable %_ptr_Input_uint Input ;CHECK:%gl_InstanceIndex = OpVariable %_ptr_Input_uint Input -;CHECK: %124 = OpConstantNull %v2float +;CHECK: [[null_v2float:%\w+]] = OpConstantNull %v2float %main = OpFunction %void None %3 %5 = OpLabel ;CHECK: %64 = OpFunctionCall %uint %inst_bindless_direct_read_3 %uint_1 %uint_0 %uint_0 @@ -5106,10 +5039,10 @@ TEST_F(InstBindlessTest, UniformMatrixVecRefRowMajor) { ;CHECK: %70 = OpLoad %v2float %25 ;CHECK: OpBranch %67 ;CHECK: %69 = OpLabel -;CHECK: %123 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_51 %uint_4 %uint_0 %43 %64 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_51 %uint_4 %uint_0 %43 %64 ;CHECK: OpBranch %67 ;CHECK: %67 = OpLabel -;CHECK: %125 = OpPhi %v2float %70 %68 %124 %69 +;CHECK: %125 = OpPhi %v2float %70 %68 [[null_v2float]] %69 ;CHECK: OpStore %v_vtxResult %125 OpReturn OpFunctionEnd @@ -5172,14 +5105,12 @@ TEST_F(InstBindlessTest, ImageBufferOOBRead) { %ii = OpVariable %_ptr_Input_int Input ;CHECK: %uint = OpTypeInt 32 0 ;CHECK: %bool = OpTypeBool -;CHECK: %35 = OpTypeFunction %void %uint %uint %uint %uint %uint ;CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ;CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input -;CHECK: %v4uint = OpTypeVector %uint 4 -;CHECK: %93 = OpConstantNull %v4float +;CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float %main = OpFunction %void None %3 %5 = OpLabel ;CHECK: OpBranch %21 @@ -5204,10 +5135,10 @@ TEST_F(InstBindlessTest, ImageBufferOOBRead) { ;CHECK: %33 = OpImageRead %v4float %32 %17 ;CHECK: OpBranch %29 ;CHECK: %31 = OpLabel -;CHECK: %92 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_33 %uint_7 %uint_0 %23 %25 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_33 %uint_7 %uint_0 %23 %25 ;CHECK: OpBranch %29 ;CHECK: %29 = OpLabel -;CHECK: %94 = OpPhi %v4float %33 %30 %93 %31 +;CHECK: %94 = OpPhi %v4float %33 %30 [[null_v4float]] %31 ;CHECK: OpStore %x %94 OpReturn OpFunctionEnd @@ -5365,14 +5296,12 @@ TEST_F(InstBindlessTest, TextureBufferOOBFetch) { %ii = OpVariable %_ptr_Input_int Input ;CHECK: %uint = OpTypeInt 32 0 ;CHECK: %bool = OpTypeBool -;CHECK: %35 = OpTypeFunction %void %uint %uint %uint %uint %uint ;CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ;CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input -;CHECK: %v4uint = OpTypeVector %uint 4 -;CHECK: %94 = OpConstantNull %v4float +;CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float %main = OpFunction %void None %3 %5 = OpLabel ;CHECK: OpBranch %21 @@ -5397,10 +5326,10 @@ TEST_F(InstBindlessTest, TextureBufferOOBFetch) { ;CHECK: %33 = OpImageFetch %v4float %32 %17 ;CHECK: OpBranch %29 ;CHECK: %31 = OpLabel -;CHECK: %93 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_32 %uint_6 %uint_0 %23 %25 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_32 %uint_6 %uint_0 %23 %25 ;CHECK: OpBranch %29 ;CHECK: %29 = OpLabel -;CHECK: %95 = OpPhi %v4float %33 %30 %94 %31 +;CHECK: %95 = OpPhi %v4float %33 %30 [[null_v4float]] %31 ;CHECK: OpStore %x %95 OpReturn OpFunctionEnd @@ -5464,14 +5393,12 @@ TEST_F(InstBindlessTest, SamplerBufferOOBFetch) { %ii = OpVariable %_ptr_Input_int Input ;CHECK: %uint = OpTypeInt 32 0 ;CHECK: %bool = OpTypeBool -;CHECK: %38 = OpTypeFunction %void %uint %uint %uint %uint %uint ;CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ;CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input -;CHECK: %v4uint = OpTypeVector %uint 4 -;CHECK: %97 = OpConstantNull %v4float +;CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float %main = OpFunction %void None %3 %5 = OpLabel ;CHECK: OpBranch %23 @@ -5498,10 +5425,10 @@ TEST_F(InstBindlessTest, SamplerBufferOOBFetch) { ;CHECK: %36 = OpImageFetch %v4float %35 %18 ;CHECK: OpBranch %31 ;CHECK: %33 = OpLabel -;CHECK: %96 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_34 %uint_6 %uint_0 %25 %27 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_34 %uint_6 %uint_0 %25 %27 ;CHECK: OpBranch %31 ;CHECK: %31 = OpLabel -;CHECK: %98 = OpPhi %v4float %36 %32 %97 %33 +;CHECK: %98 = OpPhi %v4float %36 %32 [[null_v4float]] %33 ;CHECK: OpStore %x %98 OpReturn OpFunctionEnd @@ -5572,14 +5499,12 @@ TEST_F(InstBindlessTest, SamplerBufferConstructorOOBFetch) { %ii = OpVariable %_ptr_Input_int Input ;CHECK: %uint = OpTypeInt 32 0 ;CHECK: %bool = OpTypeBool -;CHECK: %44 = OpTypeFunction %void %uint %uint %uint %uint %uint ;CHECK: %_runtimearr_uint = OpTypeRuntimeArray %uint )" + kOutputGlobals + R"( ;CHECK: %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint ;CHECK: %_ptr_Input_v4float = OpTypePointer Input %v4float ;CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input -;CHECK: %v4uint = OpTypeVector %uint 4 -;CHECK: %103 = OpConstantNull %v4float +;CHECK: [[null_v4float:%\w+]] = OpConstantNull %v4float %main = OpFunction %void None %3 %5 = OpLabel ;CHECK: OpBranch %28 @@ -5609,10 +5534,10 @@ TEST_F(InstBindlessTest, SamplerBufferConstructorOOBFetch) { ;CHECK: %42 = OpImageFetch %v4float %41 %23 ;CHECK: OpBranch %36 ;CHECK: %38 = OpLabel -;CHECK: %102 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_42 %uint_6 %uint_0 %30 %32 +;CHECK: {{%\w+}} = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_42 %uint_6 %uint_0 %30 %32 ;CHECK: OpBranch %36 ;CHECK: %36 = OpLabel -;CHECK: %104 = OpPhi %v4float %42 %37 %103 %38 +;CHECK: %104 = OpPhi %v4float %42 %37 [[null_v4float]] %38 ;CHECK: OpStore %x %104 OpReturn OpFunctionEnd @@ -5625,6 +5550,148 @@ TEST_F(InstBindlessTest, SamplerBufferConstructorOOBFetch) { false, true, true, true); } +TEST_F(InstBindlessTest, DeviceBufferAddressOOB) { + // #version 450 + // #extension GL_EXT_buffer_reference : enable + // layout(buffer_reference, buffer_reference_align = 16) buffer bufStruct; + // layout(set = 0, binding = 0) uniform ufoo { + // bufStruct data; + // int nWrites; + // } u_info; + // layout(buffer_reference, std140) buffer bufStruct { + // int a[4]; + // }; + // void main() { + // for (int i=0; i < u_info.nWrites; ++i) { + // u_info.data.a[i] = 0xdeadca71; + // } + // } + + // clang-format off + const std::string text = R"( +OpCapability Shader +OpCapability PhysicalStorageBufferAddresses +;CHECK: OpCapability Int64 +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel PhysicalStorageBuffer64 GLSL450 +OpEntryPoint Vertex %main "main" %u_info +;CHECK: OpEntryPoint Vertex %main "main" %u_info %inst_bindless_input_buffer %inst_bindless_output_buffer %gl_VertexIndex %gl_InstanceIndex +OpSource GLSL 450 +OpSourceExtension "GL_EXT_buffer_reference" +OpName %main "main" +OpName %i "i" +OpName %ufoo "ufoo" +OpMemberName %ufoo 0 "data" +OpMemberName %ufoo 1 "nWrites" +OpName %bufStruct "bufStruct" +OpMemberName %bufStruct 0 "a" +OpName %u_info "u_info" +OpMemberDecorate %ufoo 0 Offset 0 +OpMemberDecorate %ufoo 1 Offset 8 +OpDecorate %ufoo Block +OpDecorate %_arr_int_uint_4 ArrayStride 16 +OpMemberDecorate %bufStruct 0 Offset 0 +OpDecorate %bufStruct Block +OpDecorate %u_info DescriptorSet 0 +OpDecorate %u_info Binding 0)" + + kInputDecorations + kOutputDecorations + +R"(%void = OpTypeVoid +%3 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +OpTypeForwardPointer %_ptr_PhysicalStorageBuffer_bufStruct PhysicalStorageBuffer +%ufoo = OpTypeStruct %_ptr_PhysicalStorageBuffer_bufStruct %int +%uint = OpTypeInt 32 0 +%uint_4 = OpConstant %uint 4 +%_arr_int_uint_4 = OpTypeArray %int %uint_4 +%bufStruct = OpTypeStruct %_arr_int_uint_4 +%_ptr_PhysicalStorageBuffer_bufStruct = OpTypePointer PhysicalStorageBuffer %bufStruct +%_ptr_Uniform_ufoo = OpTypePointer Uniform %ufoo +%u_info = OpVariable %_ptr_Uniform_ufoo Uniform +%int_1 = OpConstant %int 1 +%_ptr_Uniform_int = OpTypePointer Uniform %int +%bool = OpTypeBool +%_ptr_Uniform__ptr_PhysicalStorageBuffer_bufStruct = OpTypePointer Uniform %_ptr_PhysicalStorageBuffer_bufStruct +%int_n559035791 = OpConstant %int -559035791 +%_ptr_PhysicalStorageBuffer_int = OpTypePointer PhysicalStorageBuffer %int)" + + kInputGlobals + kOutputGlobals + +R"(%main = OpFunction %void None %3 +%5 = OpLabel +%i = OpVariable %_ptr_Function_int Function +;CHECK: OpBranch %137 +;CHECK: %137 = OpLabel +;CHECK: 65 = OpFunctionCall %uint %inst_bindless_direct_read_3 %uint_1 %uint_0 %uint_0 +;CHECK: OpBranch %40 +;CHECK: 40 = OpLabel +;CHECK: OpBranch %39 +;CHECK: 39 = OpLabel +OpStore %i %int_0 +OpBranch %10 +%10 = OpLabel +OpLoopMerge %12 %13 None +OpBranch %14 +%14 = OpLabel +%15 = OpLoad %int %i +%26 = OpAccessChain %_ptr_Uniform_int %u_info %int_1 +%27 = OpLoad %int %26 +%29 = OpSLessThan %bool %15 %27 +;CHECK-NOT: %27 = OpLoad %int %26 +;CHECK-NOT: %29 = OpSLessThan %bool %15 %27 +;CHECK: 43 = OpIAdd %uint %uint_8 %uint_3 +;CHECK: 66 = OpULessThan %bool %43 %65 +;CHECK: OpSelectionMerge %67 None +;CHECK: OpBranchConditional %66 %68 %69 +;CHECK: 68 = OpLabel +;CHECK: 70 = OpLoad %int %26 +;CHECK: OpBranch %67 +;CHECK: 69 = OpLabel +;CHECK: 122 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_54 %uint_4 %uint_0 %43 %65 +;CHECK: OpBranch %67 +;CHECK: 67 = OpLabel +;CHECK: 124 = OpPhi %int %70 %68 %123 %69 +;CHECK: 29 = OpSLessThan %bool %15 %124 +OpBranchConditional %29 %11 %12 +%11 = OpLabel +%31 = OpAccessChain %_ptr_Uniform__ptr_PhysicalStorageBuffer_bufStruct %u_info %int_0 +%32 = OpLoad %_ptr_PhysicalStorageBuffer_bufStruct %31 +;CHECK-NOT: %32 = OpLoad %_ptr_PhysicalStorageBuffer_bufStruct %31 +;CHECK: 125 = OpIAdd %uint %uint_0 %uint_7 +;CHECK: 126 = OpULessThan %bool %125 %65 +;CHECK: OpSelectionMerge %127 None +;CHECK: OpBranchConditional %126 %128 %129 +;CHECK: 128 = OpLabel +;CHECK: 130 = OpLoad %_ptr_PhysicalStorageBuffer_bufStruct %31 +;CHECK: OpBranch %127 +;CHECK: 129 = OpLabel +;CHECK: 132 = OpFunctionCall %void %inst_bindless_stream_write_5 %uint_59 %uint_4 %uint_0 %125 %65 +;CHECK: 135 = OpConvertUToPtr %_ptr_PhysicalStorageBuffer_bufStruct %134 +;CHECK: OpBranch %127 +;CHECK: 127 = OpLabel +;CHECK: 136 = OpPhi %_ptr_PhysicalStorageBuffer_bufStruct %130 %128 %135 %129 +%33 = OpLoad %int %i +%36 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %32 %int_0 %33 +;CHECK-NOT: %36 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %32 %int_0 %33 +;CHECK: %36 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %136 %int_0 %33 +OpStore %36 %int_n559035791 Aligned 16 +OpBranch %13 +%13 = OpLabel +%37 = OpLoad %int %i +%38 = OpIAdd %int %37 %int_1 +OpStore %i %38 +OpBranch %10 +%12 = OpLabel +OpReturn +OpFunctionEnd)" + + kDirectRead3 + kStreamWrite5Vert; + // clang-format on + + SetTargetEnv(SPV_ENV_VULKAN_1_2); + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(text, true, 7u, 23u, false, true, + true, true, true); +} + // TODO(greg-lunarg): Add tests to verify handling of these cases: // // Compute shader diff --git a/test/opt/inst_buff_addr_check_test.cpp b/test/opt/inst_buff_addr_check_test.cpp index 7886ba7ea..b08f7b0b4 100644 --- a/test/opt/inst_buff_addr_check_test.cpp +++ b/test/opt/inst_buff_addr_check_test.cpp @@ -120,6 +120,22 @@ static const std::string kStreamWrite4Compute = kStreamWrite4Begin + R"( )" + kStreamWrite4End; // clang-format on +// clang-format off +static const std::string kStreamWrite4Vert = kStreamWrite4Begin + R"( +; CHECK: {{%\w+}} = OpIAdd %uint {{%\w+}} %uint_3 +; CHECK: {{%\w+}} = OpAccessChain %_ptr_StorageBuffer_uint [[output_buffer_var]] %uint_2 {{%\w+}} +; CHECK: OpStore {{%\w+}} %uint_0 +; CHECK: {{%\w+}} = OpLoad %uint %gl_VertexIndex +; CHECK: {{%\w+}} = OpIAdd %uint {{%\w+}} %uint_4 +; CHECK: {{%\w+}} = OpAccessChain %_ptr_StorageBuffer_uint [[output_buffer_var]] %uint_2 {{%\w+}} +; CHECK: OpStore {{%\w+}} {{%\w+}} +; CHECK: {{%\w+}} = OpLoad %uint %gl_InstanceIndex +; CHECK: {{%\w+}} = OpIAdd %uint {{%\w+}} %uint_5 +; CHECK: {{%\w+}} = OpAccessChain %_ptr_StorageBuffer_uint [[output_buffer_var]] %uint_2 {{%\w+}} +; CHECK: OpStore {{%\w+}} {{%\w+}} +)" + kStreamWrite4End; +// clang-format on + static const std::string kInputDecorations = R"( ; CHECK: OpDecorate [[input_buffer_type:%inst_buff_addr_InputBuffer]] Block ; CHECK: OpMemberDecorate [[input_buffer_type]] 0 Offset 0 @@ -552,6 +568,118 @@ OpFunctionEnd defs + decorates + globals + main_func + output_funcs, true); } +TEST_F(InstBuffAddrTest, DeviceBufferAddressOOB) { + // #version 450 + // #extension GL_EXT_buffer_reference : enable + // layout(buffer_reference, buffer_reference_align = 16) buffer bufStruct; + // layout(set = 0, binding = 0) uniform ufoo { + // bufStruct data; + // int nWrites; + // } u_info; + // layout(buffer_reference, std140) buffer bufStruct { + // int a[4]; + // }; + // void main() { + // for (int i=0; i < u_info.nWrites; ++i) { + // u_info.data.a[i] = 0xdeadca71; + // } + // } + + // clang-format off + const std::string text = R"( +OpCapability Shader +OpCapability PhysicalStorageBufferAddresses +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel PhysicalStorageBuffer64 GLSL450 +OpEntryPoint Vertex %main "main" %u_info +;CHECK: OpEntryPoint Vertex %main "main" %u_info %inst_buff_addr_input_buffer %inst_buff_addr_output_buffer %gl_VertexIndex %gl_InstanceIndex +OpSource GLSL 450 +OpSourceExtension "GL_EXT_buffer_reference" +OpName %main "main" +OpName %i "i" +OpName %ufoo "ufoo" +OpMemberName %ufoo 0 "data" +OpMemberName %ufoo 1 "nWrites" +OpName %bufStruct "bufStruct" +OpMemberName %bufStruct 0 "a" +OpName %u_info "u_info" +OpMemberDecorate %ufoo 0 Offset 0 +OpMemberDecorate %ufoo 1 Offset 8 +OpDecorate %ufoo Block +OpDecorate %_arr_int_uint_4 ArrayStride 16 +OpMemberDecorate %bufStruct 0 Offset 0 +OpDecorate %bufStruct Block +OpDecorate %u_info DescriptorSet 0 +OpDecorate %u_info Binding 0)" + kInputDecorations + kOutputDecorations + R"( +%void = OpTypeVoid +%3 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +OpTypeForwardPointer %_ptr_PhysicalStorageBuffer_bufStruct PhysicalStorageBuffer +%ufoo = OpTypeStruct %_ptr_PhysicalStorageBuffer_bufStruct %int +%uint = OpTypeInt 32 0 +%uint_4 = OpConstant %uint 4 +%_arr_int_uint_4 = OpTypeArray %int %uint_4 +%bufStruct = OpTypeStruct %_arr_int_uint_4 +%_ptr_PhysicalStorageBuffer_bufStruct = OpTypePointer PhysicalStorageBuffer %bufStruct +%_ptr_Uniform_ufoo = OpTypePointer Uniform %ufoo +%u_info = OpVariable %_ptr_Uniform_ufoo Uniform +%int_1 = OpConstant %int 1 +%_ptr_Uniform_int = OpTypePointer Uniform %int +%bool = OpTypeBool +%_ptr_Uniform__ptr_PhysicalStorageBuffer_bufStruct = OpTypePointer Uniform %_ptr_PhysicalStorageBuffer_bufStruct +%int_n559035791 = OpConstant %int -559035791 +%_ptr_PhysicalStorageBuffer_int = OpTypePointer PhysicalStorageBuffer %int)" + kInputGlobals + kOutputGlobals + R"( +%main = OpFunction %void None %3 +%5 = OpLabel +%i = OpVariable %_ptr_Function_int Function +OpStore %i %int_0 +OpBranch %10 +%10 = OpLabel +OpLoopMerge %12 %13 None +OpBranch %14 +%14 = OpLabel +%15 = OpLoad %int %i +%26 = OpAccessChain %_ptr_Uniform_int %u_info %int_1 +%27 = OpLoad %int %26 +%29 = OpSLessThan %bool %15 %27 +OpBranchConditional %29 %11 %12 +%11 = OpLabel +%31 = OpAccessChain %_ptr_Uniform__ptr_PhysicalStorageBuffer_bufStruct %u_info %int_0 +%32 = OpLoad %_ptr_PhysicalStorageBuffer_bufStruct %31 +%33 = OpLoad %int %i +%36 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %32 %int_0 %33 +;CHECK: %41 = OpConvertPtrToU %ulong %36 +;CHECK: %76 = OpFunctionCall %bool %inst_buff_addr_search_and_test %41 %uint_4 +;CHECK: OpSelectionMerge %77 None +;CHECK: OpBranchConditional %76 %78 %79 +;CHECK: %78 = OpLabel +OpStore %36 %int_n559035791 Aligned 16 +;CHECK: OpBranch %77 +;CHECK: 79 = OpLabel +;CHECK: 80 = OpUConvert %uint %41 +;CHECK: 82 = OpShiftRightLogical %ulong %41 %uint_32 +;CHECK: 83 = OpUConvert %uint %82 +;CHECK: 134 = OpFunctionCall %void %inst_buff_addr_stream_write_4 %uint_62 %uint_2 %80 %83 +;CHECK: OpBranch %77 +;CHECK: 77 = OpLabel +OpBranch %13 +%13 = OpLabel +%37 = OpLoad %int %i +%38 = OpIAdd %int %37 %int_1 +OpStore %i %38 +OpBranch %10 +%12 = OpLabel +OpReturn +OpFunctionEnd)" + kSearchAndTest + kStreamWrite4Vert; + // clang-format on + + SetTargetEnv(SPV_ENV_VULKAN_1_2); + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(text, true, 7, 23); +} + } // namespace } // namespace opt } // namespace spvtools