| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038 |
- // Copyright (c) 2019 Google LLC
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- #include <string>
- #include "test/opt/pass_fixture.h"
- #include "test/opt/pass_utils.h"
- namespace spvtools {
- namespace opt {
- namespace {
- using FixStorageClassTest = PassTest<::testing::Test>;
- TEST_F(FixStorageClassTest, FixAccessChain) {
- const std::string text = R"(
- ; CHECK: OpAccessChain %_ptr_Workgroup_float
- ; CHECK: OpAccessChain %_ptr_Uniform_float
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain" %gl_GlobalInvocationID %gl_LocalInvocationID %gl_WorkGroupID
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
- OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
- OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
- OpDecorate %8 DescriptorSet 0
- OpDecorate %8 Binding 0
- OpDecorate %_runtimearr_float ArrayStride 4
- OpMemberDecorate %_struct_7 0 Offset 0
- OpDecorate %_struct_7 BufferBlock
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %float_2 = OpConstant %float 2
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
- %_arr_float_uint_10 = OpTypeArray %float %uint_10
- %ptr = OpTypePointer Function %_arr_float_uint_10
- %_arr__arr_float_uint_10_uint_10 = OpTypeArray %_arr_float_uint_10 %uint_10
- %_struct_5 = OpTypeStruct %_arr__arr_float_uint_10_uint_10
- %_ptr_Workgroup__struct_5 = OpTypePointer Workgroup %_struct_5
- %_runtimearr_float = OpTypeRuntimeArray %float
- %_struct_7 = OpTypeStruct %_runtimearr_float
- %_ptr_Uniform__struct_7 = OpTypePointer Uniform %_struct_7
- %v3uint = OpTypeVector %uint 3
- %_ptr_Input_v3uint = OpTypePointer Input %v3uint
- %void = OpTypeVoid
- %30 = OpTypeFunction %void
- %_ptr_Function_float = OpTypePointer Function %float
- %_ptr_Uniform_float = OpTypePointer Uniform %float
- %6 = OpVariable %_ptr_Workgroup__struct_5 Workgroup
- %8 = OpVariable %_ptr_Uniform__struct_7 Uniform
- %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
- %1 = OpFunction %void None %30
- %38 = OpLabel
- %44 = OpLoad %v3uint %gl_LocalInvocationID
- %50 = OpAccessChain %_ptr_Function_float %6 %int_0 %int_0 %int_0
- %51 = OpLoad %float %50
- %52 = OpFMul %float %float_2 %51
- OpStore %50 %52
- %55 = OpLoad %float %50
- %59 = OpCompositeExtract %uint %44 0
- %60 = OpAccessChain %_ptr_Uniform_float %8 %int_0 %59
- OpStore %60 %55
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, FixLinkedAccessChain) {
- const std::string text = R"(
- ; CHECK: OpAccessChain %_ptr_Workgroup__arr_float_uint_10
- ; CHECK: OpAccessChain %_ptr_Workgroup_float
- ; CHECK: OpAccessChain %_ptr_Uniform_float
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain" %gl_GlobalInvocationID %gl_LocalInvocationID %gl_WorkGroupID
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
- OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
- OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
- OpDecorate %5 DescriptorSet 0
- OpDecorate %5 Binding 0
- OpDecorate %_runtimearr_float ArrayStride 4
- OpMemberDecorate %_struct_7 0 Offset 0
- OpDecorate %_struct_7 BufferBlock
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %float_2 = OpConstant %float 2
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
- %_arr_float_uint_10 = OpTypeArray %float %uint_10
- %_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
- %_ptr = OpTypePointer Function %_arr_float_uint_10
- %_arr__arr_float_uint_10_uint_10 = OpTypeArray %_arr_float_uint_10 %uint_10
- %_struct_17 = OpTypeStruct %_arr__arr_float_uint_10_uint_10
- %_ptr_Workgroup__struct_17 = OpTypePointer Workgroup %_struct_17
- %_runtimearr_float = OpTypeRuntimeArray %float
- %_struct_7 = OpTypeStruct %_runtimearr_float
- %_ptr_Uniform__struct_7 = OpTypePointer Uniform %_struct_7
- %v3uint = OpTypeVector %uint 3
- %_ptr_Input_v3uint = OpTypePointer Input %v3uint
- %void = OpTypeVoid
- %23 = OpTypeFunction %void
- %_ptr_Function_float = OpTypePointer Function %float
- %_ptr_Uniform_float = OpTypePointer Uniform %float
- %27 = OpVariable %_ptr_Workgroup__struct_17 Workgroup
- %5 = OpVariable %_ptr_Uniform__struct_7 Uniform
- %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
- %1 = OpFunction %void None %23
- %28 = OpLabel
- %29 = OpLoad %v3uint %gl_LocalInvocationID
- %30 = OpAccessChain %_ptr_Function__arr_float_uint_10 %27 %int_0 %int_0
- %31 = OpAccessChain %_ptr_Function_float %30 %int_0
- %32 = OpLoad %float %31
- %33 = OpFMul %float %float_2 %32
- OpStore %31 %33
- %34 = OpLoad %float %31
- %35 = OpCompositeExtract %uint %29 0
- %36 = OpAccessChain %_ptr_Uniform_float %5 %int_0 %35
- OpStore %36 %34
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, FixCopyObject) {
- const std::string text = R"(
- ; CHECK: OpCopyObject %_ptr_Workgroup__struct_17
- ; CHECK: OpAccessChain %_ptr_Workgroup_float
- ; CHECK: OpAccessChain %_ptr_Uniform_float
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain" %gl_GlobalInvocationID %gl_LocalInvocationID %gl_WorkGroupID
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
- OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
- OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
- OpDecorate %8 DescriptorSet 0
- OpDecorate %8 Binding 0
- OpDecorate %_runtimearr_float ArrayStride 4
- OpMemberDecorate %_struct_7 0 Offset 0
- OpDecorate %_struct_7 BufferBlock
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %float_2 = OpConstant %float 2
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
- %_arr_float_uint_10 = OpTypeArray %float %uint_10
- %ptr = OpTypePointer Function %_arr_float_uint_10
- %_arr__arr_float_uint_10_uint_10 = OpTypeArray %_arr_float_uint_10 %uint_10
- %_struct_17 = OpTypeStruct %_arr__arr_float_uint_10_uint_10
- %_ptr_Workgroup__struct_17 = OpTypePointer Workgroup %_struct_17
- %_ptr_Function__struct_17 = OpTypePointer Function %_struct_17
- %_runtimearr_float = OpTypeRuntimeArray %float
- %_struct_7 = OpTypeStruct %_runtimearr_float
- %_ptr_Uniform__struct_7 = OpTypePointer Uniform %_struct_7
- %v3uint = OpTypeVector %uint 3
- %_ptr_Input_v3uint = OpTypePointer Input %v3uint
- %void = OpTypeVoid
- %30 = OpTypeFunction %void
- %_ptr_Function_float = OpTypePointer Function %float
- %_ptr_Uniform_float = OpTypePointer Uniform %float
- %6 = OpVariable %_ptr_Workgroup__struct_17 Workgroup
- %8 = OpVariable %_ptr_Uniform__struct_7 Uniform
- %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
- %1 = OpFunction %void None %30
- %38 = OpLabel
- %44 = OpLoad %v3uint %gl_LocalInvocationID
- %cp = OpCopyObject %_ptr_Function__struct_17 %6
- %50 = OpAccessChain %_ptr_Function_float %cp %int_0 %int_0 %int_0
- %51 = OpLoad %float %50
- %52 = OpFMul %float %float_2 %51
- OpStore %50 %52
- %55 = OpLoad %float %50
- %59 = OpCompositeExtract %uint %44 0
- %60 = OpAccessChain %_ptr_Uniform_float %8 %int_0 %59
- OpStore %60 %55
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, FixPhiInSelMerge) {
- const std::string text = R"(
- ; CHECK: OpPhi %_ptr_Workgroup__struct_19
- ; CHECK: OpAccessChain %_ptr_Workgroup_float
- ; CHECK: OpAccessChain %_ptr_Uniform_float
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain" %gl_GlobalInvocationID %gl_LocalInvocationID %gl_WorkGroupID
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
- OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
- OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
- OpDecorate %5 DescriptorSet 0
- OpDecorate %5 Binding 0
- OpDecorate %_runtimearr_float ArrayStride 4
- OpMemberDecorate %_struct_7 0 Offset 0
- OpDecorate %_struct_7 BufferBlock
- %bool = OpTypeBool
- %true = OpConstantTrue %bool
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %float_2 = OpConstant %float 2
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
- %_arr_float_uint_10 = OpTypeArray %float %uint_10
- %_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
- %_arr__arr_float_uint_10_uint_10 = OpTypeArray %_arr_float_uint_10 %uint_10
- %_struct_19 = OpTypeStruct %_arr__arr_float_uint_10_uint_10
- %_ptr_Workgroup__struct_19 = OpTypePointer Workgroup %_struct_19
- %_ptr_Function__struct_19 = OpTypePointer Function %_struct_19
- %_runtimearr_float = OpTypeRuntimeArray %float
- %_struct_7 = OpTypeStruct %_runtimearr_float
- %_ptr_Uniform__struct_7 = OpTypePointer Uniform %_struct_7
- %v3uint = OpTypeVector %uint 3
- %_ptr_Input_v3uint = OpTypePointer Input %v3uint
- %void = OpTypeVoid
- %25 = OpTypeFunction %void
- %_ptr_Function_float = OpTypePointer Function %float
- %_ptr_Uniform_float = OpTypePointer Uniform %float
- %28 = OpVariable %_ptr_Workgroup__struct_19 Workgroup
- %29 = OpVariable %_ptr_Workgroup__struct_19 Workgroup
- %5 = OpVariable %_ptr_Uniform__struct_7 Uniform
- %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
- %1 = OpFunction %void None %25
- %30 = OpLabel
- OpSelectionMerge %31 None
- OpBranchConditional %true %32 %31
- %32 = OpLabel
- OpBranch %31
- %31 = OpLabel
- %33 = OpPhi %_ptr_Function__struct_19 %28 %30 %29 %32
- %34 = OpLoad %v3uint %gl_LocalInvocationID
- %35 = OpAccessChain %_ptr_Function_float %33 %int_0 %int_0 %int_0
- %36 = OpLoad %float %35
- %37 = OpFMul %float %float_2 %36
- OpStore %35 %37
- %38 = OpLoad %float %35
- %39 = OpCompositeExtract %uint %34 0
- %40 = OpAccessChain %_ptr_Uniform_float %5 %int_0 %39
- OpStore %40 %38
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, FixPhiInLoop) {
- const std::string text = R"(
- ; CHECK: OpPhi %_ptr_Workgroup__struct_19
- ; CHECK: OpAccessChain %_ptr_Workgroup_float
- ; CHECK: OpAccessChain %_ptr_Uniform_float
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain" %gl_GlobalInvocationID %gl_LocalInvocationID %gl_WorkGroupID
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
- OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
- OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
- OpDecorate %5 DescriptorSet 0
- OpDecorate %5 Binding 0
- OpDecorate %_runtimearr_float ArrayStride 4
- OpMemberDecorate %_struct_7 0 Offset 0
- OpDecorate %_struct_7 BufferBlock
- %bool = OpTypeBool
- %true = OpConstantTrue %bool
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %float_2 = OpConstant %float 2
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
- %_arr_float_uint_10 = OpTypeArray %float %uint_10
- %_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
- %_arr__arr_float_uint_10_uint_10 = OpTypeArray %_arr_float_uint_10 %uint_10
- %_struct_19 = OpTypeStruct %_arr__arr_float_uint_10_uint_10
- %_ptr_Workgroup__struct_19 = OpTypePointer Workgroup %_struct_19
- %_ptr_Function__struct_19 = OpTypePointer Function %_struct_19
- %_runtimearr_float = OpTypeRuntimeArray %float
- %_struct_7 = OpTypeStruct %_runtimearr_float
- %_ptr_Uniform__struct_7 = OpTypePointer Uniform %_struct_7
- %v3uint = OpTypeVector %uint 3
- %_ptr_Input_v3uint = OpTypePointer Input %v3uint
- %void = OpTypeVoid
- %25 = OpTypeFunction %void
- %_ptr_Function_float = OpTypePointer Function %float
- %_ptr_Uniform_float = OpTypePointer Uniform %float
- %28 = OpVariable %_ptr_Workgroup__struct_19 Workgroup
- %29 = OpVariable %_ptr_Workgroup__struct_19 Workgroup
- %5 = OpVariable %_ptr_Uniform__struct_7 Uniform
- %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
- %1 = OpFunction %void None %25
- %30 = OpLabel
- OpSelectionMerge %31 None
- OpBranchConditional %true %32 %31
- %32 = OpLabel
- OpBranch %31
- %31 = OpLabel
- %33 = OpPhi %_ptr_Function__struct_19 %28 %30 %29 %32
- %34 = OpLoad %v3uint %gl_LocalInvocationID
- %35 = OpAccessChain %_ptr_Function_float %33 %int_0 %int_0 %int_0
- %36 = OpLoad %float %35
- %37 = OpFMul %float %float_2 %36
- OpStore %35 %37
- %38 = OpLoad %float %35
- %39 = OpCompositeExtract %uint %34 0
- %40 = OpAccessChain %_ptr_Uniform_float %5 %int_0 %39
- OpStore %40 %38
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, DontChangeFunctionCalls) {
- const std::string text = R"(OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain"
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %2 DescriptorSet 0
- OpDecorate %2 Binding 0
- %int = OpTypeInt 32 1
- %_ptr_Function_int = OpTypePointer Function %int
- %_ptr_Workgroup_int = OpTypePointer Workgroup %int
- %_ptr_Uniform_int = OpTypePointer Uniform %int
- %void = OpTypeVoid
- %8 = OpTypeFunction %void
- %9 = OpTypeFunction %_ptr_Uniform_int %_ptr_Function_int
- %10 = OpVariable %_ptr_Workgroup_int Workgroup
- %2 = OpVariable %_ptr_Uniform_int Uniform
- %1 = OpFunction %void None %8
- %11 = OpLabel
- %12 = OpFunctionCall %_ptr_Uniform_int %13 %10
- OpReturn
- OpFunctionEnd
- %13 = OpFunction %_ptr_Uniform_int None %9
- %14 = OpFunctionParameter %_ptr_Function_int
- %15 = OpLabel
- OpReturnValue %2
- OpFunctionEnd
- )";
- SinglePassRunAndCheck<FixStorageClass>(text, text, false, false);
- }
- TEST_F(FixStorageClassTest, FixSelect) {
- const std::string text = R"(
- ; CHECK: OpSelect %_ptr_Workgroup__struct_19
- ; CHECK: OpAccessChain %_ptr_Workgroup_float
- ; CHECK: OpAccessChain %_ptr_Uniform_float
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain" %gl_GlobalInvocationID %gl_LocalInvocationID %gl_WorkGroupID
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
- OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
- OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
- OpDecorate %5 DescriptorSet 0
- OpDecorate %5 Binding 0
- OpDecorate %_runtimearr_float ArrayStride 4
- OpMemberDecorate %_struct_7 0 Offset 0
- OpDecorate %_struct_7 BufferBlock
- %bool = OpTypeBool
- %true = OpConstantTrue %bool
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %float_2 = OpConstant %float 2
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
- %_arr_float_uint_10 = OpTypeArray %float %uint_10
- %_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
- %_arr__arr_float_uint_10_uint_10 = OpTypeArray %_arr_float_uint_10 %uint_10
- %_struct_19 = OpTypeStruct %_arr__arr_float_uint_10_uint_10
- %_ptr_Workgroup__struct_19 = OpTypePointer Workgroup %_struct_19
- %_ptr_Function__struct_19 = OpTypePointer Function %_struct_19
- %_runtimearr_float = OpTypeRuntimeArray %float
- %_struct_7 = OpTypeStruct %_runtimearr_float
- %_ptr_Uniform__struct_7 = OpTypePointer Uniform %_struct_7
- %v3uint = OpTypeVector %uint 3
- %_ptr_Input_v3uint = OpTypePointer Input %v3uint
- %void = OpTypeVoid
- %25 = OpTypeFunction %void
- %_ptr_Function_float = OpTypePointer Function %float
- %_ptr_Uniform_float = OpTypePointer Uniform %float
- %28 = OpVariable %_ptr_Workgroup__struct_19 Workgroup
- %29 = OpVariable %_ptr_Workgroup__struct_19 Workgroup
- %5 = OpVariable %_ptr_Uniform__struct_7 Uniform
- %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
- %1 = OpFunction %void None %25
- %30 = OpLabel
- %33 = OpSelect %_ptr_Function__struct_19 %true %28 %29
- %34 = OpLoad %v3uint %gl_LocalInvocationID
- %35 = OpAccessChain %_ptr_Function_float %33 %int_0 %int_0 %int_0
- %36 = OpLoad %float %35
- %37 = OpFMul %float %float_2 %36
- OpStore %35 %37
- %38 = OpLoad %float %35
- %39 = OpCompositeExtract %uint %34 0
- %40 = OpAccessChain %_ptr_Uniform_float %5 %int_0 %39
- OpStore %40 %38
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, BitCast) {
- const std::string text = R"(OpCapability VariablePointersStorageBuffer
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "main"
- %void = OpTypeVoid
- %3 = OpTypeFunction %void
- %_ptr_Output_void = OpTypePointer Output %void
- %_ptr_Private__ptr_Output_void = OpTypePointer Private %_ptr_Output_void
- %6 = OpVariable %_ptr_Private__ptr_Output_void Private
- %1 = OpFunction %void Inline %3
- %7 = OpLabel
- %8 = OpBitcast %_ptr_Output_void %6
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndCheck<FixStorageClass>(text, text, false);
- }
- TEST_F(FixStorageClassTest, FixLinkedAccessChain2) {
- // This case is similar to FixLinkedAccessChain. The difference is that the
- // first OpAccessChain instruction starts as workgroup storage class. Only
- // the second one needs to change.
- const std::string text = R"(
- ; CHECK: OpAccessChain %_ptr_Workgroup__arr_float_uint_10
- ; CHECK: OpAccessChain %_ptr_Workgroup_float
- ; CHECK: OpAccessChain %_ptr_Uniform_float
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain" %gl_GlobalInvocationID %gl_LocalInvocationID %gl_WorkGroupID
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
- OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
- OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
- OpDecorate %5 DescriptorSet 0
- OpDecorate %5 Binding 0
- OpDecorate %_runtimearr_float ArrayStride 4
- OpMemberDecorate %_struct_7 0 Offset 0
- OpDecorate %_struct_7 BufferBlock
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %float_2 = OpConstant %float 2
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
- %_arr_float_uint_10 = OpTypeArray %float %uint_10
- %_ptr_Workgroup__arr_float_uint_10 = OpTypePointer Workgroup %_arr_float_uint_10
- %_ptr = OpTypePointer Function %_arr_float_uint_10
- %_arr__arr_float_uint_10_uint_10 = OpTypeArray %_arr_float_uint_10 %uint_10
- %_struct_17 = OpTypeStruct %_arr__arr_float_uint_10_uint_10
- %_ptr_Workgroup__struct_17 = OpTypePointer Workgroup %_struct_17
- %_runtimearr_float = OpTypeRuntimeArray %float
- %_struct_7 = OpTypeStruct %_runtimearr_float
- %_ptr_Uniform__struct_7 = OpTypePointer Uniform %_struct_7
- %v3uint = OpTypeVector %uint 3
- %_ptr_Input_v3uint = OpTypePointer Input %v3uint
- %void = OpTypeVoid
- %23 = OpTypeFunction %void
- %_ptr_Function_float = OpTypePointer Function %float
- %_ptr_Uniform_float = OpTypePointer Uniform %float
- %27 = OpVariable %_ptr_Workgroup__struct_17 Workgroup
- %5 = OpVariable %_ptr_Uniform__struct_7 Uniform
- %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
- %1 = OpFunction %void None %23
- %28 = OpLabel
- %29 = OpLoad %v3uint %gl_LocalInvocationID
- %30 = OpAccessChain %_ptr_Workgroup__arr_float_uint_10 %27 %int_0 %int_0
- %31 = OpAccessChain %_ptr_Function_float %30 %int_0
- %32 = OpLoad %float %31
- %33 = OpFMul %float %float_2 %32
- OpStore %31 %33
- %34 = OpLoad %float %31
- %35 = OpCompositeExtract %uint %29 0
- %36 = OpAccessChain %_ptr_Uniform_float %5 %int_0 %35
- OpStore %36 %34
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, AllowImageFormatMismatch) {
- const std::string text = R"(OpCapability Shader
- OpCapability SampledBuffer
- OpCapability ImageBuffer
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %main "main"
- OpExecutionMode %main LocalSize 1 1 1
- OpSource HLSL 600
- OpName %type_buffer_image "type.buffer.image"
- OpName %Buf "Buf"
- OpName %main "main"
- OpName %src_main "src.main"
- OpName %bb_entry "bb.entry"
- OpName %type_buffer_image_0 "type.buffer.image"
- OpName %b "b"
- OpDecorate %Buf DescriptorSet 0
- OpDecorate %Buf Binding 0
- %float = OpTypeFloat 32
- %type_buffer_image = OpTypeImage %float Buffer 2 0 0 2 Rgba16f
- %_ptr_UniformConstant_type_buffer_image = OpTypePointer UniformConstant %type_buffer_image
- %void = OpTypeVoid
- %11 = OpTypeFunction %void
- %type_buffer_image_0 = OpTypeImage %float Buffer 2 0 0 2 Rgba32f
- %_ptr_Function_type_buffer_image_0 = OpTypePointer Function %type_buffer_image_0
- %Buf = OpVariable %_ptr_UniformConstant_type_buffer_image UniformConstant
- %main = OpFunction %void None %11
- %13 = OpLabel
- %14 = OpFunctionCall %void %src_main
- OpReturn
- OpFunctionEnd
- %src_main = OpFunction %void None %11
- %bb_entry = OpLabel
- %b = OpVariable %_ptr_Function_type_buffer_image_0 Function
- %15 = OpLoad %type_buffer_image %Buf
- OpStore %b %15
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndCheck<FixStorageClass>(text, text, false, false);
- }
- using FixTypeTest = PassTest<::testing::Test>;
- TEST_F(FixTypeTest, FixAccessChain) {
- const std::string text = R"(
- ; CHECK: [[ac1:%\w+]] = OpAccessChain %_ptr_Uniform_S %A %int_0 %uint_0
- ; CHECK: [[ac2:%\w+]] = OpAccessChain %_ptr_Uniform_T [[ac1]] %int_0
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %main "main"
- OpExecutionMode %main LocalSize 1 1 1
- OpSource HLSL 600
- OpName %type_RWStructuredBuffer_S "type.RWStructuredBuffer.S"
- OpName %S "S"
- OpMemberName %S 0 "t"
- OpName %T "T"
- OpMemberName %T 0 "a"
- OpName %A "A"
- OpName %type_ACSBuffer_counter "type.ACSBuffer.counter"
- OpMemberName %type_ACSBuffer_counter 0 "counter"
- OpName %counter_var_A "counter.var.A"
- OpName %main "main"
- OpName %S_0 "S"
- OpMemberName %S_0 0 "t"
- OpName %T_0 "T"
- OpMemberName %T_0 0 "a"
- OpDecorate %A DescriptorSet 0
- OpDecorate %A Binding 0
- OpDecorate %counter_var_A DescriptorSet 0
- OpDecorate %counter_var_A Binding 1
- OpMemberDecorate %T 0 Offset 0
- OpMemberDecorate %S 0 Offset 0
- OpDecorate %_runtimearr_S ArrayStride 4
- OpMemberDecorate %type_RWStructuredBuffer_S 0 Offset 0
- OpDecorate %type_RWStructuredBuffer_S BufferBlock
- OpMemberDecorate %type_ACSBuffer_counter 0 Offset 0
- OpDecorate %type_ACSBuffer_counter BufferBlock
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
- %T = OpTypeStruct %int
- %S = OpTypeStruct %T
- %_runtimearr_S = OpTypeRuntimeArray %S
- %type_RWStructuredBuffer_S = OpTypeStruct %_runtimearr_S
- %_ptr_Uniform_type_RWStructuredBuffer_S = OpTypePointer Uniform %type_RWStructuredBuffer_S
- %type_ACSBuffer_counter = OpTypeStruct %int
- %_ptr_Uniform_type_ACSBuffer_counter = OpTypePointer Uniform %type_ACSBuffer_counter
- %void = OpTypeVoid
- %18 = OpTypeFunction %void
- %T_0 = OpTypeStruct %int
- %S_0 = OpTypeStruct %T_0
- %_ptr_Function_S_0 = OpTypePointer Function %S_0
- %_ptr_Uniform_S = OpTypePointer Uniform %S
- %_ptr_Uniform_T = OpTypePointer Uniform %T
- %22 = OpTypeFunction %T_0 %_ptr_Function_S_0
- %_ptr_Function_T_0 = OpTypePointer Function %T_0
- %A = OpVariable %_ptr_Uniform_type_RWStructuredBuffer_S Uniform
- %counter_var_A = OpVariable %_ptr_Uniform_type_ACSBuffer_counter Uniform
- %main = OpFunction %void None %18
- %24 = OpLabel
- %25 = OpVariable %_ptr_Function_T_0 Function
- %26 = OpVariable %_ptr_Function_S_0 Function
- %27 = OpAccessChain %_ptr_Uniform_S %A %int_0 %uint_0
- %28 = OpAccessChain %_ptr_Function_T_0 %27 %int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixTypeTest, FixLoad) {
- const std::string text = R"(
- ; CHECK: [[ac1:%\w+]] = OpAccessChain %_ptr_Uniform_S %A %int_0 %uint_0
- ; CHECK: [[ac2:%\w+]] = OpAccessChain %_ptr_Uniform_T [[ac1]] %int_0
- ; CHECK: [[ld:%\w+]] = OpLoad %T [[ac2]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %main "main"
- OpExecutionMode %main LocalSize 1 1 1
- OpSource HLSL 600
- OpName %type_RWStructuredBuffer_S "type.RWStructuredBuffer.S"
- OpName %S "S"
- OpMemberName %S 0 "t"
- OpName %T "T"
- OpMemberName %T 0 "a"
- OpName %A "A"
- OpName %type_ACSBuffer_counter "type.ACSBuffer.counter"
- OpMemberName %type_ACSBuffer_counter 0 "counter"
- OpName %counter_var_A "counter.var.A"
- OpName %main "main"
- OpName %S_0 "S"
- OpMemberName %S_0 0 "t"
- OpName %T_0 "T"
- OpMemberName %T_0 0 "a"
- OpDecorate %A DescriptorSet 0
- OpDecorate %A Binding 0
- OpDecorate %counter_var_A DescriptorSet 0
- OpDecorate %counter_var_A Binding 1
- OpMemberDecorate %T 0 Offset 0
- OpMemberDecorate %S 0 Offset 0
- OpDecorate %_runtimearr_S ArrayStride 4
- OpMemberDecorate %type_RWStructuredBuffer_S 0 Offset 0
- OpDecorate %type_RWStructuredBuffer_S BufferBlock
- OpMemberDecorate %type_ACSBuffer_counter 0 Offset 0
- OpDecorate %type_ACSBuffer_counter BufferBlock
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
- %T = OpTypeStruct %int
- %S = OpTypeStruct %T
- %_runtimearr_S = OpTypeRuntimeArray %S
- %type_RWStructuredBuffer_S = OpTypeStruct %_runtimearr_S
- %_ptr_Uniform_type_RWStructuredBuffer_S = OpTypePointer Uniform %type_RWStructuredBuffer_S
- %type_ACSBuffer_counter = OpTypeStruct %int
- %_ptr_Uniform_type_ACSBuffer_counter = OpTypePointer Uniform %type_ACSBuffer_counter
- %void = OpTypeVoid
- %18 = OpTypeFunction %void
- %T_0 = OpTypeStruct %int
- %S_0 = OpTypeStruct %T_0
- %_ptr_Function_S_0 = OpTypePointer Function %S_0
- %_ptr_Uniform_S = OpTypePointer Uniform %S
- %_ptr_Uniform_T = OpTypePointer Uniform %T
- %22 = OpTypeFunction %T_0 %_ptr_Function_S_0
- %_ptr_Function_T_0 = OpTypePointer Function %T_0
- %A = OpVariable %_ptr_Uniform_type_RWStructuredBuffer_S Uniform
- %counter_var_A = OpVariable %_ptr_Uniform_type_ACSBuffer_counter Uniform
- %main = OpFunction %void None %18
- %24 = OpLabel
- %25 = OpVariable %_ptr_Function_T_0 Function
- %26 = OpVariable %_ptr_Function_S_0 Function
- %27 = OpAccessChain %_ptr_Uniform_S %A %int_0 %uint_0
- %28 = OpAccessChain %_ptr_Uniform_T %27 %int_0
- %29 = OpLoad %T_0 %28
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixTypeTest, FixStore) {
- const std::string text = R"(
- ; CHECK: [[ld:%\w+]] = OpLoad %T
- ; CHECK: OpStore
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %main "main"
- OpExecutionMode %main LocalSize 1 1 1
- OpSource HLSL 600
- OpName %type_RWStructuredBuffer_S "type.RWStructuredBuffer.S"
- OpName %S "S"
- OpMemberName %S 0 "t"
- OpName %T "T"
- OpMemberName %T 0 "a"
- OpName %A "A"
- OpName %type_ACSBuffer_counter "type.ACSBuffer.counter"
- OpMemberName %type_ACSBuffer_counter 0 "counter"
- OpName %counter_var_A "counter.var.A"
- OpName %main "main"
- OpName %S_0 "S"
- OpMemberName %S_0 0 "t"
- OpName %T_0 "T"
- OpMemberName %T_0 0 "a"
- OpDecorate %A DescriptorSet 0
- OpDecorate %A Binding 0
- OpDecorate %counter_var_A DescriptorSet 0
- OpDecorate %counter_var_A Binding 1
- OpMemberDecorate %T 0 Offset 0
- OpMemberDecorate %S 0 Offset 0
- OpDecorate %_runtimearr_S ArrayStride 4
- OpMemberDecorate %type_RWStructuredBuffer_S 0 Offset 0
- OpDecorate %type_RWStructuredBuffer_S BufferBlock
- OpMemberDecorate %type_ACSBuffer_counter 0 Offset 0
- OpDecorate %type_ACSBuffer_counter BufferBlock
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
- %T = OpTypeStruct %int
- %S = OpTypeStruct %T
- %_runtimearr_S = OpTypeRuntimeArray %S
- %type_RWStructuredBuffer_S = OpTypeStruct %_runtimearr_S
- %_ptr_Uniform_type_RWStructuredBuffer_S = OpTypePointer Uniform %type_RWStructuredBuffer_S
- %type_ACSBuffer_counter = OpTypeStruct %int
- %_ptr_Uniform_type_ACSBuffer_counter = OpTypePointer Uniform %type_ACSBuffer_counter
- %void = OpTypeVoid
- %18 = OpTypeFunction %void
- %T_0 = OpTypeStruct %int
- %S_0 = OpTypeStruct %T_0
- %_ptr_Function_S_0 = OpTypePointer Function %S_0
- %_ptr_Uniform_S = OpTypePointer Uniform %S
- %_ptr_Uniform_T = OpTypePointer Uniform %T
- %22 = OpTypeFunction %T_0 %_ptr_Function_S_0
- %_ptr_Function_T_0 = OpTypePointer Function %T_0
- %A = OpVariable %_ptr_Uniform_type_RWStructuredBuffer_S Uniform
- %counter_var_A = OpVariable %_ptr_Uniform_type_ACSBuffer_counter Uniform
- %main = OpFunction %void None %18
- %24 = OpLabel
- %25 = OpVariable %_ptr_Function_T_0 Function
- %26 = OpVariable %_ptr_Function_S_0 Function
- %27 = OpAccessChain %_ptr_Uniform_S %A %int_0 %uint_0
- %28 = OpAccessChain %_ptr_Uniform_T %27 %int_0
- %29 = OpLoad %T %28
- OpStore %25 %29
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixTypeTest, FixSelect) {
- const std::string text = R"(
- ; CHECK: OpSelect %_ptr_Uniform__struct_3
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "main"
- OpExecutionMode %1 LocalSize 1 1 1
- OpSource HLSL 600
- OpDecorate %2 DescriptorSet 0
- OpDecorate %2 Binding 0
- OpMemberDecorate %_struct_3 0 Offset 0
- OpDecorate %_runtimearr__struct_3 ArrayStride 4
- OpMemberDecorate %_struct_5 0 Offset 0
- OpDecorate %_struct_5 BufferBlock
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
- %uint_1 = OpConstant %uint 1
- %_struct_3 = OpTypeStruct %uint
- %_runtimearr__struct_3 = OpTypeRuntimeArray %_struct_3
- %_struct_5 = OpTypeStruct %_runtimearr__struct_3
- %_ptr_Uniform__struct_5 = OpTypePointer Uniform %_struct_5
- %void = OpTypeVoid
- %11 = OpTypeFunction %void
- %_struct_12 = OpTypeStruct %uint
- %_ptr_Function__struct_12 = OpTypePointer Function %_struct_12
- %_ptr_Uniform_uint = OpTypePointer Uniform %uint
- %bool = OpTypeBool
- %_ptr_Uniform__struct_3 = OpTypePointer Uniform %_struct_3
- %2 = OpVariable %_ptr_Uniform__struct_5 Uniform
- %1 = OpFunction %void None %11
- %17 = OpLabel
- %18 = OpAccessChain %_ptr_Uniform_uint %2 %uint_0 %uint_0 %uint_0
- %19 = OpLoad %uint %18
- %20 = OpSGreaterThan %bool %19 %uint_0
- %21 = OpAccessChain %_ptr_Uniform__struct_3 %2 %uint_0 %uint_0
- %22 = OpAccessChain %_ptr_Uniform__struct_3 %2 %uint_0 %uint_1
- %23 = OpSelect %_ptr_Function__struct_12 %20 %21 %22
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixTypeTest, FixPhiInLoop) {
- const std::string text = R"(
- ; CHECK: [[ac_init:%\w+]] = OpAccessChain %_ptr_Uniform__struct_3
- ; CHECK: [[ac_phi:%\w+]] = OpPhi %_ptr_Uniform__struct_3 [[ac_init]] {{%\w+}} [[ac_update:%\w+]] {{%\w+}}
- ; CHECK: [[ac_update]] = OpPtrAccessChain %_ptr_Uniform__struct_3 [[ac_phi]] %int_1
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "main"
- OpExecutionMode %1 LocalSize 1 1 1
- OpSource HLSL 600
- OpDecorate %2 DescriptorSet 0
- OpDecorate %2 Binding 0
- OpMemberDecorate %_struct_3 0 Offset 0
- OpDecorate %_runtimearr__struct_3 ArrayStride 4
- OpMemberDecorate %_struct_5 0 Offset 0
- OpDecorate %_struct_5 BufferBlock
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %int_1 = OpConstant %int 1
- %_struct_3 = OpTypeStruct %int
- %_struct_9 = OpTypeStruct %int
- %_runtimearr__struct_3 = OpTypeRuntimeArray %_struct_3
- %_struct_5 = OpTypeStruct %_runtimearr__struct_3
- %_ptr_Uniform__struct_5 = OpTypePointer Uniform %_struct_5
- %void = OpTypeVoid
- %12 = OpTypeFunction %void
- %bool = OpTypeBool
- %_ptr_Uniform__struct_3 = OpTypePointer Uniform %_struct_3
- %_ptr_Function__struct_9 = OpTypePointer Function %_struct_9
- %2 = OpVariable %_ptr_Uniform__struct_5 Uniform
- %1 = OpFunction %void None %12
- %16 = OpLabel
- %17 = OpAccessChain %_ptr_Uniform__struct_3 %2 %int_0 %int_0
- OpBranch %18
- %18 = OpLabel
- %20 = OpPhi %_ptr_Function__struct_9 %17 %16 %21 %22
- %23 = OpUndef %bool
- OpLoopMerge %24 %22 None
- OpBranchConditional %23 %22 %24
- %22 = OpLabel
- %21 = OpPtrAccessChain %_ptr_Function__struct_9 %20 %int_1
- OpBranch %18
- %24 = OpLabel
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, SupportsU64Index) {
- const std::string text = R"(
- ; CHECK: OpAccessChain %_ptr_Uniform_float
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "testMain" %gl_LocalInvocationID
- OpExecutionMode %1 LocalSize 8 8 1
- OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
- OpDecorate %8 DescriptorSet 0
- OpDecorate %8 Binding 0
- OpDecorate %_runtimearr_float ArrayStride 4
- OpMemberDecorate %_struct_7 0 Offset 0
- OpDecorate %_struct_7 BufferBlock
- %ulong = OpTypeInt 64 0
- %ulong_0 = OpConstant %ulong 0
- %float = OpTypeFloat 32
- %float_123 = OpConstant %float 123
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
- %_runtimearr_float = OpTypeRuntimeArray %float
- %_struct_7 = OpTypeStruct %_runtimearr_float
- %_ptr_Uniform__struct_7 = OpTypePointer Uniform %_struct_7
- %v3uint = OpTypeVector %uint 3
- %_ptr_Input_v3uint = OpTypePointer Input %v3uint
- %void = OpTypeVoid
- %30 = OpTypeFunction %void
- %_ptr_Uniform_float = OpTypePointer Uniform %float
- %8 = OpVariable %_ptr_Uniform__struct_7 Uniform
- %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
- %1 = OpFunction %void None %30
- %38 = OpLabel
- %44 = OpLoad %v3uint %gl_LocalInvocationID
- %59 = OpCompositeExtract %uint %44 0
- %60 = OpAccessChain %_ptr_Uniform_float %8 %ulong_0 %59
- OpStore %60 %float_123
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- TEST_F(FixStorageClassTest, CorrectlyProcessAccessChainOnCoopMatrix) {
- const std::string text = R"(OpCapability CooperativeMatrixKHR
- OpCapability Shader
- OpExtension "SPV_KHR_cooperative_matrix"
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "main"
- OpExecutionMode %1 LocalSize 64 1 1
- OpSource HLSL 600
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
- %uint_3 = OpConstant %uint 3
- %uint_16 = OpConstant %uint 16
- %uint_4 = OpConstant %uint 4
- %9 = OpTypeCooperativeMatrixKHR %int %uint_3 %uint_16 %uint_4 %uint_0
- %void = OpTypeVoid
- %11 = OpTypeFunction %void
- %_struct_12 = OpTypeStruct %9
- %_ptr_Function__struct_12 = OpTypePointer Function %_struct_12
- %_ptr_Function_9 = OpTypePointer Function %9
- %_ptr_Function_int = OpTypePointer Function %int
- %_ptr_Function__ptr_Function_int = OpTypePointer Function %_ptr_Function_int
- %1 = OpFunction %void None %11
- %17 = OpLabel
- %18 = OpVariable %_ptr_Function__ptr_Function_int Function
- %19 = OpVariable %_ptr_Function__struct_12 Function
- %20 = OpAccessChain %_ptr_Function_9 %19 %int_0
- %21 = OpAccessChain %_ptr_Function_int %20 %uint_4
- OpStore %18 %21
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndCheck<FixStorageClass>(text, text, false, false);
- }
- // Tests that the pass is not confused when there are multiple definitions
- // of a pointer type to the same type with the same storage class.
- TEST_F(FixStorageClassTest, DuplicatePointerType) {
- const std::string text = R"(OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "main"
- OpExecutionMode %1 LocalSize 64 1 1
- OpSource HLSL 600
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
- %uint_3 = OpConstant %uint 3
- %_arr_uint_uint_3 = OpTypeArray %uint %uint_3
- %void = OpTypeVoid
- %7 = OpTypeFunction %void
- %_struct_8 = OpTypeStruct %_arr_uint_uint_3
- %_ptr_Function__struct_8 = OpTypePointer Function %_struct_8
- %_ptr_Function_uint = OpTypePointer Function %uint
- %_ptr_Function__arr_uint_uint_3 = OpTypePointer Function %_arr_uint_uint_3
- %_ptr_Function_uint_0 = OpTypePointer Function %uint
- %_ptr_Function__ptr_Function_uint_0 = OpTypePointer Function %_ptr_Function_uint_0
- %1 = OpFunction %void None %7
- %14 = OpLabel
- %15 = OpVariable %_ptr_Function__ptr_Function_uint_0 Function
- %16 = OpVariable %_ptr_Function__struct_8 Function
- %17 = OpAccessChain %_ptr_Function__arr_uint_uint_3 %16 %uint_0
- %18 = OpAccessChain %_ptr_Function_uint_0 %17 %uint_0
- OpStore %15 %18
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndCheck<FixStorageClass>(text, text, false);
- }
- // This example is generated by DXC when certain inline spiir-v is used.
- // The intention is that the function scope variable will eventually be
- // optimized away, removing the type mismatch. We want to make sure the
- // OpCopyObject is rewritten, and that the pass does not fail.
- TEST_F(FixStorageClassTest, DoNotFailWithMismatchedPointerTypes) {
- const std::string text = R"(
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %1 "main" %38
- OpExecutionMode %1 LocalSize 64 1 1
- OpSource HLSL 600
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %uint = OpTypeInt 32 0
- %uint_64 = OpConstant %uint 64
- %_arr_float_uint_64 = OpTypeArray %float %uint_64
- %_ptr_Workgroup__arr_float_uint_64 = OpTypePointer Workgroup %_arr_float_uint_64
- %void = OpTypeVoid
- %80 = OpTypeFunction %void
- %_ptr_Workgroup_float = OpTypePointer Workgroup %float
- %_ptr_Function__ptr_Workgroup_float = OpTypePointer Function %_ptr_Workgroup_float
- %_ptr_Workgroup_float_0 = OpTypePointer Workgroup %float
- %38 = OpVariable %_ptr_Workgroup__arr_float_uint_64 Workgroup
- %1 = OpFunction %void None %80
- %98 = OpLabel
- ; CHECK: [[var:%\d+]] = OpVariable %_ptr_Function__ptr_Workgroup_float Function
- %113 = OpVariable %_ptr_Function__ptr_Workgroup_float Function
- ; CHECK: [[ac:%\d+]] = OpAccessChain %_ptr_Workgroup_float_0 {{%\d+}} %int_0
- %136 = OpAccessChain %_ptr_Workgroup_float_0 %38 %int_0
- ; Verify that the type for the OpCopyObject has changed to match [[ac]].
- ; CHECK: [[copy:%\d+]] = OpCopyObject %_ptr_Workgroup_float_0 [[ac]]
- %137 = OpCopyObject %_ptr_Workgroup_float %136
- ; This has a type mismatch, but this is because we do not have a way to copy
- ; a pointer from one type to another, so FixStorageClass cannot do anything
- ; about it. We want fix storage class to leave it as is, and the validator
- ; will report an error if the store is not remove by a later optimization.
- ; CHECK: OpStore [[var]] [[copy]]
- OpStore %113 %137
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<FixStorageClass>(text, false);
- }
- } // namespace
- } // namespace opt
- } // namespace spvtools
|