1fd4e5da5Sopenharmony_ci// Copyright (c) 2022 Advanced Micro Devices, Inc. 2fd4e5da5Sopenharmony_ci// 3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License. 5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at 6fd4e5da5Sopenharmony_ci// 7fd4e5da5Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8fd4e5da5Sopenharmony_ci// 9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and 13fd4e5da5Sopenharmony_ci// limitations under the License. 14fd4e5da5Sopenharmony_ci 15fd4e5da5Sopenharmony_ci#include "test/opt/pass_fixture.h" 16fd4e5da5Sopenharmony_ci#include "test/opt/pass_utils.h" 17fd4e5da5Sopenharmony_ci 18fd4e5da5Sopenharmony_cinamespace spvtools { 19fd4e5da5Sopenharmony_cinamespace opt { 20fd4e5da5Sopenharmony_cinamespace { 21fd4e5da5Sopenharmony_ci 22fd4e5da5Sopenharmony_ciusing FixFuncCallArgumentsTest = PassTest<::testing::Test>; 23fd4e5da5Sopenharmony_ciTEST_F(FixFuncCallArgumentsTest, Simple) { 24fd4e5da5Sopenharmony_ci const std::string text = R"( 25fd4e5da5Sopenharmony_ci; 26fd4e5da5Sopenharmony_ci; CHECK: [[v0:%\w+]] = OpVariable %_ptr_Function_float Function 27fd4e5da5Sopenharmony_ci; CHECK: [[v1:%\w+]] = OpVariable %_ptr_Function_float Function 28fd4e5da5Sopenharmony_ci; CHECK: [[v2:%\w+]] = OpVariable %_ptr_Function_T Function 29fd4e5da5Sopenharmony_ci; CHECK: [[ac0:%\w+]] = OpAccessChain %_ptr_Function_float %t %int_0 30fd4e5da5Sopenharmony_ci; CHECK: [[ac1:%\w+]] = OpAccessChain %_ptr_Uniform_float %r1 %int_0 %uint_0 31fd4e5da5Sopenharmony_ci; CHECK: [[ld0:%\w+]] = OpLoad %float [[ac0]] 32fd4e5da5Sopenharmony_ci; CHECK: OpStore [[v1]] [[ld0]] 33fd4e5da5Sopenharmony_ci; CHECK: [[ld1:%\w+]] = OpLoad %float [[ac1]] 34fd4e5da5Sopenharmony_ci; CHECK: OpStore [[v0]] [[ld1]] 35fd4e5da5Sopenharmony_ci; CHECK: [[func:%\w+]] = OpFunctionCall %void %fn [[v1]] [[v0]] 36fd4e5da5Sopenharmony_ci; CHECK: [[ld2:%\w+]] = OpLoad %float [[v0]] 37fd4e5da5Sopenharmony_ci; CHECK: OpStore [[ac1]] [[ld2]] 38fd4e5da5Sopenharmony_ci; CHECK: [[ld3:%\w+]] = OpLoad %float [[v1]] 39fd4e5da5Sopenharmony_ci; CHECK: OpStore [[ac0]] [[ld3]] 40fd4e5da5Sopenharmony_ci; 41fd4e5da5Sopenharmony_ciOpCapability Shader 42fd4e5da5Sopenharmony_ciOpCapability Linkage 43fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 44fd4e5da5Sopenharmony_ciOpSource HLSL 630 45fd4e5da5Sopenharmony_ciOpName %type_RWStructuredBuffer_float "type.RWStructuredBuffer.float" 46fd4e5da5Sopenharmony_ciOpName %r1 "r1" 47fd4e5da5Sopenharmony_ciOpName %type_ACSBuffer_counter "type.ACSBuffer.counter" 48fd4e5da5Sopenharmony_ciOpMemberName %type_ACSBuffer_counter 0 "counter" 49fd4e5da5Sopenharmony_ciOpName %counter_var_r1 "counter.var.r1" 50fd4e5da5Sopenharmony_ciOpName %main "main" 51fd4e5da5Sopenharmony_ciOpName %bb_entry "bb.entry" 52fd4e5da5Sopenharmony_ciOpName %T "T" 53fd4e5da5Sopenharmony_ciOpMemberName %T 0 "t0" 54fd4e5da5Sopenharmony_ciOpName %t "t" 55fd4e5da5Sopenharmony_ciOpName %fn "fn" 56fd4e5da5Sopenharmony_ciOpName %p0 "p0" 57fd4e5da5Sopenharmony_ciOpName %p2 "p2" 58fd4e5da5Sopenharmony_ciOpName %bb_entry_0 "bb.entry" 59fd4e5da5Sopenharmony_ciOpDecorate %main LinkageAttributes "main" Export 60fd4e5da5Sopenharmony_ciOpDecorate %r1 DescriptorSet 0 61fd4e5da5Sopenharmony_ciOpDecorate %r1 Binding 0 62fd4e5da5Sopenharmony_ciOpDecorate %counter_var_r1 DescriptorSet 0 63fd4e5da5Sopenharmony_ciOpDecorate %counter_var_r1 Binding 1 64fd4e5da5Sopenharmony_ciOpDecorate %_runtimearr_float ArrayStride 4 65fd4e5da5Sopenharmony_ciOpMemberDecorate %type_RWStructuredBuffer_float 0 Offset 0 66fd4e5da5Sopenharmony_ciOpDecorate %type_RWStructuredBuffer_float BufferBlock 67fd4e5da5Sopenharmony_ciOpMemberDecorate %type_ACSBuffer_counter 0 Offset 0 68fd4e5da5Sopenharmony_ciOpDecorate %type_ACSBuffer_counter BufferBlock 69fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 1 70fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 71fd4e5da5Sopenharmony_ci%uint = OpTypeInt 32 0 72fd4e5da5Sopenharmony_ci%uint_0 = OpConstant %uint 0 73fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 74fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 75fd4e5da5Sopenharmony_ci%_runtimearr_float = OpTypeRuntimeArray %float 76fd4e5da5Sopenharmony_ci%type_RWStructuredBuffer_float = OpTypeStruct %_runtimearr_float 77fd4e5da5Sopenharmony_ci%_ptr_Uniform_type_RWStructuredBuffer_float = OpTypePointer Uniform %type_RWStructuredBuffer_float 78fd4e5da5Sopenharmony_ci%type_ACSBuffer_counter = OpTypeStruct %int 79fd4e5da5Sopenharmony_ci%_ptr_Uniform_type_ACSBuffer_counter = OpTypePointer Uniform %type_ACSBuffer_counter 80fd4e5da5Sopenharmony_ci%15 = OpTypeFunction %int 81fd4e5da5Sopenharmony_ci%T = OpTypeStruct %float 82fd4e5da5Sopenharmony_ci%_ptr_Function_T = OpTypePointer Function %T 83fd4e5da5Sopenharmony_ci%_ptr_Function_float = OpTypePointer Function %float 84fd4e5da5Sopenharmony_ci%_ptr_Uniform_float = OpTypePointer Uniform %float 85fd4e5da5Sopenharmony_ci%void = OpTypeVoid 86fd4e5da5Sopenharmony_ci%27 = OpTypeFunction %void %_ptr_Function_float %_ptr_Function_float 87fd4e5da5Sopenharmony_ci%r1 = OpVariable %_ptr_Uniform_type_RWStructuredBuffer_float Uniform 88fd4e5da5Sopenharmony_ci%counter_var_r1 = OpVariable %_ptr_Uniform_type_ACSBuffer_counter Uniform 89fd4e5da5Sopenharmony_ci%main = OpFunction %int None %15 90fd4e5da5Sopenharmony_ci%bb_entry = OpLabel 91fd4e5da5Sopenharmony_ci%t = OpVariable %_ptr_Function_T Function 92fd4e5da5Sopenharmony_ci%21 = OpAccessChain %_ptr_Function_float %t %int_0 93fd4e5da5Sopenharmony_ci%23 = OpAccessChain %_ptr_Uniform_float %r1 %int_0 %uint_0 94fd4e5da5Sopenharmony_ci%25 = OpFunctionCall %void %fn %21 %23 95fd4e5da5Sopenharmony_ciOpReturnValue %int_1 96fd4e5da5Sopenharmony_ciOpFunctionEnd 97fd4e5da5Sopenharmony_ci%fn = OpFunction %void DontInline %27 98fd4e5da5Sopenharmony_ci%p0 = OpFunctionParameter %_ptr_Function_float 99fd4e5da5Sopenharmony_ci%p2 = OpFunctionParameter %_ptr_Function_float 100fd4e5da5Sopenharmony_ci%bb_entry_0 = OpLabel 101fd4e5da5Sopenharmony_ciOpReturn 102fd4e5da5Sopenharmony_ciOpFunctionEnd 103fd4e5da5Sopenharmony_ci)"; 104fd4e5da5Sopenharmony_ci 105fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<FixFuncCallArgumentsPass>(text, true); 106fd4e5da5Sopenharmony_ci} 107fd4e5da5Sopenharmony_ci 108fd4e5da5Sopenharmony_ciTEST_F(FixFuncCallArgumentsTest, NotAccessChainInput) { 109fd4e5da5Sopenharmony_ci const std::string text = R"( 110fd4e5da5Sopenharmony_ci; 111fd4e5da5Sopenharmony_ci; CHECK: [[o:%\w+]] = OpCopyObject %_ptr_Function_float %t 112fd4e5da5Sopenharmony_ci; CHECK: [[func:%\w+]] = OpFunctionCall %void %fn [[o]] 113fd4e5da5Sopenharmony_ci; 114fd4e5da5Sopenharmony_ciOpCapability Shader 115fd4e5da5Sopenharmony_ciOpCapability Linkage 116fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 117fd4e5da5Sopenharmony_ciOpSource HLSL 630 118fd4e5da5Sopenharmony_ciOpName %main "main" 119fd4e5da5Sopenharmony_ciOpName %bb_entry "bb.entry" 120fd4e5da5Sopenharmony_ciOpName %t "t" 121fd4e5da5Sopenharmony_ciOpName %fn "fn" 122fd4e5da5Sopenharmony_ciOpName %p0 "p0" 123fd4e5da5Sopenharmony_ciOpName %bb_entry_0 "bb.entry" 124fd4e5da5Sopenharmony_ciOpDecorate %main LinkageAttributes "main" Export 125fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 1 126fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 127fd4e5da5Sopenharmony_ci%4 = OpTypeFunction %int 128fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 129fd4e5da5Sopenharmony_ci%_ptr_Function_float = OpTypePointer Function %float 130fd4e5da5Sopenharmony_ci%void = OpTypeVoid 131fd4e5da5Sopenharmony_ci%12 = OpTypeFunction %void %_ptr_Function_float 132fd4e5da5Sopenharmony_ci%main = OpFunction %int None %4 133fd4e5da5Sopenharmony_ci%bb_entry = OpLabel 134fd4e5da5Sopenharmony_ci%t = OpVariable %_ptr_Function_float Function 135fd4e5da5Sopenharmony_ci%t1 = OpCopyObject %_ptr_Function_float %t 136fd4e5da5Sopenharmony_ci%10 = OpFunctionCall %void %fn %t1 137fd4e5da5Sopenharmony_ciOpReturnValue %int_1 138fd4e5da5Sopenharmony_ciOpFunctionEnd 139fd4e5da5Sopenharmony_ci%fn = OpFunction %void DontInline %12 140fd4e5da5Sopenharmony_ci%p0 = OpFunctionParameter %_ptr_Function_float 141fd4e5da5Sopenharmony_ci%bb_entry_0 = OpLabel 142fd4e5da5Sopenharmony_ciOpReturn 143fd4e5da5Sopenharmony_ciOpFunctionEnd 144fd4e5da5Sopenharmony_ci)"; 145fd4e5da5Sopenharmony_ci 146fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<FixFuncCallArgumentsPass>(text, false); 147fd4e5da5Sopenharmony_ci} 148fd4e5da5Sopenharmony_ci 149fd4e5da5Sopenharmony_ci} // namespace 150fd4e5da5Sopenharmony_ci} // namespace opt 151fd4e5da5Sopenharmony_ci} // namespace spvtools