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