1fd4e5da5Sopenharmony_ci// Copyright (c) 2016 Google 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/assembly_builder.h"
16fd4e5da5Sopenharmony_ci
17fd4e5da5Sopenharmony_ci#include "test/opt/pass_fixture.h"
18fd4e5da5Sopenharmony_ci#include "test/opt/pass_utils.h"
19fd4e5da5Sopenharmony_ci
20fd4e5da5Sopenharmony_cinamespace spvtools {
21fd4e5da5Sopenharmony_cinamespace opt {
22fd4e5da5Sopenharmony_cinamespace {
23fd4e5da5Sopenharmony_ci
24fd4e5da5Sopenharmony_ciusing AssemblyBuilderTest = PassTest<::testing::Test>;
25fd4e5da5Sopenharmony_ci
26fd4e5da5Sopenharmony_ciTEST_F(AssemblyBuilderTest, MinimalShader) {
27fd4e5da5Sopenharmony_ci  AssemblyBuilder builder;
28fd4e5da5Sopenharmony_ci  std::vector<const char*> expected = {
29fd4e5da5Sopenharmony_ci      // clang-format off
30fd4e5da5Sopenharmony_ci                    "OpCapability Shader",
31fd4e5da5Sopenharmony_ci                    "OpCapability Float64",
32fd4e5da5Sopenharmony_ci               "%1 = OpExtInstImport \"GLSL.std.450\"",
33fd4e5da5Sopenharmony_ci                    "OpMemoryModel Logical GLSL450",
34fd4e5da5Sopenharmony_ci                    "OpEntryPoint Vertex %main \"main\"",
35fd4e5da5Sopenharmony_ci                    "OpName %void \"void\"",
36fd4e5da5Sopenharmony_ci                    "OpName %main_func_type \"main_func_type\"",
37fd4e5da5Sopenharmony_ci                    "OpName %main \"main\"",
38fd4e5da5Sopenharmony_ci                    "OpName %main_func_entry_block \"main_func_entry_block\"",
39fd4e5da5Sopenharmony_ci            "%void = OpTypeVoid",
40fd4e5da5Sopenharmony_ci  "%main_func_type = OpTypeFunction %void",
41fd4e5da5Sopenharmony_ci            "%main = OpFunction %void None %main_func_type",
42fd4e5da5Sopenharmony_ci"%main_func_entry_block = OpLabel",
43fd4e5da5Sopenharmony_ci                    "OpReturn",
44fd4e5da5Sopenharmony_ci                    "OpFunctionEnd",
45fd4e5da5Sopenharmony_ci      // clang-format on
46fd4e5da5Sopenharmony_ci  };
47fd4e5da5Sopenharmony_ci
48fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<NullPass>(builder.GetCode(), JoinAllInsts(expected),
49fd4e5da5Sopenharmony_ci                                  /* skip_nop = */ false);
50fd4e5da5Sopenharmony_ci}
51fd4e5da5Sopenharmony_ci
52fd4e5da5Sopenharmony_ciTEST_F(AssemblyBuilderTest, ShaderWithConstants) {
53fd4e5da5Sopenharmony_ci  AssemblyBuilder builder;
54fd4e5da5Sopenharmony_ci  builder
55fd4e5da5Sopenharmony_ci      .AppendTypesConstantsGlobals({
56fd4e5da5Sopenharmony_ci          // clang-format off
57fd4e5da5Sopenharmony_ci          "%bool = OpTypeBool",
58fd4e5da5Sopenharmony_ci      "%_PF_bool = OpTypePointer Function %bool",
59fd4e5da5Sopenharmony_ci            "%bt = OpConstantTrue %bool",
60fd4e5da5Sopenharmony_ci            "%bf = OpConstantFalse %bool",
61fd4e5da5Sopenharmony_ci           "%int = OpTypeInt 32 1",
62fd4e5da5Sopenharmony_ci       "%_PF_int = OpTypePointer Function %int",
63fd4e5da5Sopenharmony_ci            "%si = OpConstant %int 1",
64fd4e5da5Sopenharmony_ci          "%uint = OpTypeInt 32 0",
65fd4e5da5Sopenharmony_ci      "%_PF_uint = OpTypePointer Function %uint",
66fd4e5da5Sopenharmony_ci            "%ui = OpConstant %uint 2",
67fd4e5da5Sopenharmony_ci         "%float = OpTypeFloat 32",
68fd4e5da5Sopenharmony_ci     "%_PF_float = OpTypePointer Function %float",
69fd4e5da5Sopenharmony_ci             "%f = OpConstant %float 3.1415",
70fd4e5da5Sopenharmony_ci        "%double = OpTypeFloat 64",
71fd4e5da5Sopenharmony_ci    "%_PF_double = OpTypePointer Function %double",
72fd4e5da5Sopenharmony_ci             "%d = OpConstant %double 3.14159265358979",
73fd4e5da5Sopenharmony_ci          // clang-format on
74fd4e5da5Sopenharmony_ci      })
75fd4e5da5Sopenharmony_ci      .AppendInMain({
76fd4e5da5Sopenharmony_ci          // clang-format off
77fd4e5da5Sopenharmony_ci          "%btv = OpVariable %_PF_bool Function",
78fd4e5da5Sopenharmony_ci          "%bfv = OpVariable %_PF_bool Function",
79fd4e5da5Sopenharmony_ci           "%iv = OpVariable %_PF_int Function",
80fd4e5da5Sopenharmony_ci           "%uv = OpVariable %_PF_uint Function",
81fd4e5da5Sopenharmony_ci           "%fv = OpVariable %_PF_float Function",
82fd4e5da5Sopenharmony_ci           "%dv = OpVariable %_PF_double Function",
83fd4e5da5Sopenharmony_ci                 "OpStore %btv %bt",
84fd4e5da5Sopenharmony_ci                 "OpStore %bfv %bf",
85fd4e5da5Sopenharmony_ci                 "OpStore %iv %si",
86fd4e5da5Sopenharmony_ci                 "OpStore %uv %ui",
87fd4e5da5Sopenharmony_ci                 "OpStore %fv %f",
88fd4e5da5Sopenharmony_ci                 "OpStore %dv %d",
89fd4e5da5Sopenharmony_ci          // clang-format on
90fd4e5da5Sopenharmony_ci      });
91fd4e5da5Sopenharmony_ci
92fd4e5da5Sopenharmony_ci  std::vector<const char*> expected = {
93fd4e5da5Sopenharmony_ci      // clang-format off
94fd4e5da5Sopenharmony_ci                "OpCapability Shader",
95fd4e5da5Sopenharmony_ci                "OpCapability Float64",
96fd4e5da5Sopenharmony_ci           "%1 = OpExtInstImport \"GLSL.std.450\"",
97fd4e5da5Sopenharmony_ci                "OpMemoryModel Logical GLSL450",
98fd4e5da5Sopenharmony_ci                "OpEntryPoint Vertex %main \"main\"",
99fd4e5da5Sopenharmony_ci                "OpName %void \"void\"",
100fd4e5da5Sopenharmony_ci                "OpName %main_func_type \"main_func_type\"",
101fd4e5da5Sopenharmony_ci                "OpName %main \"main\"",
102fd4e5da5Sopenharmony_ci                "OpName %main_func_entry_block \"main_func_entry_block\"",
103fd4e5da5Sopenharmony_ci                "OpName %bool \"bool\"",
104fd4e5da5Sopenharmony_ci                "OpName %_PF_bool \"_PF_bool\"",
105fd4e5da5Sopenharmony_ci                "OpName %bt \"bt\"",
106fd4e5da5Sopenharmony_ci                "OpName %bf \"bf\"",
107fd4e5da5Sopenharmony_ci                "OpName %int \"int\"",
108fd4e5da5Sopenharmony_ci                "OpName %_PF_int \"_PF_int\"",
109fd4e5da5Sopenharmony_ci                "OpName %si \"si\"",
110fd4e5da5Sopenharmony_ci                "OpName %uint \"uint\"",
111fd4e5da5Sopenharmony_ci                "OpName %_PF_uint \"_PF_uint\"",
112fd4e5da5Sopenharmony_ci                "OpName %ui \"ui\"",
113fd4e5da5Sopenharmony_ci                "OpName %float \"float\"",
114fd4e5da5Sopenharmony_ci                "OpName %_PF_float \"_PF_float\"",
115fd4e5da5Sopenharmony_ci                "OpName %f \"f\"",
116fd4e5da5Sopenharmony_ci                "OpName %double \"double\"",
117fd4e5da5Sopenharmony_ci                "OpName %_PF_double \"_PF_double\"",
118fd4e5da5Sopenharmony_ci                "OpName %d \"d\"",
119fd4e5da5Sopenharmony_ci                "OpName %btv \"btv\"",
120fd4e5da5Sopenharmony_ci                "OpName %bfv \"bfv\"",
121fd4e5da5Sopenharmony_ci                "OpName %iv \"iv\"",
122fd4e5da5Sopenharmony_ci                "OpName %uv \"uv\"",
123fd4e5da5Sopenharmony_ci                "OpName %fv \"fv\"",
124fd4e5da5Sopenharmony_ci                "OpName %dv \"dv\"",
125fd4e5da5Sopenharmony_ci        "%void = OpTypeVoid",
126fd4e5da5Sopenharmony_ci"%main_func_type = OpTypeFunction %void",
127fd4e5da5Sopenharmony_ci        "%bool = OpTypeBool",
128fd4e5da5Sopenharmony_ci "%_PF_bool = OpTypePointer Function %bool",
129fd4e5da5Sopenharmony_ci          "%bt = OpConstantTrue %bool",
130fd4e5da5Sopenharmony_ci          "%bf = OpConstantFalse %bool",
131fd4e5da5Sopenharmony_ci         "%int = OpTypeInt 32 1",
132fd4e5da5Sopenharmony_ci     "%_PF_int = OpTypePointer Function %int",
133fd4e5da5Sopenharmony_ci          "%si = OpConstant %int 1",
134fd4e5da5Sopenharmony_ci        "%uint = OpTypeInt 32 0",
135fd4e5da5Sopenharmony_ci    "%_PF_uint = OpTypePointer Function %uint",
136fd4e5da5Sopenharmony_ci          "%ui = OpConstant %uint 2",
137fd4e5da5Sopenharmony_ci       "%float = OpTypeFloat 32",
138fd4e5da5Sopenharmony_ci   "%_PF_float = OpTypePointer Function %float",
139fd4e5da5Sopenharmony_ci           "%f = OpConstant %float 3.1415",
140fd4e5da5Sopenharmony_ci      "%double = OpTypeFloat 64",
141fd4e5da5Sopenharmony_ci  "%_PF_double = OpTypePointer Function %double",
142fd4e5da5Sopenharmony_ci           "%d = OpConstant %double 3.14159265358979",
143fd4e5da5Sopenharmony_ci        "%main = OpFunction %void None %main_func_type",
144fd4e5da5Sopenharmony_ci"%main_func_entry_block = OpLabel",
145fd4e5da5Sopenharmony_ci         "%btv = OpVariable %_PF_bool Function",
146fd4e5da5Sopenharmony_ci         "%bfv = OpVariable %_PF_bool Function",
147fd4e5da5Sopenharmony_ci          "%iv = OpVariable %_PF_int Function",
148fd4e5da5Sopenharmony_ci          "%uv = OpVariable %_PF_uint Function",
149fd4e5da5Sopenharmony_ci          "%fv = OpVariable %_PF_float Function",
150fd4e5da5Sopenharmony_ci          "%dv = OpVariable %_PF_double Function",
151fd4e5da5Sopenharmony_ci                "OpStore %btv %bt",
152fd4e5da5Sopenharmony_ci                "OpStore %bfv %bf",
153fd4e5da5Sopenharmony_ci                "OpStore %iv %si",
154fd4e5da5Sopenharmony_ci                "OpStore %uv %ui",
155fd4e5da5Sopenharmony_ci                "OpStore %fv %f",
156fd4e5da5Sopenharmony_ci                "OpStore %dv %d",
157fd4e5da5Sopenharmony_ci                "OpReturn",
158fd4e5da5Sopenharmony_ci                "OpFunctionEnd",
159fd4e5da5Sopenharmony_ci      // clang-format on
160fd4e5da5Sopenharmony_ci  };
161fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<NullPass>(builder.GetCode(), JoinAllInsts(expected),
162fd4e5da5Sopenharmony_ci                                  /* skip_nop = */ false);
163fd4e5da5Sopenharmony_ci}
164fd4e5da5Sopenharmony_ci
165fd4e5da5Sopenharmony_ciTEST_F(AssemblyBuilderTest, SpecConstants) {
166fd4e5da5Sopenharmony_ci  AssemblyBuilder builder;
167fd4e5da5Sopenharmony_ci  builder.AppendTypesConstantsGlobals({
168fd4e5da5Sopenharmony_ci      "%bool = OpTypeBool",
169fd4e5da5Sopenharmony_ci      "%uint = OpTypeInt 32 0",
170fd4e5da5Sopenharmony_ci      "%int = OpTypeInt 32 1",
171fd4e5da5Sopenharmony_ci      "%float = OpTypeFloat 32",
172fd4e5da5Sopenharmony_ci      "%double = OpTypeFloat 64",
173fd4e5da5Sopenharmony_ci      "%v2int = OpTypeVector %int 2",
174fd4e5da5Sopenharmony_ci
175fd4e5da5Sopenharmony_ci      "%spec_true = OpSpecConstantTrue %bool",
176fd4e5da5Sopenharmony_ci      "%spec_false = OpSpecConstantFalse %bool",
177fd4e5da5Sopenharmony_ci      "%spec_uint = OpSpecConstant %uint 1",
178fd4e5da5Sopenharmony_ci      "%spec_int = OpSpecConstant %int 1",
179fd4e5da5Sopenharmony_ci      "%spec_float = OpSpecConstant %float 1.25",
180fd4e5da5Sopenharmony_ci      "%spec_double = OpSpecConstant %double 1.2345678",
181fd4e5da5Sopenharmony_ci
182fd4e5da5Sopenharmony_ci      // Spec constants defined below should not have SpecID.
183fd4e5da5Sopenharmony_ci      "%spec_add_op = OpSpecConstantOp %int IAdd %spec_int %spec_int",
184fd4e5da5Sopenharmony_ci      "%spec_vec = OpSpecConstantComposite %v2int %spec_int %spec_int",
185fd4e5da5Sopenharmony_ci      "%spec_vec_x = OpSpecConstantOp %int CompositeExtract %spec_vec 0",
186fd4e5da5Sopenharmony_ci  });
187fd4e5da5Sopenharmony_ci  std::vector<const char*> expected = {
188fd4e5da5Sopenharmony_ci      // clang-format off
189fd4e5da5Sopenharmony_ci                    "OpCapability Shader",
190fd4e5da5Sopenharmony_ci                    "OpCapability Float64",
191fd4e5da5Sopenharmony_ci               "%1 = OpExtInstImport \"GLSL.std.450\"",
192fd4e5da5Sopenharmony_ci                    "OpMemoryModel Logical GLSL450",
193fd4e5da5Sopenharmony_ci                    "OpEntryPoint Vertex %main \"main\"",
194fd4e5da5Sopenharmony_ci                    "OpName %void \"void\"",
195fd4e5da5Sopenharmony_ci                    "OpName %main_func_type \"main_func_type\"",
196fd4e5da5Sopenharmony_ci                    "OpName %main \"main\"",
197fd4e5da5Sopenharmony_ci                    "OpName %main_func_entry_block \"main_func_entry_block\"",
198fd4e5da5Sopenharmony_ci                    "OpName %bool \"bool\"",
199fd4e5da5Sopenharmony_ci                    "OpName %uint \"uint\"",
200fd4e5da5Sopenharmony_ci                    "OpName %int \"int\"",
201fd4e5da5Sopenharmony_ci                    "OpName %float \"float\"",
202fd4e5da5Sopenharmony_ci                    "OpName %double \"double\"",
203fd4e5da5Sopenharmony_ci                    "OpName %v2int \"v2int\"",
204fd4e5da5Sopenharmony_ci                    "OpName %spec_true \"spec_true\"",
205fd4e5da5Sopenharmony_ci                    "OpName %spec_false \"spec_false\"",
206fd4e5da5Sopenharmony_ci                    "OpName %spec_uint \"spec_uint\"",
207fd4e5da5Sopenharmony_ci                    "OpName %spec_int \"spec_int\"",
208fd4e5da5Sopenharmony_ci                    "OpName %spec_float \"spec_float\"",
209fd4e5da5Sopenharmony_ci                    "OpName %spec_double \"spec_double\"",
210fd4e5da5Sopenharmony_ci                    "OpName %spec_add_op \"spec_add_op\"",
211fd4e5da5Sopenharmony_ci                    "OpName %spec_vec \"spec_vec\"",
212fd4e5da5Sopenharmony_ci                    "OpName %spec_vec_x \"spec_vec_x\"",
213fd4e5da5Sopenharmony_ci                    "OpDecorate %spec_true SpecId 200",
214fd4e5da5Sopenharmony_ci                    "OpDecorate %spec_false SpecId 201",
215fd4e5da5Sopenharmony_ci                    "OpDecorate %spec_uint SpecId 202",
216fd4e5da5Sopenharmony_ci                    "OpDecorate %spec_int SpecId 203",
217fd4e5da5Sopenharmony_ci                    "OpDecorate %spec_float SpecId 204",
218fd4e5da5Sopenharmony_ci                    "OpDecorate %spec_double SpecId 205",
219fd4e5da5Sopenharmony_ci            "%void = OpTypeVoid",
220fd4e5da5Sopenharmony_ci  "%main_func_type = OpTypeFunction %void",
221fd4e5da5Sopenharmony_ci            "%bool = OpTypeBool",
222fd4e5da5Sopenharmony_ci            "%uint = OpTypeInt 32 0",
223fd4e5da5Sopenharmony_ci             "%int = OpTypeInt 32 1",
224fd4e5da5Sopenharmony_ci           "%float = OpTypeFloat 32",
225fd4e5da5Sopenharmony_ci          "%double = OpTypeFloat 64",
226fd4e5da5Sopenharmony_ci           "%v2int = OpTypeVector %int 2",
227fd4e5da5Sopenharmony_ci       "%spec_true = OpSpecConstantTrue %bool",
228fd4e5da5Sopenharmony_ci      "%spec_false = OpSpecConstantFalse %bool",
229fd4e5da5Sopenharmony_ci       "%spec_uint = OpSpecConstant %uint 1",
230fd4e5da5Sopenharmony_ci        "%spec_int = OpSpecConstant %int 1",
231fd4e5da5Sopenharmony_ci      "%spec_float = OpSpecConstant %float 1.25",
232fd4e5da5Sopenharmony_ci     "%spec_double = OpSpecConstant %double 1.2345678",
233fd4e5da5Sopenharmony_ci     "%spec_add_op = OpSpecConstantOp %int IAdd %spec_int %spec_int",
234fd4e5da5Sopenharmony_ci        "%spec_vec = OpSpecConstantComposite %v2int %spec_int %spec_int",
235fd4e5da5Sopenharmony_ci      "%spec_vec_x = OpSpecConstantOp %int CompositeExtract %spec_vec 0",
236fd4e5da5Sopenharmony_ci            "%main = OpFunction %void None %main_func_type",
237fd4e5da5Sopenharmony_ci"%main_func_entry_block = OpLabel",
238fd4e5da5Sopenharmony_ci                    "OpReturn",
239fd4e5da5Sopenharmony_ci                    "OpFunctionEnd",
240fd4e5da5Sopenharmony_ci
241fd4e5da5Sopenharmony_ci      // clang-format on
242fd4e5da5Sopenharmony_ci  };
243fd4e5da5Sopenharmony_ci
244fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<NullPass>(builder.GetCode(), JoinAllInsts(expected),
245fd4e5da5Sopenharmony_ci                                  /* skip_nop = */ false);
246fd4e5da5Sopenharmony_ci}
247fd4e5da5Sopenharmony_ci
248fd4e5da5Sopenharmony_ciTEST_F(AssemblyBuilderTest, AppendNames) {
249fd4e5da5Sopenharmony_ci  AssemblyBuilder builder;
250fd4e5da5Sopenharmony_ci  builder.AppendNames({
251fd4e5da5Sopenharmony_ci      "OpName %void \"another_name_for_void\"",
252fd4e5da5Sopenharmony_ci      "I am an invalid OpName instruction and should not be added",
253fd4e5da5Sopenharmony_ci      "OpName %main \"another name for main\"",
254fd4e5da5Sopenharmony_ci  });
255fd4e5da5Sopenharmony_ci  std::vector<const char*> expected = {
256fd4e5da5Sopenharmony_ci      // clang-format off
257fd4e5da5Sopenharmony_ci                    "OpCapability Shader",
258fd4e5da5Sopenharmony_ci                    "OpCapability Float64",
259fd4e5da5Sopenharmony_ci               "%1 = OpExtInstImport \"GLSL.std.450\"",
260fd4e5da5Sopenharmony_ci                    "OpMemoryModel Logical GLSL450",
261fd4e5da5Sopenharmony_ci                    "OpEntryPoint Vertex %main \"main\"",
262fd4e5da5Sopenharmony_ci                    "OpName %void \"void\"",
263fd4e5da5Sopenharmony_ci                    "OpName %main_func_type \"main_func_type\"",
264fd4e5da5Sopenharmony_ci                    "OpName %main \"main\"",
265fd4e5da5Sopenharmony_ci                    "OpName %main_func_entry_block \"main_func_entry_block\"",
266fd4e5da5Sopenharmony_ci                    "OpName %void \"another_name_for_void\"",
267fd4e5da5Sopenharmony_ci                    "OpName %main \"another name for main\"",
268fd4e5da5Sopenharmony_ci            "%void = OpTypeVoid",
269fd4e5da5Sopenharmony_ci  "%main_func_type = OpTypeFunction %void",
270fd4e5da5Sopenharmony_ci            "%main = OpFunction %void None %main_func_type",
271fd4e5da5Sopenharmony_ci"%main_func_entry_block = OpLabel",
272fd4e5da5Sopenharmony_ci                    "OpReturn",
273fd4e5da5Sopenharmony_ci                    "OpFunctionEnd",
274fd4e5da5Sopenharmony_ci      // clang-format on
275fd4e5da5Sopenharmony_ci  };
276fd4e5da5Sopenharmony_ci
277fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<NullPass>(builder.GetCode(), JoinAllInsts(expected),
278fd4e5da5Sopenharmony_ci                                  /* skip_nop = */ false);
279fd4e5da5Sopenharmony_ci}
280fd4e5da5Sopenharmony_ci
281fd4e5da5Sopenharmony_ci}  // namespace
282fd4e5da5Sopenharmony_ci}  // namespace opt
283fd4e5da5Sopenharmony_ci}  // namespace spvtools
284