1fd4e5da5Sopenharmony_ci// Copyright (c) 2017 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// Tests for unique type declaration rules validator.
16fd4e5da5Sopenharmony_ci
17fd4e5da5Sopenharmony_ci#include <string>
18fd4e5da5Sopenharmony_ci
19fd4e5da5Sopenharmony_ci#include "gmock/gmock.h"
20fd4e5da5Sopenharmony_ci#include "test/unit_spirv.h"
21fd4e5da5Sopenharmony_ci#include "test/val/val_fixtures.h"
22fd4e5da5Sopenharmony_ci
23fd4e5da5Sopenharmony_cinamespace spvtools {
24fd4e5da5Sopenharmony_cinamespace val {
25fd4e5da5Sopenharmony_cinamespace {
26fd4e5da5Sopenharmony_ci
27fd4e5da5Sopenharmony_ciusing ::testing::Eq;
28fd4e5da5Sopenharmony_ciusing ::testing::HasSubstr;
29fd4e5da5Sopenharmony_ciusing ::testing::Not;
30fd4e5da5Sopenharmony_ci
31fd4e5da5Sopenharmony_ciusing ValidateLogicals = spvtest::ValidateBase<bool>;
32fd4e5da5Sopenharmony_ci
33fd4e5da5Sopenharmony_cistd::string GenerateShaderCode(
34fd4e5da5Sopenharmony_ci    const std::string& body,
35fd4e5da5Sopenharmony_ci    const std::string& capabilities_and_extensions = "") {
36fd4e5da5Sopenharmony_ci  const std::string capabilities =
37fd4e5da5Sopenharmony_ci      R"(
38fd4e5da5Sopenharmony_ciOpCapability Shader
39fd4e5da5Sopenharmony_ciOpCapability Int64
40fd4e5da5Sopenharmony_ciOpCapability Float64)";
41fd4e5da5Sopenharmony_ci
42fd4e5da5Sopenharmony_ci  const std::string after_extension_before_body =
43fd4e5da5Sopenharmony_ci      R"(
44fd4e5da5Sopenharmony_ci%ext_inst = OpExtInstImport "GLSL.std.450"
45fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
46fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %main "main"
47fd4e5da5Sopenharmony_ciOpExecutionMode %main OriginUpperLeft
48fd4e5da5Sopenharmony_ci%void = OpTypeVoid
49fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void
50fd4e5da5Sopenharmony_ci%bool = OpTypeBool
51fd4e5da5Sopenharmony_ci%f32 = OpTypeFloat 32
52fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0
53fd4e5da5Sopenharmony_ci%s32 = OpTypeInt 32 1
54fd4e5da5Sopenharmony_ci%f64 = OpTypeFloat 64
55fd4e5da5Sopenharmony_ci%u64 = OpTypeInt 64 0
56fd4e5da5Sopenharmony_ci%s64 = OpTypeInt 64 1
57fd4e5da5Sopenharmony_ci%boolvec2 = OpTypeVector %bool 2
58fd4e5da5Sopenharmony_ci%s32vec2 = OpTypeVector %s32 2
59fd4e5da5Sopenharmony_ci%u32vec2 = OpTypeVector %u32 2
60fd4e5da5Sopenharmony_ci%u64vec2 = OpTypeVector %u64 2
61fd4e5da5Sopenharmony_ci%f32vec2 = OpTypeVector %f32 2
62fd4e5da5Sopenharmony_ci%f64vec2 = OpTypeVector %f64 2
63fd4e5da5Sopenharmony_ci%boolvec3 = OpTypeVector %bool 3
64fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3
65fd4e5da5Sopenharmony_ci%u64vec3 = OpTypeVector %u64 3
66fd4e5da5Sopenharmony_ci%s32vec3 = OpTypeVector %s32 3
67fd4e5da5Sopenharmony_ci%f32vec3 = OpTypeVector %f32 3
68fd4e5da5Sopenharmony_ci%f64vec3 = OpTypeVector %f64 3
69fd4e5da5Sopenharmony_ci%boolvec4 = OpTypeVector %bool 4
70fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4
71fd4e5da5Sopenharmony_ci%u64vec4 = OpTypeVector %u64 4
72fd4e5da5Sopenharmony_ci%s32vec4 = OpTypeVector %s32 4
73fd4e5da5Sopenharmony_ci%f32vec4 = OpTypeVector %f32 4
74fd4e5da5Sopenharmony_ci%f64vec4 = OpTypeVector %f64 4
75fd4e5da5Sopenharmony_ci
76fd4e5da5Sopenharmony_ci%f32_0 = OpConstant %f32 0
77fd4e5da5Sopenharmony_ci%f32_1 = OpConstant %f32 1
78fd4e5da5Sopenharmony_ci%f32_2 = OpConstant %f32 2
79fd4e5da5Sopenharmony_ci%f32_3 = OpConstant %f32 3
80fd4e5da5Sopenharmony_ci%f32_4 = OpConstant %f32 4
81fd4e5da5Sopenharmony_ci
82fd4e5da5Sopenharmony_ci%s32_0 = OpConstant %s32 0
83fd4e5da5Sopenharmony_ci%s32_1 = OpConstant %s32 1
84fd4e5da5Sopenharmony_ci%s32_2 = OpConstant %s32 2
85fd4e5da5Sopenharmony_ci%s32_3 = OpConstant %s32 3
86fd4e5da5Sopenharmony_ci%s32_4 = OpConstant %s32 4
87fd4e5da5Sopenharmony_ci%s32_m1 = OpConstant %s32 -1
88fd4e5da5Sopenharmony_ci
89fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0
90fd4e5da5Sopenharmony_ci%u32_1 = OpConstant %u32 1
91fd4e5da5Sopenharmony_ci%u32_2 = OpConstant %u32 2
92fd4e5da5Sopenharmony_ci%u32_3 = OpConstant %u32 3
93fd4e5da5Sopenharmony_ci%u32_4 = OpConstant %u32 4
94fd4e5da5Sopenharmony_ci
95fd4e5da5Sopenharmony_ci%f64_0 = OpConstant %f64 0
96fd4e5da5Sopenharmony_ci%f64_1 = OpConstant %f64 1
97fd4e5da5Sopenharmony_ci%f64_2 = OpConstant %f64 2
98fd4e5da5Sopenharmony_ci%f64_3 = OpConstant %f64 3
99fd4e5da5Sopenharmony_ci%f64_4 = OpConstant %f64 4
100fd4e5da5Sopenharmony_ci
101fd4e5da5Sopenharmony_ci%s64_0 = OpConstant %s64 0
102fd4e5da5Sopenharmony_ci%s64_1 = OpConstant %s64 1
103fd4e5da5Sopenharmony_ci%s64_2 = OpConstant %s64 2
104fd4e5da5Sopenharmony_ci%s64_3 = OpConstant %s64 3
105fd4e5da5Sopenharmony_ci%s64_4 = OpConstant %s64 4
106fd4e5da5Sopenharmony_ci%s64_m1 = OpConstant %s64 -1
107fd4e5da5Sopenharmony_ci
108fd4e5da5Sopenharmony_ci%u64_0 = OpConstant %u64 0
109fd4e5da5Sopenharmony_ci%u64_1 = OpConstant %u64 1
110fd4e5da5Sopenharmony_ci%u64_2 = OpConstant %u64 2
111fd4e5da5Sopenharmony_ci%u64_3 = OpConstant %u64 3
112fd4e5da5Sopenharmony_ci%u64_4 = OpConstant %u64 4
113fd4e5da5Sopenharmony_ci
114fd4e5da5Sopenharmony_ci%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1
115fd4e5da5Sopenharmony_ci%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2
116fd4e5da5Sopenharmony_ci%u32vec3_012 = OpConstantComposite %u32vec3 %u32_0 %u32_1 %u32_2
117fd4e5da5Sopenharmony_ci%u32vec3_123 = OpConstantComposite %u32vec3 %u32_1 %u32_2 %u32_3
118fd4e5da5Sopenharmony_ci%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3
119fd4e5da5Sopenharmony_ci%u32vec4_1234 = OpConstantComposite %u32vec4 %u32_1 %u32_2 %u32_3 %u32_4
120fd4e5da5Sopenharmony_ci
121fd4e5da5Sopenharmony_ci%s32vec2_01 = OpConstantComposite %s32vec2 %s32_0 %s32_1
122fd4e5da5Sopenharmony_ci%s32vec2_12 = OpConstantComposite %s32vec2 %s32_1 %s32_2
123fd4e5da5Sopenharmony_ci%s32vec3_012 = OpConstantComposite %s32vec3 %s32_0 %s32_1 %s32_2
124fd4e5da5Sopenharmony_ci%s32vec3_123 = OpConstantComposite %s32vec3 %s32_1 %s32_2 %s32_3
125fd4e5da5Sopenharmony_ci%s32vec4_0123 = OpConstantComposite %s32vec4 %s32_0 %s32_1 %s32_2 %s32_3
126fd4e5da5Sopenharmony_ci%s32vec4_1234 = OpConstantComposite %s32vec4 %s32_1 %s32_2 %s32_3 %s32_4
127fd4e5da5Sopenharmony_ci
128fd4e5da5Sopenharmony_ci%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1
129fd4e5da5Sopenharmony_ci%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2
130fd4e5da5Sopenharmony_ci%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2
131fd4e5da5Sopenharmony_ci%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3
132fd4e5da5Sopenharmony_ci%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3
133fd4e5da5Sopenharmony_ci%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4
134fd4e5da5Sopenharmony_ci
135fd4e5da5Sopenharmony_ci%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1
136fd4e5da5Sopenharmony_ci%f64vec2_12 = OpConstantComposite %f64vec2 %f64_1 %f64_2
137fd4e5da5Sopenharmony_ci%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2
138fd4e5da5Sopenharmony_ci%f64vec3_123 = OpConstantComposite %f64vec3 %f64_1 %f64_2 %f64_3
139fd4e5da5Sopenharmony_ci%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3
140fd4e5da5Sopenharmony_ci%f64vec4_1234 = OpConstantComposite %f64vec4 %f64_1 %f64_2 %f64_3 %f64_4
141fd4e5da5Sopenharmony_ci
142fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool
143fd4e5da5Sopenharmony_ci%false = OpConstantFalse %bool
144fd4e5da5Sopenharmony_ci%boolvec2_tf = OpConstantComposite %boolvec2 %true %false
145fd4e5da5Sopenharmony_ci%boolvec3_tft = OpConstantComposite %boolvec3 %true %false %true
146fd4e5da5Sopenharmony_ci%boolvec4_tftf = OpConstantComposite %boolvec4 %true %false %true %false
147fd4e5da5Sopenharmony_ci
148fd4e5da5Sopenharmony_ci%arr_u32_2 = OpTypeArray %u32 %u32_2
149fd4e5da5Sopenharmony_ci%st_u32_u32 = OpTypeStruct %u32 %u32
150fd4e5da5Sopenharmony_ci%mat_f32_2_2 = OpTypeMatrix %f32vec2 2
151fd4e5da5Sopenharmony_ci
152fd4e5da5Sopenharmony_ci%nul_arr_u32_2 = OpConstantNull %arr_u32_2
153fd4e5da5Sopenharmony_ci%nul_st_u32_u32 = OpConstantNull %st_u32_u32
154fd4e5da5Sopenharmony_ci%nul_mat_f32_2_2 = OpConstantNull %mat_f32_2_2
155fd4e5da5Sopenharmony_ci
156fd4e5da5Sopenharmony_ci%arr_u32_2_1_2 = OpConstantComposite %arr_u32_2 %u32_1 %u32_2
157fd4e5da5Sopenharmony_ci%st_u32_u32_1_2 = OpConstantComposite %st_u32_u32 %u32_1 %u32_2
158fd4e5da5Sopenharmony_ci%mat_f32_2_2_01_12 = OpConstantComposite %mat_f32_2_2 %f32vec2_01 %f32vec2_12
159fd4e5da5Sopenharmony_ci
160fd4e5da5Sopenharmony_ci%f32vec4ptr = OpTypePointer Function %f32vec4
161fd4e5da5Sopenharmony_ci
162fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func
163fd4e5da5Sopenharmony_ci%main_entry = OpLabel)";
164fd4e5da5Sopenharmony_ci
165fd4e5da5Sopenharmony_ci  const std::string after_body =
166fd4e5da5Sopenharmony_ci      R"(
167fd4e5da5Sopenharmony_ciOpReturn
168fd4e5da5Sopenharmony_ciOpFunctionEnd)";
169fd4e5da5Sopenharmony_ci
170fd4e5da5Sopenharmony_ci  return capabilities + capabilities_and_extensions +
171fd4e5da5Sopenharmony_ci         after_extension_before_body + body + after_body;
172fd4e5da5Sopenharmony_ci}
173fd4e5da5Sopenharmony_ci
174fd4e5da5Sopenharmony_cistd::string GenerateKernelCode(
175fd4e5da5Sopenharmony_ci    const std::string& body,
176fd4e5da5Sopenharmony_ci    const std::string& capabilities_and_extensions = "") {
177fd4e5da5Sopenharmony_ci  const std::string capabilities =
178fd4e5da5Sopenharmony_ci      R"(
179fd4e5da5Sopenharmony_ciOpCapability Addresses
180fd4e5da5Sopenharmony_ciOpCapability Kernel
181fd4e5da5Sopenharmony_ciOpCapability Linkage
182fd4e5da5Sopenharmony_ciOpCapability Int64
183fd4e5da5Sopenharmony_ciOpCapability Float64)";
184fd4e5da5Sopenharmony_ci
185fd4e5da5Sopenharmony_ci  const std::string after_extension_before_body =
186fd4e5da5Sopenharmony_ci      R"(
187fd4e5da5Sopenharmony_ciOpMemoryModel Physical32 OpenCL
188fd4e5da5Sopenharmony_ci%void = OpTypeVoid
189fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void
190fd4e5da5Sopenharmony_ci%bool = OpTypeBool
191fd4e5da5Sopenharmony_ci%f32 = OpTypeFloat 32
192fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0
193fd4e5da5Sopenharmony_ci%f64 = OpTypeFloat 64
194fd4e5da5Sopenharmony_ci%u64 = OpTypeInt 64 0
195fd4e5da5Sopenharmony_ci%boolvec2 = OpTypeVector %bool 2
196fd4e5da5Sopenharmony_ci%u32vec2 = OpTypeVector %u32 2
197fd4e5da5Sopenharmony_ci%u64vec2 = OpTypeVector %u64 2
198fd4e5da5Sopenharmony_ci%f32vec2 = OpTypeVector %f32 2
199fd4e5da5Sopenharmony_ci%f64vec2 = OpTypeVector %f64 2
200fd4e5da5Sopenharmony_ci%boolvec3 = OpTypeVector %bool 3
201fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3
202fd4e5da5Sopenharmony_ci%u64vec3 = OpTypeVector %u64 3
203fd4e5da5Sopenharmony_ci%f32vec3 = OpTypeVector %f32 3
204fd4e5da5Sopenharmony_ci%f64vec3 = OpTypeVector %f64 3
205fd4e5da5Sopenharmony_ci%boolvec4 = OpTypeVector %bool 4
206fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4
207fd4e5da5Sopenharmony_ci%u64vec4 = OpTypeVector %u64 4
208fd4e5da5Sopenharmony_ci%f32vec4 = OpTypeVector %f32 4
209fd4e5da5Sopenharmony_ci%f64vec4 = OpTypeVector %f64 4
210fd4e5da5Sopenharmony_ci
211fd4e5da5Sopenharmony_ci%f32_0 = OpConstant %f32 0
212fd4e5da5Sopenharmony_ci%f32_1 = OpConstant %f32 1
213fd4e5da5Sopenharmony_ci%f32_2 = OpConstant %f32 2
214fd4e5da5Sopenharmony_ci%f32_3 = OpConstant %f32 3
215fd4e5da5Sopenharmony_ci%f32_4 = OpConstant %f32 4
216fd4e5da5Sopenharmony_ci
217fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0
218fd4e5da5Sopenharmony_ci%u32_1 = OpConstant %u32 1
219fd4e5da5Sopenharmony_ci%u32_2 = OpConstant %u32 2
220fd4e5da5Sopenharmony_ci%u32_3 = OpConstant %u32 3
221fd4e5da5Sopenharmony_ci%u32_4 = OpConstant %u32 4
222fd4e5da5Sopenharmony_ci
223fd4e5da5Sopenharmony_ci%f64_0 = OpConstant %f64 0
224fd4e5da5Sopenharmony_ci%f64_1 = OpConstant %f64 1
225fd4e5da5Sopenharmony_ci%f64_2 = OpConstant %f64 2
226fd4e5da5Sopenharmony_ci%f64_3 = OpConstant %f64 3
227fd4e5da5Sopenharmony_ci%f64_4 = OpConstant %f64 4
228fd4e5da5Sopenharmony_ci
229fd4e5da5Sopenharmony_ci%u64_0 = OpConstant %u64 0
230fd4e5da5Sopenharmony_ci%u64_1 = OpConstant %u64 1
231fd4e5da5Sopenharmony_ci%u64_2 = OpConstant %u64 2
232fd4e5da5Sopenharmony_ci%u64_3 = OpConstant %u64 3
233fd4e5da5Sopenharmony_ci%u64_4 = OpConstant %u64 4
234fd4e5da5Sopenharmony_ci
235fd4e5da5Sopenharmony_ci%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1
236fd4e5da5Sopenharmony_ci%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2
237fd4e5da5Sopenharmony_ci%u32vec3_012 = OpConstantComposite %u32vec3 %u32_0 %u32_1 %u32_2
238fd4e5da5Sopenharmony_ci%u32vec3_123 = OpConstantComposite %u32vec3 %u32_1 %u32_2 %u32_3
239fd4e5da5Sopenharmony_ci%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3
240fd4e5da5Sopenharmony_ci%u32vec4_1234 = OpConstantComposite %u32vec4 %u32_1 %u32_2 %u32_3 %u32_4
241fd4e5da5Sopenharmony_ci
242fd4e5da5Sopenharmony_ci%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1
243fd4e5da5Sopenharmony_ci%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2
244fd4e5da5Sopenharmony_ci%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2
245fd4e5da5Sopenharmony_ci%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3
246fd4e5da5Sopenharmony_ci%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3
247fd4e5da5Sopenharmony_ci%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4
248fd4e5da5Sopenharmony_ci
249fd4e5da5Sopenharmony_ci%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1
250fd4e5da5Sopenharmony_ci%f64vec2_12 = OpConstantComposite %f64vec2 %f64_1 %f64_2
251fd4e5da5Sopenharmony_ci%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2
252fd4e5da5Sopenharmony_ci%f64vec3_123 = OpConstantComposite %f64vec3 %f64_1 %f64_2 %f64_3
253fd4e5da5Sopenharmony_ci%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3
254fd4e5da5Sopenharmony_ci%f64vec4_1234 = OpConstantComposite %f64vec4 %f64_1 %f64_2 %f64_3 %f64_4
255fd4e5da5Sopenharmony_ci
256fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool
257fd4e5da5Sopenharmony_ci%false = OpConstantFalse %bool
258fd4e5da5Sopenharmony_ci%boolvec2_tf = OpConstantComposite %boolvec2 %true %false
259fd4e5da5Sopenharmony_ci%boolvec3_tft = OpConstantComposite %boolvec3 %true %false %true
260fd4e5da5Sopenharmony_ci%boolvec4_tftf = OpConstantComposite %boolvec4 %true %false %true %false
261fd4e5da5Sopenharmony_ci
262fd4e5da5Sopenharmony_ci%f32vec4ptr = OpTypePointer Function %f32vec4
263fd4e5da5Sopenharmony_ci
264fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func
265fd4e5da5Sopenharmony_ci%main_entry = OpLabel)";
266fd4e5da5Sopenharmony_ci
267fd4e5da5Sopenharmony_ci  const std::string after_body =
268fd4e5da5Sopenharmony_ci      R"(
269fd4e5da5Sopenharmony_ciOpReturn
270fd4e5da5Sopenharmony_ciOpFunctionEnd)";
271fd4e5da5Sopenharmony_ci
272fd4e5da5Sopenharmony_ci  return capabilities + capabilities_and_extensions +
273fd4e5da5Sopenharmony_ci         after_extension_before_body + body + after_body;
274fd4e5da5Sopenharmony_ci}
275fd4e5da5Sopenharmony_ci
276fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpAnySuccess) {
277fd4e5da5Sopenharmony_ci  const std::string body = R"(
278fd4e5da5Sopenharmony_ci%val1 = OpAny %bool %boolvec2_tf
279fd4e5da5Sopenharmony_ci%val2 = OpAny %bool %boolvec3_tft
280fd4e5da5Sopenharmony_ci%val3 = OpAny %bool %boolvec4_tftf
281fd4e5da5Sopenharmony_ci)";
282fd4e5da5Sopenharmony_ci
283fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
284fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
285fd4e5da5Sopenharmony_ci}
286fd4e5da5Sopenharmony_ci
287fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpAnyWrongTypeId) {
288fd4e5da5Sopenharmony_ci  const std::string body = R"(
289fd4e5da5Sopenharmony_ci%val = OpAny %u32 %boolvec2_tf
290fd4e5da5Sopenharmony_ci)";
291fd4e5da5Sopenharmony_ci
292fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
293fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
294fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
295fd4e5da5Sopenharmony_ci              HasSubstr("Expected bool scalar type as Result Type: Any"));
296fd4e5da5Sopenharmony_ci}
297fd4e5da5Sopenharmony_ci
298fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpAnyWrongOperand) {
299fd4e5da5Sopenharmony_ci  const std::string body = R"(
300fd4e5da5Sopenharmony_ci%val = OpAny %bool %u32vec3_123
301fd4e5da5Sopenharmony_ci)";
302fd4e5da5Sopenharmony_ci
303fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
304fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
305fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
306fd4e5da5Sopenharmony_ci              HasSubstr("Expected operand to be vector bool: Any"));
307fd4e5da5Sopenharmony_ci}
308fd4e5da5Sopenharmony_ci
309fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIsNanSuccess) {
310fd4e5da5Sopenharmony_ci  const std::string body = R"(
311fd4e5da5Sopenharmony_ci%val1 = OpIsNan %bool %f32_1
312fd4e5da5Sopenharmony_ci%val2 = OpIsNan %bool %f64_0
313fd4e5da5Sopenharmony_ci%val3 = OpIsNan %boolvec2 %f32vec2_12
314fd4e5da5Sopenharmony_ci%val4 = OpIsNan %boolvec3 %f32vec3_123
315fd4e5da5Sopenharmony_ci%val5 = OpIsNan %boolvec4 %f32vec4_1234
316fd4e5da5Sopenharmony_ci)";
317fd4e5da5Sopenharmony_ci
318fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
319fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
320fd4e5da5Sopenharmony_ci}
321fd4e5da5Sopenharmony_ci
322fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIsNanWrongTypeId) {
323fd4e5da5Sopenharmony_ci  const std::string body = R"(
324fd4e5da5Sopenharmony_ci%val1 = OpIsNan %u32 %f32_1
325fd4e5da5Sopenharmony_ci)";
326fd4e5da5Sopenharmony_ci
327fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
328fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
329fd4e5da5Sopenharmony_ci  EXPECT_THAT(
330fd4e5da5Sopenharmony_ci      getDiagnosticString(),
331fd4e5da5Sopenharmony_ci      HasSubstr("Expected bool scalar or vector type as Result Type: IsNan"));
332fd4e5da5Sopenharmony_ci}
333fd4e5da5Sopenharmony_ci
334fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIsNanOperandNotFloat) {
335fd4e5da5Sopenharmony_ci  const std::string body = R"(
336fd4e5da5Sopenharmony_ci%val1 = OpIsNan %bool %u32_1
337fd4e5da5Sopenharmony_ci)";
338fd4e5da5Sopenharmony_ci
339fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
340fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
341fd4e5da5Sopenharmony_ci  EXPECT_THAT(
342fd4e5da5Sopenharmony_ci      getDiagnosticString(),
343fd4e5da5Sopenharmony_ci      HasSubstr("Expected operand to be scalar or vector float: IsNan"));
344fd4e5da5Sopenharmony_ci}
345fd4e5da5Sopenharmony_ci
346fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIsNanOperandWrongSize) {
347fd4e5da5Sopenharmony_ci  const std::string body = R"(
348fd4e5da5Sopenharmony_ci%val1 = OpIsNan %bool %f32vec2_12
349fd4e5da5Sopenharmony_ci)";
350fd4e5da5Sopenharmony_ci
351fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
352fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
353fd4e5da5Sopenharmony_ci  EXPECT_THAT(
354fd4e5da5Sopenharmony_ci      getDiagnosticString(),
355fd4e5da5Sopenharmony_ci      HasSubstr(
356fd4e5da5Sopenharmony_ci          "Expected vector sizes of Result Type and the operand to be equal: "
357fd4e5da5Sopenharmony_ci          "IsNan"));
358fd4e5da5Sopenharmony_ci}
359fd4e5da5Sopenharmony_ci
360fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterSuccess) {
361fd4e5da5Sopenharmony_ci  const std::string body = R"(
362fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %bool %f32_0 %f32_1
363fd4e5da5Sopenharmony_ci%val2 = OpLessOrGreater %bool %f64_0 %f64_0
364fd4e5da5Sopenharmony_ci%val3 = OpLessOrGreater %boolvec2 %f32vec2_12 %f32vec2_12
365fd4e5da5Sopenharmony_ci%val4 = OpLessOrGreater %boolvec3 %f32vec3_123 %f32vec3_123
366fd4e5da5Sopenharmony_ci%val5 = OpLessOrGreater %boolvec4 %f32vec4_1234 %f32vec4_1234
367fd4e5da5Sopenharmony_ci)";
368fd4e5da5Sopenharmony_ci
369fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
370fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
371fd4e5da5Sopenharmony_ci}
372fd4e5da5Sopenharmony_ci
373fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterWrongTypeId) {
374fd4e5da5Sopenharmony_ci  const std::string body = R"(
375fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %u32 %f32_1 %f32_1
376fd4e5da5Sopenharmony_ci)";
377fd4e5da5Sopenharmony_ci
378fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
379fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
380fd4e5da5Sopenharmony_ci  EXPECT_THAT(
381fd4e5da5Sopenharmony_ci      getDiagnosticString(),
382fd4e5da5Sopenharmony_ci      HasSubstr(
383fd4e5da5Sopenharmony_ci          "Expected bool scalar or vector type as Result Type: LessOrGreater"));
384fd4e5da5Sopenharmony_ci}
385fd4e5da5Sopenharmony_ci
386fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterLeftOperandNotFloat) {
387fd4e5da5Sopenharmony_ci  const std::string body = R"(
388fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %bool %u32_1 %f32_1
389fd4e5da5Sopenharmony_ci)";
390fd4e5da5Sopenharmony_ci
391fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
392fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
393fd4e5da5Sopenharmony_ci  EXPECT_THAT(
394fd4e5da5Sopenharmony_ci      getDiagnosticString(),
395fd4e5da5Sopenharmony_ci      HasSubstr(
396fd4e5da5Sopenharmony_ci          "Expected operands to be scalar or vector float: LessOrGreater"));
397fd4e5da5Sopenharmony_ci}
398fd4e5da5Sopenharmony_ci
399fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterLeftOperandWrongSize) {
400fd4e5da5Sopenharmony_ci  const std::string body = R"(
401fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %bool %f32vec2_12 %f32_1
402fd4e5da5Sopenharmony_ci)";
403fd4e5da5Sopenharmony_ci
404fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
405fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
406fd4e5da5Sopenharmony_ci  EXPECT_THAT(
407fd4e5da5Sopenharmony_ci      getDiagnosticString(),
408fd4e5da5Sopenharmony_ci      HasSubstr(
409fd4e5da5Sopenharmony_ci          "Expected vector sizes of Result Type and the operands to be equal: "
410fd4e5da5Sopenharmony_ci          "LessOrGreater"));
411fd4e5da5Sopenharmony_ci}
412fd4e5da5Sopenharmony_ci
413fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterOperandsDifferentType) {
414fd4e5da5Sopenharmony_ci  const std::string body = R"(
415fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %bool %f32_1 %f64_1
416fd4e5da5Sopenharmony_ci)";
417fd4e5da5Sopenharmony_ci
418fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
419fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
420fd4e5da5Sopenharmony_ci  EXPECT_THAT(
421fd4e5da5Sopenharmony_ci      getDiagnosticString(),
422fd4e5da5Sopenharmony_ci      HasSubstr("Expected left and right operands to have the same type: "
423fd4e5da5Sopenharmony_ci                "LessOrGreater"));
424fd4e5da5Sopenharmony_ci}
425fd4e5da5Sopenharmony_ci
426fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualSuccess) {
427fd4e5da5Sopenharmony_ci  const std::string body = R"(
428fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %bool %f32_0 %f32_1
429fd4e5da5Sopenharmony_ci%val2 = OpFOrdEqual %bool %f64_0 %f64_0
430fd4e5da5Sopenharmony_ci%val3 = OpFOrdEqual %boolvec2 %f32vec2_12 %f32vec2_12
431fd4e5da5Sopenharmony_ci%val4 = OpFOrdEqual %boolvec3 %f32vec3_123 %f32vec3_123
432fd4e5da5Sopenharmony_ci%val5 = OpFOrdEqual %boolvec4 %f32vec4_1234 %f32vec4_1234
433fd4e5da5Sopenharmony_ci)";
434fd4e5da5Sopenharmony_ci
435fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
436fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
437fd4e5da5Sopenharmony_ci}
438fd4e5da5Sopenharmony_ci
439fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualWrongTypeId) {
440fd4e5da5Sopenharmony_ci  const std::string body = R"(
441fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %u32 %f32_1 %f32_1
442fd4e5da5Sopenharmony_ci)";
443fd4e5da5Sopenharmony_ci
444fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
445fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
446fd4e5da5Sopenharmony_ci  EXPECT_THAT(
447fd4e5da5Sopenharmony_ci      getDiagnosticString(),
448fd4e5da5Sopenharmony_ci      HasSubstr(
449fd4e5da5Sopenharmony_ci          "Expected bool scalar or vector type as Result Type: FOrdEqual"));
450fd4e5da5Sopenharmony_ci}
451fd4e5da5Sopenharmony_ci
452fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualLeftOperandNotFloat) {
453fd4e5da5Sopenharmony_ci  const std::string body = R"(
454fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %bool %u32_1 %f32_1
455fd4e5da5Sopenharmony_ci)";
456fd4e5da5Sopenharmony_ci
457fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
458fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
459fd4e5da5Sopenharmony_ci  EXPECT_THAT(
460fd4e5da5Sopenharmony_ci      getDiagnosticString(),
461fd4e5da5Sopenharmony_ci      HasSubstr("Expected operands to be scalar or vector float: FOrdEqual"));
462fd4e5da5Sopenharmony_ci}
463fd4e5da5Sopenharmony_ci
464fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualLeftOperandWrongSize) {
465fd4e5da5Sopenharmony_ci  const std::string body = R"(
466fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %bool %f32vec2_12 %f32_1
467fd4e5da5Sopenharmony_ci)";
468fd4e5da5Sopenharmony_ci
469fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
470fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
471fd4e5da5Sopenharmony_ci  EXPECT_THAT(
472fd4e5da5Sopenharmony_ci      getDiagnosticString(),
473fd4e5da5Sopenharmony_ci      HasSubstr(
474fd4e5da5Sopenharmony_ci          "Expected vector sizes of Result Type and the operands to be equal: "
475fd4e5da5Sopenharmony_ci          "FOrdEqual"));
476fd4e5da5Sopenharmony_ci}
477fd4e5da5Sopenharmony_ci
478fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualOperandsDifferentType) {
479fd4e5da5Sopenharmony_ci  const std::string body = R"(
480fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %bool %f32_1 %f64_1
481fd4e5da5Sopenharmony_ci)";
482fd4e5da5Sopenharmony_ci
483fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
484fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
485fd4e5da5Sopenharmony_ci  EXPECT_THAT(
486fd4e5da5Sopenharmony_ci      getDiagnosticString(),
487fd4e5da5Sopenharmony_ci      HasSubstr("Expected left and right operands to have the same type: "
488fd4e5da5Sopenharmony_ci                "FOrdEqual"));
489fd4e5da5Sopenharmony_ci}
490fd4e5da5Sopenharmony_ci
491fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalEqualSuccess) {
492fd4e5da5Sopenharmony_ci  const std::string body = R"(
493fd4e5da5Sopenharmony_ci%val1 = OpLogicalEqual %bool %true %false
494fd4e5da5Sopenharmony_ci%val2 = OpLogicalEqual %boolvec2 %boolvec2_tf   %boolvec2_tf
495fd4e5da5Sopenharmony_ci%val3 = OpLogicalEqual %boolvec3 %boolvec3_tft  %boolvec3_tft
496fd4e5da5Sopenharmony_ci%val4 = OpLogicalEqual %boolvec4 %boolvec4_tftf %boolvec4_tftf
497fd4e5da5Sopenharmony_ci)";
498fd4e5da5Sopenharmony_ci
499fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
500fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
501fd4e5da5Sopenharmony_ci}
502fd4e5da5Sopenharmony_ci
503fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalEqualWrongTypeId) {
504fd4e5da5Sopenharmony_ci  const std::string body = R"(
505fd4e5da5Sopenharmony_ci%val1 = OpLogicalEqual %u32 %true %false
506fd4e5da5Sopenharmony_ci)";
507fd4e5da5Sopenharmony_ci
508fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
509fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
510fd4e5da5Sopenharmony_ci  EXPECT_THAT(
511fd4e5da5Sopenharmony_ci      getDiagnosticString(),
512fd4e5da5Sopenharmony_ci      HasSubstr(
513fd4e5da5Sopenharmony_ci          "Expected bool scalar or vector type as Result Type: LogicalEqual"));
514fd4e5da5Sopenharmony_ci}
515fd4e5da5Sopenharmony_ci
516fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalEqualWrongLeftOperand) {
517fd4e5da5Sopenharmony_ci  const std::string body = R"(
518fd4e5da5Sopenharmony_ci%val1 = OpLogicalEqual %bool %boolvec2_tf %false
519fd4e5da5Sopenharmony_ci)";
520fd4e5da5Sopenharmony_ci
521fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
522fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
523fd4e5da5Sopenharmony_ci  EXPECT_THAT(
524fd4e5da5Sopenharmony_ci      getDiagnosticString(),
525fd4e5da5Sopenharmony_ci      HasSubstr("Expected both operands to be of Result Type: LogicalEqual"));
526fd4e5da5Sopenharmony_ci}
527fd4e5da5Sopenharmony_ci
528fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalEqualWrongRightOperand) {
529fd4e5da5Sopenharmony_ci  const std::string body = R"(
530fd4e5da5Sopenharmony_ci%val1 = OpLogicalEqual %boolvec2 %boolvec2_tf %false
531fd4e5da5Sopenharmony_ci)";
532fd4e5da5Sopenharmony_ci
533fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
534fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
535fd4e5da5Sopenharmony_ci  EXPECT_THAT(
536fd4e5da5Sopenharmony_ci      getDiagnosticString(),
537fd4e5da5Sopenharmony_ci      HasSubstr("Expected both operands to be of Result Type: LogicalEqual"));
538fd4e5da5Sopenharmony_ci}
539fd4e5da5Sopenharmony_ci
540fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalNotSuccess) {
541fd4e5da5Sopenharmony_ci  const std::string body = R"(
542fd4e5da5Sopenharmony_ci%val1 = OpLogicalNot %bool %true
543fd4e5da5Sopenharmony_ci%val2 = OpLogicalNot %boolvec2 %boolvec2_tf
544fd4e5da5Sopenharmony_ci%val3 = OpLogicalNot %boolvec3 %boolvec3_tft
545fd4e5da5Sopenharmony_ci%val4 = OpLogicalNot %boolvec4 %boolvec4_tftf
546fd4e5da5Sopenharmony_ci)";
547fd4e5da5Sopenharmony_ci
548fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
549fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
550fd4e5da5Sopenharmony_ci}
551fd4e5da5Sopenharmony_ci
552fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalNotWrongTypeId) {
553fd4e5da5Sopenharmony_ci  const std::string body = R"(
554fd4e5da5Sopenharmony_ci%val1 = OpLogicalNot %u32 %true
555fd4e5da5Sopenharmony_ci)";
556fd4e5da5Sopenharmony_ci
557fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
558fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
559fd4e5da5Sopenharmony_ci  EXPECT_THAT(
560fd4e5da5Sopenharmony_ci      getDiagnosticString(),
561fd4e5da5Sopenharmony_ci      HasSubstr(
562fd4e5da5Sopenharmony_ci          "Expected bool scalar or vector type as Result Type: LogicalNot"));
563fd4e5da5Sopenharmony_ci}
564fd4e5da5Sopenharmony_ci
565fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalNotWrongOperand) {
566fd4e5da5Sopenharmony_ci  const std::string body = R"(
567fd4e5da5Sopenharmony_ci%val1 = OpLogicalNot %bool %boolvec2_tf
568fd4e5da5Sopenharmony_ci)";
569fd4e5da5Sopenharmony_ci
570fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body).c_str());
571fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
572fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
573fd4e5da5Sopenharmony_ci              HasSubstr("Expected operand to be of Result Type: LogicalNot"));
574fd4e5da5Sopenharmony_ci}
575fd4e5da5Sopenharmony_ci
576fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectSuccess) {
577fd4e5da5Sopenharmony_ci  const std::string body = R"(
578fd4e5da5Sopenharmony_ci%val1 = OpSelect %u32 %true %u32_0 %u32_1
579fd4e5da5Sopenharmony_ci%val2 = OpSelect %f32 %true %f32_0 %f32_1
580fd4e5da5Sopenharmony_ci%val3 = OpSelect %f64 %true %f64_0 %f64_1
581fd4e5da5Sopenharmony_ci%val4 = OpSelect %f32vec2 %boolvec2_tf %f32vec2_01 %f32vec2_12
582fd4e5da5Sopenharmony_ci%val5 = OpSelect %f32vec4 %boolvec4_tftf %f32vec4_0123 %f32vec4_1234
583fd4e5da5Sopenharmony_ci)";
584fd4e5da5Sopenharmony_ci
585fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
586fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
587fd4e5da5Sopenharmony_ci}
588fd4e5da5Sopenharmony_ci
589fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongTypeId) {
590fd4e5da5Sopenharmony_ci  const std::string body = R"(
591fd4e5da5Sopenharmony_ci%val1 = OpSelect %void %true %u32_0 %u32_1
592fd4e5da5Sopenharmony_ci)";
593fd4e5da5Sopenharmony_ci
594fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
595fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
596fd4e5da5Sopenharmony_ci  EXPECT_THAT(
597fd4e5da5Sopenharmony_ci      getDiagnosticString(),
598fd4e5da5Sopenharmony_ci      HasSubstr("Expected scalar or vector type as Result Type: Select"));
599fd4e5da5Sopenharmony_ci}
600fd4e5da5Sopenharmony_ci
601fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongTypeIdV14) {
602fd4e5da5Sopenharmony_ci  // In 1.4, the message changes to allow composites.
603fd4e5da5Sopenharmony_ci  const std::string body = R"(
604fd4e5da5Sopenharmony_ci%val1 = OpSelect %void %true %u32_0 %u32_1
605fd4e5da5Sopenharmony_ci)";
606fd4e5da5Sopenharmony_ci
607fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str(), SPV_ENV_UNIVERSAL_1_4);
608fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA,
609fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
610fd4e5da5Sopenharmony_ci  EXPECT_THAT(
611fd4e5da5Sopenharmony_ci      getDiagnosticString(),
612fd4e5da5Sopenharmony_ci      HasSubstr("Expected scalar or composite type as Result Type: Select"));
613fd4e5da5Sopenharmony_ci}
614fd4e5da5Sopenharmony_ci
615fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectPointerNoCapability) {
616fd4e5da5Sopenharmony_ci  const std::string body = R"(
617fd4e5da5Sopenharmony_ci%x = OpVariable %f32vec4ptr Function
618fd4e5da5Sopenharmony_ci%y = OpVariable %f32vec4ptr Function
619fd4e5da5Sopenharmony_ciOpStore %x %f32vec4_0123
620fd4e5da5Sopenharmony_ciOpStore %y %f32vec4_1234
621fd4e5da5Sopenharmony_ci%val1 = OpSelect %f32vec4ptr %true %x %y
622fd4e5da5Sopenharmony_ci)";
623fd4e5da5Sopenharmony_ci
624fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
625fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
626fd4e5da5Sopenharmony_ci  EXPECT_THAT(
627fd4e5da5Sopenharmony_ci      getDiagnosticString(),
628fd4e5da5Sopenharmony_ci      HasSubstr(
629fd4e5da5Sopenharmony_ci          "Using pointers with OpSelect requires capability VariablePointers "
630fd4e5da5Sopenharmony_ci          "or VariablePointersStorageBuffer"));
631fd4e5da5Sopenharmony_ci}
632fd4e5da5Sopenharmony_ci
633fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectPointerWithCapability1) {
634fd4e5da5Sopenharmony_ci  const std::string body = R"(
635fd4e5da5Sopenharmony_ci%x = OpVariable %f32vec4ptr Function
636fd4e5da5Sopenharmony_ci%y = OpVariable %f32vec4ptr Function
637fd4e5da5Sopenharmony_ciOpStore %x %f32vec4_0123
638fd4e5da5Sopenharmony_ciOpStore %y %f32vec4_1234
639fd4e5da5Sopenharmony_ci%val1 = OpSelect %f32vec4ptr %true %x %y
640fd4e5da5Sopenharmony_ci)";
641fd4e5da5Sopenharmony_ci
642fd4e5da5Sopenharmony_ci  const std::string extra_cap_ext = R"(
643fd4e5da5Sopenharmony_ciOpCapability VariablePointers
644fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_variable_pointers"
645fd4e5da5Sopenharmony_ci)";
646fd4e5da5Sopenharmony_ci
647fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body, extra_cap_ext).c_str());
648fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
649fd4e5da5Sopenharmony_ci}
650fd4e5da5Sopenharmony_ci
651fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectPointerWithCapability2) {
652fd4e5da5Sopenharmony_ci  const std::string body = R"(
653fd4e5da5Sopenharmony_ci%x = OpVariable %f32vec4ptr Function
654fd4e5da5Sopenharmony_ci%y = OpVariable %f32vec4ptr Function
655fd4e5da5Sopenharmony_ciOpStore %x %f32vec4_0123
656fd4e5da5Sopenharmony_ciOpStore %y %f32vec4_1234
657fd4e5da5Sopenharmony_ci%val1 = OpSelect %f32vec4ptr %true %x %y
658fd4e5da5Sopenharmony_ci)";
659fd4e5da5Sopenharmony_ci
660fd4e5da5Sopenharmony_ci  const std::string extra_cap_ext = R"(
661fd4e5da5Sopenharmony_ciOpCapability VariablePointersStorageBuffer
662fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_variable_pointers"
663fd4e5da5Sopenharmony_ci)";
664fd4e5da5Sopenharmony_ci
665fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body, extra_cap_ext).c_str());
666fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
667fd4e5da5Sopenharmony_ci}
668fd4e5da5Sopenharmony_ci
669fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongCondition) {
670fd4e5da5Sopenharmony_ci  const std::string body = R"(
671fd4e5da5Sopenharmony_ci%val1 = OpSelect %u32 %u32_1 %u32_0 %u32_1
672fd4e5da5Sopenharmony_ci)";
673fd4e5da5Sopenharmony_ci
674fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
675fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
676fd4e5da5Sopenharmony_ci  EXPECT_THAT(
677fd4e5da5Sopenharmony_ci      getDiagnosticString(),
678fd4e5da5Sopenharmony_ci      HasSubstr("Expected bool scalar or vector type as condition: Select"));
679fd4e5da5Sopenharmony_ci}
680fd4e5da5Sopenharmony_ci
681fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongConditionDimension) {
682fd4e5da5Sopenharmony_ci  const std::string body = R"(
683fd4e5da5Sopenharmony_ci%val1 = OpSelect %u32vec2 %true %u32vec2_01 %u32vec2_12
684fd4e5da5Sopenharmony_ci)";
685fd4e5da5Sopenharmony_ci
686fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
687fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
688fd4e5da5Sopenharmony_ci  EXPECT_THAT(
689fd4e5da5Sopenharmony_ci      getDiagnosticString(),
690fd4e5da5Sopenharmony_ci      HasSubstr(
691fd4e5da5Sopenharmony_ci          "Expected vector sizes of Result Type and the condition to be equal: "
692fd4e5da5Sopenharmony_ci          "Select"));
693fd4e5da5Sopenharmony_ci}
694fd4e5da5Sopenharmony_ci
695fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongLeftObject) {
696fd4e5da5Sopenharmony_ci  const std::string body = R"(
697fd4e5da5Sopenharmony_ci%val1 = OpSelect %bool %true %u32vec2_01 %u32_1
698fd4e5da5Sopenharmony_ci)";
699fd4e5da5Sopenharmony_ci
700fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
701fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
702fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
703fd4e5da5Sopenharmony_ci              HasSubstr("Expected both objects to be of Result Type: Select"));
704fd4e5da5Sopenharmony_ci}
705fd4e5da5Sopenharmony_ci
706fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongRightObject) {
707fd4e5da5Sopenharmony_ci  const std::string body = R"(
708fd4e5da5Sopenharmony_ci%val1 = OpSelect %bool %true %u32_1 %u32vec2_01
709fd4e5da5Sopenharmony_ci)";
710fd4e5da5Sopenharmony_ci
711fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
712fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
713fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
714fd4e5da5Sopenharmony_ci              HasSubstr("Expected both objects to be of Result Type: Select"));
715fd4e5da5Sopenharmony_ci}
716fd4e5da5Sopenharmony_ci
717fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectArrayV13Bad) {
718fd4e5da5Sopenharmony_ci  const std::string body = R"(
719fd4e5da5Sopenharmony_ci%val1 = OpSelect %arr_u32_2 %true %nul_arr_u32_2 %arr_u32_2_1_2
720fd4e5da5Sopenharmony_ci)";
721fd4e5da5Sopenharmony_ci
722fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
723fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA,
724fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
725fd4e5da5Sopenharmony_ci  EXPECT_THAT(
726fd4e5da5Sopenharmony_ci      getDiagnosticString(),
727fd4e5da5Sopenharmony_ci      HasSubstr("Expected scalar or vector type as Result Type: Select"));
728fd4e5da5Sopenharmony_ci}
729fd4e5da5Sopenharmony_ci
730fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectArrayV13TargetV14Bad) {
731fd4e5da5Sopenharmony_ci  const std::string body = R"(
732fd4e5da5Sopenharmony_ci%val1 = OpSelect %arr_u32_2 %true %nul_arr_u32_2 %arr_u32_2_1_2
733fd4e5da5Sopenharmony_ci)";
734fd4e5da5Sopenharmony_ci
735fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
736fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA,
737fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
738fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
739fd4e5da5Sopenharmony_ci              HasSubstr("Expected scalar or vector type as Result Type"));
740fd4e5da5Sopenharmony_ci}
741fd4e5da5Sopenharmony_ci
742fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectArrayV14Good) {
743fd4e5da5Sopenharmony_ci  const std::string body = R"(
744fd4e5da5Sopenharmony_ci%val1 = OpSelect %arr_u32_2 %true %nul_arr_u32_2 %arr_u32_2_1_2
745fd4e5da5Sopenharmony_ci)";
746fd4e5da5Sopenharmony_ci
747fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str(), SPV_ENV_UNIVERSAL_1_4);
748fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
749fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), Eq(""));
750fd4e5da5Sopenharmony_ci}
751fd4e5da5Sopenharmony_ci
752fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectStructV13Bad) {
753fd4e5da5Sopenharmony_ci  const std::string body = R"(
754fd4e5da5Sopenharmony_ci%val1 = OpSelect %st_u32_u32 %true %nul_st_u32_u32 %st_u32_u32_1_2
755fd4e5da5Sopenharmony_ci)";
756fd4e5da5Sopenharmony_ci
757fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
758fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA,
759fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
760fd4e5da5Sopenharmony_ci  EXPECT_THAT(
761fd4e5da5Sopenharmony_ci      getDiagnosticString(),
762fd4e5da5Sopenharmony_ci      HasSubstr("Expected scalar or vector type as Result Type: Select"));
763fd4e5da5Sopenharmony_ci}
764fd4e5da5Sopenharmony_ci
765fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectStructV13TargetV14Bad) {
766fd4e5da5Sopenharmony_ci  const std::string body = R"(
767fd4e5da5Sopenharmony_ci%val1 = OpSelect %st_u32_u32 %true %nul_st_u32_u32 %st_u32_u32_1_2
768fd4e5da5Sopenharmony_ci)";
769fd4e5da5Sopenharmony_ci
770fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
771fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA,
772fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
773fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
774fd4e5da5Sopenharmony_ci              HasSubstr("Expected scalar or vector type as Result Type"));
775fd4e5da5Sopenharmony_ci}
776fd4e5da5Sopenharmony_ci
777fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectStructV14Good) {
778fd4e5da5Sopenharmony_ci  const std::string body = R"(
779fd4e5da5Sopenharmony_ci%val1 = OpSelect %st_u32_u32 %true %nul_st_u32_u32 %st_u32_u32_1_2
780fd4e5da5Sopenharmony_ci)";
781fd4e5da5Sopenharmony_ci
782fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str(), SPV_ENV_UNIVERSAL_1_4);
783fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
784fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), Eq(""));
785fd4e5da5Sopenharmony_ci}
786fd4e5da5Sopenharmony_ci
787fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectMatrixV13Bad) {
788fd4e5da5Sopenharmony_ci  const std::string body = R"(
789fd4e5da5Sopenharmony_ci%val1 = OpSelect %mat_f32_2_2 %true %nul_mat_f32_2_2 %mat_f32_2_2_01_12
790fd4e5da5Sopenharmony_ci)";
791fd4e5da5Sopenharmony_ci
792fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
793fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA,
794fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
795fd4e5da5Sopenharmony_ci  EXPECT_THAT(
796fd4e5da5Sopenharmony_ci      getDiagnosticString(),
797fd4e5da5Sopenharmony_ci      HasSubstr("Expected scalar or vector type as Result Type: Select"));
798fd4e5da5Sopenharmony_ci}
799fd4e5da5Sopenharmony_ci
800fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectMatrixV13TargetV14Bad) {
801fd4e5da5Sopenharmony_ci  const std::string body = R"(
802fd4e5da5Sopenharmony_ci%val1 = OpSelect %mat_f32_2_2 %true %nul_mat_f32_2_2 %mat_f32_2_2_01_12
803fd4e5da5Sopenharmony_ci)";
804fd4e5da5Sopenharmony_ci
805fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
806fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA,
807fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
808fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
809fd4e5da5Sopenharmony_ci              HasSubstr("Expected scalar or vector type as Result Type"));
810fd4e5da5Sopenharmony_ci}
811fd4e5da5Sopenharmony_ci
812fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectMatrixV14Good) {
813fd4e5da5Sopenharmony_ci  const std::string body = R"(
814fd4e5da5Sopenharmony_ci%val1 = OpSelect %mat_f32_2_2 %true %nul_mat_f32_2_2 %mat_f32_2_2_01_12
815fd4e5da5Sopenharmony_ci)";
816fd4e5da5Sopenharmony_ci
817fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str(), SPV_ENV_UNIVERSAL_1_4);
818fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
819fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), Eq(""));
820fd4e5da5Sopenharmony_ci}
821fd4e5da5Sopenharmony_ci
822fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualSuccess) {
823fd4e5da5Sopenharmony_ci  const std::string body = R"(
824fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %u32_0 %s32_1
825fd4e5da5Sopenharmony_ci%val2 = OpIEqual %bool %s64_0 %u64_0
826fd4e5da5Sopenharmony_ci%val3 = OpIEqual %boolvec2 %s32vec2_12 %u32vec2_12
827fd4e5da5Sopenharmony_ci%val4 = OpIEqual %boolvec3 %s32vec3_123 %u32vec3_123
828fd4e5da5Sopenharmony_ci%val5 = OpIEqual %boolvec4 %s32vec4_1234 %u32vec4_1234
829fd4e5da5Sopenharmony_ci)";
830fd4e5da5Sopenharmony_ci
831fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
832fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
833fd4e5da5Sopenharmony_ci}
834fd4e5da5Sopenharmony_ci
835fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualWrongTypeId) {
836fd4e5da5Sopenharmony_ci  const std::string body = R"(
837fd4e5da5Sopenharmony_ci%val1 = OpIEqual %u32 %s32_1 %s32_1
838fd4e5da5Sopenharmony_ci)";
839fd4e5da5Sopenharmony_ci
840fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
841fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
842fd4e5da5Sopenharmony_ci  EXPECT_THAT(
843fd4e5da5Sopenharmony_ci      getDiagnosticString(),
844fd4e5da5Sopenharmony_ci      HasSubstr("Expected bool scalar or vector type as Result Type: IEqual"));
845fd4e5da5Sopenharmony_ci}
846fd4e5da5Sopenharmony_ci
847fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualLeftOperandNotInt) {
848fd4e5da5Sopenharmony_ci  const std::string body = R"(
849fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %f32_1 %s32_1
850fd4e5da5Sopenharmony_ci)";
851fd4e5da5Sopenharmony_ci
852fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
853fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
854fd4e5da5Sopenharmony_ci  EXPECT_THAT(
855fd4e5da5Sopenharmony_ci      getDiagnosticString(),
856fd4e5da5Sopenharmony_ci      HasSubstr("Expected operands to be scalar or vector int: IEqual"));
857fd4e5da5Sopenharmony_ci}
858fd4e5da5Sopenharmony_ci
859fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualLeftOperandWrongSize) {
860fd4e5da5Sopenharmony_ci  const std::string body = R"(
861fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %s32vec2_12 %s32_1
862fd4e5da5Sopenharmony_ci)";
863fd4e5da5Sopenharmony_ci
864fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
865fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
866fd4e5da5Sopenharmony_ci  EXPECT_THAT(
867fd4e5da5Sopenharmony_ci      getDiagnosticString(),
868fd4e5da5Sopenharmony_ci      HasSubstr(
869fd4e5da5Sopenharmony_ci          "Expected vector sizes of Result Type and the operands to be equal: "
870fd4e5da5Sopenharmony_ci          "IEqual"));
871fd4e5da5Sopenharmony_ci}
872fd4e5da5Sopenharmony_ci
873fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualRightOperandNotInt) {
874fd4e5da5Sopenharmony_ci  const std::string body = R"(
875fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %u32_1 %f32_1
876fd4e5da5Sopenharmony_ci)";
877fd4e5da5Sopenharmony_ci
878fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
879fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
880fd4e5da5Sopenharmony_ci  EXPECT_THAT(
881fd4e5da5Sopenharmony_ci      getDiagnosticString(),
882fd4e5da5Sopenharmony_ci      HasSubstr("Expected operands to be scalar or vector int: IEqual"));
883fd4e5da5Sopenharmony_ci}
884fd4e5da5Sopenharmony_ci
885fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualDifferentBitWidth) {
886fd4e5da5Sopenharmony_ci  const std::string body = R"(
887fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %u32_1 %u64_1
888fd4e5da5Sopenharmony_ci)";
889fd4e5da5Sopenharmony_ci
890fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
891fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
892fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
893fd4e5da5Sopenharmony_ci              HasSubstr("Expected both operands to have the same component bit "
894fd4e5da5Sopenharmony_ci                        "width: IEqual"));
895fd4e5da5Sopenharmony_ci}
896fd4e5da5Sopenharmony_ci
897fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanSuccess) {
898fd4e5da5Sopenharmony_ci  const std::string body = R"(
899fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %u32_0 %u32_1
900fd4e5da5Sopenharmony_ci%val2 = OpUGreaterThan %bool %s32_0 %u32_1
901fd4e5da5Sopenharmony_ci%val3 = OpUGreaterThan %bool %u64_0 %u64_0
902fd4e5da5Sopenharmony_ci%val4 = OpUGreaterThan %bool %u64_0 %s64_0
903fd4e5da5Sopenharmony_ci%val5 = OpUGreaterThan %boolvec2 %u32vec2_12 %u32vec2_12
904fd4e5da5Sopenharmony_ci%val6 = OpUGreaterThan %boolvec3 %s32vec3_123 %u32vec3_123
905fd4e5da5Sopenharmony_ci%val7 = OpUGreaterThan %boolvec4 %u32vec4_1234 %u32vec4_1234
906fd4e5da5Sopenharmony_ci)";
907fd4e5da5Sopenharmony_ci
908fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
909fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
910fd4e5da5Sopenharmony_ci}
911fd4e5da5Sopenharmony_ci
912fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanWrongTypeId) {
913fd4e5da5Sopenharmony_ci  const std::string body = R"(
914fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %u32 %u32_1 %u32_1
915fd4e5da5Sopenharmony_ci)";
916fd4e5da5Sopenharmony_ci
917fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
918fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
919fd4e5da5Sopenharmony_ci  EXPECT_THAT(
920fd4e5da5Sopenharmony_ci      getDiagnosticString(),
921fd4e5da5Sopenharmony_ci      HasSubstr(
922fd4e5da5Sopenharmony_ci          "Expected bool scalar or vector type as Result Type: UGreaterThan"));
923fd4e5da5Sopenharmony_ci}
924fd4e5da5Sopenharmony_ci
925fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanLeftOperandNotInt) {
926fd4e5da5Sopenharmony_ci  const std::string body = R"(
927fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %f32_1 %u32_1
928fd4e5da5Sopenharmony_ci)";
929fd4e5da5Sopenharmony_ci
930fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
931fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
932fd4e5da5Sopenharmony_ci  EXPECT_THAT(
933fd4e5da5Sopenharmony_ci      getDiagnosticString(),
934fd4e5da5Sopenharmony_ci      HasSubstr("Expected operands to be scalar or vector int: UGreaterThan"));
935fd4e5da5Sopenharmony_ci}
936fd4e5da5Sopenharmony_ci
937fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanLeftOperandWrongSize) {
938fd4e5da5Sopenharmony_ci  const std::string body = R"(
939fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %u32vec2_12 %u32_1
940fd4e5da5Sopenharmony_ci)";
941fd4e5da5Sopenharmony_ci
942fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
943fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
944fd4e5da5Sopenharmony_ci  EXPECT_THAT(
945fd4e5da5Sopenharmony_ci      getDiagnosticString(),
946fd4e5da5Sopenharmony_ci      HasSubstr(
947fd4e5da5Sopenharmony_ci          "Expected vector sizes of Result Type and the operands to be equal: "
948fd4e5da5Sopenharmony_ci          "UGreaterThan"));
949fd4e5da5Sopenharmony_ci}
950fd4e5da5Sopenharmony_ci
951fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanRightOperandNotInt) {
952fd4e5da5Sopenharmony_ci  const std::string body = R"(
953fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %u32_1 %f32_1
954fd4e5da5Sopenharmony_ci)";
955fd4e5da5Sopenharmony_ci
956fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
957fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
958fd4e5da5Sopenharmony_ci  EXPECT_THAT(
959fd4e5da5Sopenharmony_ci      getDiagnosticString(),
960fd4e5da5Sopenharmony_ci      HasSubstr("Expected operands to be scalar or vector int: UGreaterThan"));
961fd4e5da5Sopenharmony_ci}
962fd4e5da5Sopenharmony_ci
963fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanDifferentBitWidth) {
964fd4e5da5Sopenharmony_ci  const std::string body = R"(
965fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %u32_1 %u64_1
966fd4e5da5Sopenharmony_ci)";
967fd4e5da5Sopenharmony_ci
968fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
969fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
970fd4e5da5Sopenharmony_ci  EXPECT_THAT(
971fd4e5da5Sopenharmony_ci      getDiagnosticString(),
972fd4e5da5Sopenharmony_ci      HasSubstr("Expected both operands to have the same component bit width: "
973fd4e5da5Sopenharmony_ci                "UGreaterThan"));
974fd4e5da5Sopenharmony_ci}
975fd4e5da5Sopenharmony_ci
976fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanSuccess) {
977fd4e5da5Sopenharmony_ci  const std::string body = R"(
978fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %s32_0 %s32_1
979fd4e5da5Sopenharmony_ci%val2 = OpSGreaterThan %bool %u32_0 %s32_1
980fd4e5da5Sopenharmony_ci%val3 = OpSGreaterThan %bool %s64_0 %s64_0
981fd4e5da5Sopenharmony_ci%val4 = OpSGreaterThan %bool %s64_0 %u64_0
982fd4e5da5Sopenharmony_ci%val5 = OpSGreaterThan %boolvec2 %s32vec2_12 %s32vec2_12
983fd4e5da5Sopenharmony_ci%val6 = OpSGreaterThan %boolvec3 %s32vec3_123 %u32vec3_123
984fd4e5da5Sopenharmony_ci%val7 = OpSGreaterThan %boolvec4 %s32vec4_1234 %s32vec4_1234
985fd4e5da5Sopenharmony_ci)";
986fd4e5da5Sopenharmony_ci
987fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
988fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
989fd4e5da5Sopenharmony_ci}
990fd4e5da5Sopenharmony_ci
991fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanWrongTypeId) {
992fd4e5da5Sopenharmony_ci  const std::string body = R"(
993fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %s32 %s32_1 %s32_1
994fd4e5da5Sopenharmony_ci)";
995fd4e5da5Sopenharmony_ci
996fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
997fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
998fd4e5da5Sopenharmony_ci  EXPECT_THAT(
999fd4e5da5Sopenharmony_ci      getDiagnosticString(),
1000fd4e5da5Sopenharmony_ci      HasSubstr(
1001fd4e5da5Sopenharmony_ci          "Expected bool scalar or vector type as Result Type: SGreaterThan"));
1002fd4e5da5Sopenharmony_ci}
1003fd4e5da5Sopenharmony_ci
1004fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanLeftOperandNotInt) {
1005fd4e5da5Sopenharmony_ci  const std::string body = R"(
1006fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %f32_1 %s32_1
1007fd4e5da5Sopenharmony_ci)";
1008fd4e5da5Sopenharmony_ci
1009fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
1010fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1011fd4e5da5Sopenharmony_ci  EXPECT_THAT(
1012fd4e5da5Sopenharmony_ci      getDiagnosticString(),
1013fd4e5da5Sopenharmony_ci      HasSubstr("Expected operands to be scalar or vector int: SGreaterThan"));
1014fd4e5da5Sopenharmony_ci}
1015fd4e5da5Sopenharmony_ci
1016fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanLeftOperandWrongSize) {
1017fd4e5da5Sopenharmony_ci  const std::string body = R"(
1018fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %s32vec2_12 %s32_1
1019fd4e5da5Sopenharmony_ci)";
1020fd4e5da5Sopenharmony_ci
1021fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
1022fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1023fd4e5da5Sopenharmony_ci  EXPECT_THAT(
1024fd4e5da5Sopenharmony_ci      getDiagnosticString(),
1025fd4e5da5Sopenharmony_ci      HasSubstr(
1026fd4e5da5Sopenharmony_ci          "Expected vector sizes of Result Type and the operands to be equal: "
1027fd4e5da5Sopenharmony_ci          "SGreaterThan"));
1028fd4e5da5Sopenharmony_ci}
1029fd4e5da5Sopenharmony_ci
1030fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanRightOperandNotInt) {
1031fd4e5da5Sopenharmony_ci  const std::string body = R"(
1032fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %s32_1 %f32_1
1033fd4e5da5Sopenharmony_ci)";
1034fd4e5da5Sopenharmony_ci
1035fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
1036fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1037fd4e5da5Sopenharmony_ci  EXPECT_THAT(
1038fd4e5da5Sopenharmony_ci      getDiagnosticString(),
1039fd4e5da5Sopenharmony_ci      HasSubstr("Expected operands to be scalar or vector int: SGreaterThan"));
1040fd4e5da5Sopenharmony_ci}
1041fd4e5da5Sopenharmony_ci
1042fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanDifferentBitWidth) {
1043fd4e5da5Sopenharmony_ci  const std::string body = R"(
1044fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %s32_1 %s64_1
1045fd4e5da5Sopenharmony_ci)";
1046fd4e5da5Sopenharmony_ci
1047fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body).c_str());
1048fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1049fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1050fd4e5da5Sopenharmony_ci              HasSubstr("Expected both operands to have the same component bit "
1051fd4e5da5Sopenharmony_ci                        "width: SGreaterThan"));
1052fd4e5da5Sopenharmony_ci}
1053fd4e5da5Sopenharmony_ci
1054fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, PSBSelectSuccess) {
1055fd4e5da5Sopenharmony_ci  const std::string body = R"(
1056fd4e5da5Sopenharmony_ciOpCapability PhysicalStorageBufferAddresses
1057fd4e5da5Sopenharmony_ciOpCapability Int64
1058fd4e5da5Sopenharmony_ciOpCapability Shader
1059fd4e5da5Sopenharmony_ciOpExtension "SPV_EXT_physical_storage_buffer"
1060fd4e5da5Sopenharmony_ciOpMemoryModel PhysicalStorageBuffer64 GLSL450
1061fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %main "main"
1062fd4e5da5Sopenharmony_ciOpExecutionMode %main OriginUpperLeft
1063fd4e5da5Sopenharmony_ciOpDecorate %val1 AliasedPointer
1064fd4e5da5Sopenharmony_ci%uint64 = OpTypeInt 64 0
1065fd4e5da5Sopenharmony_ci%bool = OpTypeBool
1066fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool
1067fd4e5da5Sopenharmony_ci%ptr = OpTypePointer PhysicalStorageBuffer %uint64
1068fd4e5da5Sopenharmony_ci%pptr_f = OpTypePointer Function %ptr
1069fd4e5da5Sopenharmony_ci%void = OpTypeVoid
1070fd4e5da5Sopenharmony_ci%voidfn = OpTypeFunction %void
1071fd4e5da5Sopenharmony_ci%main = OpFunction %void None %voidfn
1072fd4e5da5Sopenharmony_ci%entry = OpLabel
1073fd4e5da5Sopenharmony_ci%val1 = OpVariable %pptr_f Function
1074fd4e5da5Sopenharmony_ci%val2 = OpLoad %ptr %val1
1075fd4e5da5Sopenharmony_ci%val3 = OpSelect %ptr %true %val2 %val2
1076fd4e5da5Sopenharmony_ciOpReturn
1077fd4e5da5Sopenharmony_ciOpFunctionEnd
1078fd4e5da5Sopenharmony_ci)";
1079fd4e5da5Sopenharmony_ci
1080fd4e5da5Sopenharmony_ci  CompileSuccessfully(body.c_str());
1081fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1082fd4e5da5Sopenharmony_ci}
1083fd4e5da5Sopenharmony_ci
1084fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, SelectVectorsScalarCondition) {
1085fd4e5da5Sopenharmony_ci  const std::string spirv = R"(
1086fd4e5da5Sopenharmony_ciOpCapability Shader
1087fd4e5da5Sopenharmony_ciOpCapability Linkage
1088fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
1089fd4e5da5Sopenharmony_ci%void = OpTypeVoid
1090fd4e5da5Sopenharmony_ci%bool = OpTypeBool
1091fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
1092fd4e5da5Sopenharmony_ci%int4 = OpTypeVector %int 4
1093fd4e5da5Sopenharmony_ci%int4_0 = OpConstantNull %int4
1094fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool
1095fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
1096fd4e5da5Sopenharmony_ci%func = OpFunction %void None %void_fn
1097fd4e5da5Sopenharmony_ci%1 = OpLabel
1098fd4e5da5Sopenharmony_ci%select = OpSelect %int4 %true %int4_0 %int4_0
1099fd4e5da5Sopenharmony_ciOpReturn
1100fd4e5da5Sopenharmony_ciOpFunctionEnd
1101fd4e5da5Sopenharmony_ci)";
1102fd4e5da5Sopenharmony_ci
1103fd4e5da5Sopenharmony_ci  CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
1104fd4e5da5Sopenharmony_ci  EXPECT_EQ(SPV_ERROR_INVALID_DATA,
1105fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
1106fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1107fd4e5da5Sopenharmony_ci              HasSubstr("Expected vector sizes of Result Type and the "
1108fd4e5da5Sopenharmony_ci                        "condition to be equal: Select"));
1109fd4e5da5Sopenharmony_ci}
1110fd4e5da5Sopenharmony_ci
1111fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, SelectVectorsScalarCondition1p4) {
1112fd4e5da5Sopenharmony_ci  const std::string spirv = R"(
1113fd4e5da5Sopenharmony_ciOpCapability Shader
1114fd4e5da5Sopenharmony_ciOpCapability Linkage
1115fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
1116fd4e5da5Sopenharmony_ci%void = OpTypeVoid
1117fd4e5da5Sopenharmony_ci%bool = OpTypeBool
1118fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
1119fd4e5da5Sopenharmony_ci%int4 = OpTypeVector %int 4
1120fd4e5da5Sopenharmony_ci%int4_0 = OpConstantNull %int4
1121fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool
1122fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
1123fd4e5da5Sopenharmony_ci%func = OpFunction %void None %void_fn
1124fd4e5da5Sopenharmony_ci%1 = OpLabel
1125fd4e5da5Sopenharmony_ci%select = OpSelect %int4 %true %int4_0 %int4_0
1126fd4e5da5Sopenharmony_ciOpReturn
1127fd4e5da5Sopenharmony_ciOpFunctionEnd
1128fd4e5da5Sopenharmony_ci)";
1129fd4e5da5Sopenharmony_ci
1130fd4e5da5Sopenharmony_ci  CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_4);
1131fd4e5da5Sopenharmony_ci  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
1132fd4e5da5Sopenharmony_ci}
1133fd4e5da5Sopenharmony_ci
1134fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, SelectVectorsVectorConditionMismatchedDimensions1p4) {
1135fd4e5da5Sopenharmony_ci  const std::string spirv = R"(
1136fd4e5da5Sopenharmony_ciOpCapability Shader
1137fd4e5da5Sopenharmony_ciOpCapability Linkage
1138fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
1139fd4e5da5Sopenharmony_ci%void = OpTypeVoid
1140fd4e5da5Sopenharmony_ci%bool = OpTypeBool
1141fd4e5da5Sopenharmony_ci%bool3 = OpTypeVector %bool 3
1142fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
1143fd4e5da5Sopenharmony_ci%int4 = OpTypeVector %int 4
1144fd4e5da5Sopenharmony_ci%int4_0 = OpConstantNull %int4
1145fd4e5da5Sopenharmony_ci%bool3_null = OpConstantNull %bool3
1146fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
1147fd4e5da5Sopenharmony_ci%func = OpFunction %void None %void_fn
1148fd4e5da5Sopenharmony_ci%1 = OpLabel
1149fd4e5da5Sopenharmony_ci%select = OpSelect %int4 %bool3_null %int4_0 %int4_0
1150fd4e5da5Sopenharmony_ciOpReturn
1151fd4e5da5Sopenharmony_ciOpFunctionEnd
1152fd4e5da5Sopenharmony_ci)";
1153fd4e5da5Sopenharmony_ci
1154fd4e5da5Sopenharmony_ci  CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_4);
1155fd4e5da5Sopenharmony_ci  EXPECT_EQ(SPV_ERROR_INVALID_DATA,
1156fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
1157fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1158fd4e5da5Sopenharmony_ci              HasSubstr("Expected vector sizes of Result Type and the "
1159fd4e5da5Sopenharmony_ci                        "condition to be equal: Select"));
1160fd4e5da5Sopenharmony_ci}
1161fd4e5da5Sopenharmony_ci
1162fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, SelectNVBindlessSamplers) {
1163fd4e5da5Sopenharmony_ci  const std::string spirv = R"(
1164fd4e5da5Sopenharmony_ci               OpCapability Shader
1165fd4e5da5Sopenharmony_ci               OpCapability BindlessTextureNV
1166fd4e5da5Sopenharmony_ci               OpExtension "SPV_NV_bindless_texture"
1167fd4e5da5Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
1168fd4e5da5Sopenharmony_ci               OpMemoryModel Logical GLSL450
1169fd4e5da5Sopenharmony_ci               OpSamplerImageAddressingModeNV 64
1170fd4e5da5Sopenharmony_ci               OpEntryPoint Fragment %main "main"
1171fd4e5da5Sopenharmony_ci               OpExecutionMode %main OriginUpperLeft
1172fd4e5da5Sopenharmony_ci               OpSource GLSL 450
1173fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_NV_bindless_texture"
1174fd4e5da5Sopenharmony_ci               OpName %main "main"
1175fd4e5da5Sopenharmony_ci               OpName %s2D "s2D"
1176fd4e5da5Sopenharmony_ci               OpName %pickhandle "pickhandle"
1177fd4e5da5Sopenharmony_ci               OpName %Sampler1 "Sampler1"
1178fd4e5da5Sopenharmony_ci               OpName %Sampler2 "Sampler2"
1179fd4e5da5Sopenharmony_ci               OpDecorate %pickhandle Flat
1180fd4e5da5Sopenharmony_ci               OpDecorate %Sampler1 DescriptorSet 0
1181fd4e5da5Sopenharmony_ci               OpDecorate %Sampler1 Binding 0
1182fd4e5da5Sopenharmony_ci               OpDecorate %Sampler1 BindlessSamplerNV
1183fd4e5da5Sopenharmony_ci               OpDecorate %Sampler2 DescriptorSet 0
1184fd4e5da5Sopenharmony_ci               OpDecorate %Sampler2 Binding 1
1185fd4e5da5Sopenharmony_ci               OpDecorate %Sampler2 BindlessSamplerNV
1186fd4e5da5Sopenharmony_ci       %void = OpTypeVoid
1187fd4e5da5Sopenharmony_ci          %3 = OpTypeFunction %void
1188fd4e5da5Sopenharmony_ci      %float = OpTypeFloat 32
1189fd4e5da5Sopenharmony_ci          %7 = OpTypeImage %float 2D 0 0 0 1 Unknown
1190fd4e5da5Sopenharmony_ci          %8 = OpTypeSampledImage %7
1191fd4e5da5Sopenharmony_ci%_ptr_Function_8 = OpTypePointer Function %8
1192fd4e5da5Sopenharmony_ci        %int = OpTypeInt 32 1
1193fd4e5da5Sopenharmony_ci%_ptr_Function_int = OpTypePointer Function %int
1194fd4e5da5Sopenharmony_ci      %int_0 = OpConstant %int 0
1195fd4e5da5Sopenharmony_ci       %bool = OpTypeBool
1196fd4e5da5Sopenharmony_ci%_ptr_UniformConstant_8 = OpTypePointer UniformConstant %8
1197fd4e5da5Sopenharmony_ci   %Sampler1 = OpVariable %_ptr_UniformConstant_8 UniformConstant
1198fd4e5da5Sopenharmony_ci   %Sampler2 = OpVariable %_ptr_UniformConstant_8 UniformConstant
1199fd4e5da5Sopenharmony_ci       %main = OpFunction %void None %3
1200fd4e5da5Sopenharmony_ci          %5 = OpLabel
1201fd4e5da5Sopenharmony_ci        %s2D = OpVariable %_ptr_Function_8 Function
1202fd4e5da5Sopenharmony_ci %pickhandle = OpVariable %_ptr_Function_int Function
1203fd4e5da5Sopenharmony_ci         %14 = OpLoad %int %pickhandle
1204fd4e5da5Sopenharmony_ci         %17 = OpIEqual %bool %14 %int_0
1205fd4e5da5Sopenharmony_ci         %20 = OpLoad %8 %Sampler1
1206fd4e5da5Sopenharmony_ci         %22 = OpLoad %8 %Sampler2
1207fd4e5da5Sopenharmony_ci         %23 = OpSelect %8 %17 %20 %22
1208fd4e5da5Sopenharmony_ci               OpStore %s2D %23
1209fd4e5da5Sopenharmony_ci               OpReturn
1210fd4e5da5Sopenharmony_ci               OpFunctionEnd
1211fd4e5da5Sopenharmony_ci)";
1212fd4e5da5Sopenharmony_ci
1213fd4e5da5Sopenharmony_ci  CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
1214fd4e5da5Sopenharmony_ci  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
1215fd4e5da5Sopenharmony_ci}
1216fd4e5da5Sopenharmony_ci
1217fd4e5da5Sopenharmony_ci}  // namespace
1218fd4e5da5Sopenharmony_ci}  // namespace val
1219fd4e5da5Sopenharmony_ci}  // namespace spvtools
1220