Coverage Report

Created: 2026-03-18 07:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/shaderc/third_party/spirv-tools/source/operand.cpp
Line
Count
Source
1
// Copyright (c) 2015-2020 The Khronos Group Inc.
2
// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights
3
// reserved.
4
//
5
// Licensed under the Apache License, Version 2.0 (the "License");
6
// you may not use this file except in compliance with the License.
7
// You may obtain a copy of the License at
8
//
9
//     http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing, software
12
// distributed under the License is distributed on an "AS IS" BASIS,
13
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
// See the License for the specific language governing permissions and
15
// limitations under the License.
16
17
#include "source/operand.h"
18
19
#include <assert.h>
20
#include <string.h>
21
22
#include <algorithm>
23
24
#include "DebugInfo.h"
25
#include "OpenCLDebugInfo100.h"
26
#include "source/macro.h"
27
#include "source/opcode.h"
28
#include "source/spirv_constant.h"
29
#include "source/table2.h"
30
#include "spirv-tools/libspirv.h"
31
32
0
const char* spvOperandTypeStr(spv_operand_type_t type) {
33
0
  switch (type) {
34
0
    case SPV_OPERAND_TYPE_ID:
35
0
    case SPV_OPERAND_TYPE_OPTIONAL_ID:
36
0
      return "ID";
37
0
    case SPV_OPERAND_TYPE_TYPE_ID:
38
0
      return "type ID";
39
0
    case SPV_OPERAND_TYPE_RESULT_ID:
40
0
      return "result ID";
41
0
    case SPV_OPERAND_TYPE_LITERAL_INTEGER:
42
0
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
43
0
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
44
0
    case SPV_OPERAND_TYPE_LITERAL_FLOAT:
45
0
      return "literal number";
46
0
    case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
47
0
      return "possibly multi-word literal integer";
48
0
    case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
49
0
      return "possibly multi-word literal number";
50
0
    case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
51
0
      return "extension instruction number";
52
0
    case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
53
0
      return "OpSpecConstantOp opcode";
54
0
    case SPV_OPERAND_TYPE_LITERAL_STRING:
55
0
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
56
0
      return "literal string";
57
0
    case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
58
0
      return "source language";
59
0
    case SPV_OPERAND_TYPE_EXECUTION_MODEL:
60
0
      return "execution model";
61
0
    case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
62
0
      return "addressing model";
63
0
    case SPV_OPERAND_TYPE_MEMORY_MODEL:
64
0
      return "memory model";
65
0
    case SPV_OPERAND_TYPE_EXECUTION_MODE:
66
0
      return "execution mode";
67
0
    case SPV_OPERAND_TYPE_STORAGE_CLASS:
68
0
      return "storage class";
69
0
    case SPV_OPERAND_TYPE_DIMENSIONALITY:
70
0
      return "dimensionality";
71
0
    case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
72
0
      return "sampler addressing mode";
73
0
    case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
74
0
      return "sampler filter mode";
75
0
    case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
76
0
      return "image format";
77
0
    case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
78
0
      return "floating-point fast math mode";
79
0
    case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
80
0
      return "floating-point rounding mode";
81
0
    case SPV_OPERAND_TYPE_LINKAGE_TYPE:
82
0
      return "linkage type";
83
0
    case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
84
0
    case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
85
0
      return "access qualifier";
86
0
    case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
87
0
      return "function parameter attribute";
88
0
    case SPV_OPERAND_TYPE_DECORATION:
89
0
      return "decoration";
90
0
    case SPV_OPERAND_TYPE_BUILT_IN:
91
0
      return "built-in";
92
0
    case SPV_OPERAND_TYPE_SELECTION_CONTROL:
93
0
      return "selection control";
94
0
    case SPV_OPERAND_TYPE_LOOP_CONTROL:
95
0
      return "loop control";
96
0
    case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
97
0
      return "function control";
98
0
    case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
99
0
      return "memory semantics ID";
100
0
    case SPV_OPERAND_TYPE_MEMORY_ACCESS:
101
0
    case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
102
0
      return "memory access";
103
0
    case SPV_OPERAND_TYPE_FRAGMENT_SHADING_RATE:
104
0
      return "shading rate";
105
0
    case SPV_OPERAND_TYPE_SCOPE_ID:
106
0
      return "scope ID";
107
0
    case SPV_OPERAND_TYPE_GROUP_OPERATION:
108
0
      return "group operation";
109
0
    case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
110
0
      return "kernel enqeue flags";
111
0
    case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
112
0
      return "kernel profiling info";
113
0
    case SPV_OPERAND_TYPE_CAPABILITY:
114
0
    case SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY:
115
0
      return "capability";
116
0
    case SPV_OPERAND_TYPE_RAY_FLAGS:
117
0
      return "ray flags";
118
0
    case SPV_OPERAND_TYPE_RAY_QUERY_INTERSECTION:
119
0
      return "ray query intersection";
120
0
    case SPV_OPERAND_TYPE_RAY_QUERY_COMMITTED_INTERSECTION_TYPE:
121
0
      return "ray query committed intersection type";
122
0
    case SPV_OPERAND_TYPE_RAY_QUERY_CANDIDATE_INTERSECTION_TYPE:
123
0
      return "ray query candidate intersection type";
124
0
    case SPV_OPERAND_TYPE_PACKED_VECTOR_FORMAT:
125
0
    case SPV_OPERAND_TYPE_OPTIONAL_PACKED_VECTOR_FORMAT:
126
0
      return "packed vector format";
127
0
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_OPERANDS:
128
0
    case SPV_OPERAND_TYPE_OPTIONAL_COOPERATIVE_MATRIX_OPERANDS:
129
0
      return "cooperative matrix operands";
130
0
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_LAYOUT:
131
0
      return "cooperative matrix layout";
132
0
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_USE:
133
0
      return "cooperative matrix use";
134
0
    case SPV_OPERAND_TYPE_TENSOR_CLAMP_MODE:
135
0
      return "tensor clamp mode";
136
0
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_REDUCE:
137
0
      return "cooperative matrix reduce";
138
0
    case SPV_OPERAND_TYPE_TENSOR_ADDRESSING_OPERANDS:
139
0
      return "tensor addressing operands";
140
0
    case SPV_OPERAND_TYPE_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
141
0
    case SPV_OPERAND_TYPE_OPTIONAL_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
142
0
      return "matrix multiply accumulate operands";
143
0
    case SPV_OPERAND_TYPE_TENSOR_OPERANDS:
144
0
    case SPV_OPERAND_TYPE_OPTIONAL_TENSOR_OPERANDS:
145
0
      return "tensor operands";
146
0
    case SPV_OPERAND_TYPE_INITIALIZATION_MODE_QUALIFIER:
147
0
      return "initialization mode qualifier";
148
0
    case SPV_OPERAND_TYPE_HOST_ACCESS_QUALIFIER:
149
0
      return "host access qualifier";
150
0
    case SPV_OPERAND_TYPE_LOAD_CACHE_CONTROL:
151
0
      return "load cache control";
152
0
    case SPV_OPERAND_TYPE_STORE_CACHE_CONTROL:
153
0
      return "store cache control";
154
0
    case SPV_OPERAND_TYPE_NAMED_MAXIMUM_NUMBER_OF_REGISTERS:
155
0
      return "named maximum number of registers";
156
0
    case SPV_OPERAND_TYPE_RAW_ACCESS_CHAIN_OPERANDS:
157
0
    case SPV_OPERAND_TYPE_OPTIONAL_RAW_ACCESS_CHAIN_OPERANDS:
158
0
      return "raw access chain operands";
159
0
    case SPV_OPERAND_TYPE_IMAGE:
160
0
    case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
161
0
      return "image";
162
0
    case SPV_OPERAND_TYPE_OPTIONAL_CIV:
163
0
      return "context-insensitive value";
164
0
    case SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS:
165
0
      return "debug info flags";
166
0
    case SPV_OPERAND_TYPE_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
167
0
      return "debug base type encoding";
168
0
    case SPV_OPERAND_TYPE_DEBUG_COMPOSITE_TYPE:
169
0
      return "debug composite type";
170
0
    case SPV_OPERAND_TYPE_DEBUG_TYPE_QUALIFIER:
171
0
      return "debug type qualifier";
172
0
    case SPV_OPERAND_TYPE_DEBUG_OPERATION:
173
0
      return "debug operation";
174
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_INFO_FLAGS:
175
0
      return "OpenCL.DebugInfo.100 debug info flags";
176
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
177
0
      return "OpenCL.DebugInfo.100 debug base type encoding";
178
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_COMPOSITE_TYPE:
179
0
      return "OpenCL.DebugInfo.100 debug composite type";
180
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_TYPE_QUALIFIER:
181
0
      return "OpenCL.DebugInfo.100 debug type qualifier";
182
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_OPERATION:
183
0
      return "OpenCL.DebugInfo.100 debug operation";
184
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_IMPORTED_ENTITY:
185
0
      return "OpenCL.DebugInfo.100 debug imported entity";
186
0
    case SPV_OPERAND_TYPE_FPENCODING:
187
0
    case SPV_OPERAND_TYPE_OPTIONAL_FPENCODING:
188
0
      return "FP encoding";
189
190
    // The next values are for values returned from an instruction, not actually
191
    // an operand.  So the specific strings don't matter.  But let's add them
192
    // for completeness and ease of testing.
193
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
194
0
      return "image channel order";
195
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
196
0
      return "image channel data type";
197
198
0
    case SPV_OPERAND_TYPE_FPDENORM_MODE:
199
0
      return "FP denorm mode";
200
0
    case SPV_OPERAND_TYPE_FPOPERATION_MODE:
201
0
      return "FP operation mode";
202
0
    case SPV_OPERAND_TYPE_QUANTIZATION_MODES:
203
0
      return "quantization mode";
204
0
    case SPV_OPERAND_TYPE_OVERFLOW_MODES:
205
0
      return "overflow mode";
206
0
    case SPV_OPERAND_TYPE_COOPERATIVE_VECTOR_MATRIX_LAYOUT:
207
0
      return "cooperative vector matrix layout";
208
0
    case SPV_OPERAND_TYPE_COMPONENT_TYPE:
209
0
      return "component type";
210
211
0
    case SPV_OPERAND_TYPE_KERNEL_PROPERTY_FLAGS:
212
0
      return "kernel property flags";
213
0
    case SPV_OPERAND_TYPE_SHDEBUG100_BUILD_IDENTIFIER_FLAGS:
214
0
      return "NonSemantic.Shader.DebugInfo.100 debug build identifier flags";
215
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
216
0
      return "NonSemantic.Shader.DebugInfo.100 debug base type attribute "
217
0
             "encoding";
218
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_COMPOSITE_TYPE:
219
0
      return "NonSemantic.Shader.DebugInfo.100 debug composite type";
220
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_IMPORTED_ENTITY:
221
0
      return "NonSemantic.Shader.DebugInfo.100 debug imported entity";
222
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_INFO_FLAGS:
223
0
      return "NonSemantic.Shader.DebugInfo.100 debug info flags";
224
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_OPERATION:
225
0
      return "NonSemantic.Shader.DebugInfo.100 debug operation";
226
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_TYPE_QUALIFIER:
227
0
      return "NonSemantic.Shader.DebugInfo.100 debug type qualifier";
228
229
0
    case SPV_OPERAND_TYPE_NONE:
230
0
      return "NONE";
231
0
    default:
232
0
      break;
233
0
  }
234
0
  return "unknown";
235
0
}
236
237
void spvPushOperandTypes(const spv_operand_type_t* types,
238
0
                         spv_operand_pattern_t* pattern) {
239
  // Push them on in backward order.
240
0
  const spv_operand_type_t* endTypes;
241
0
  for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes) {
242
0
  }
243
244
0
  while (endTypes-- != types) {
245
0
    pattern->push_back(*endTypes);
246
0
  }
247
0
}
248
249
void spvPushOperandTypes(
250
    const spvtools::utils::Span<const spv_operand_type_t>& types,
251
242k
    spv_operand_pattern_t* pattern) {
252
  // Push them on in backward order.
253
242k
  auto n = types.size();
254
862k
  for (auto i = 0u; i < n; i++) {
255
619k
    auto type = types[n - 1 - i];
256
    // Check against the NONE type, in case the tables have them.
257
    // This might be cleaned up.
258
619k
    if (type != SPV_OPERAND_TYPE_NONE) {
259
619k
      pattern->push_back(type);
260
619k
    }
261
619k
  }
262
242k
}
263
264
void spvPushOperandTypesForMask(const spv_operand_type_t type,
265
                                const uint32_t mask,
266
0
                                spv_operand_pattern_t* pattern) {
267
  // Scan from highest bits to lowest bits because we will append in LIFO
268
  // fashion, and we need the operands for lower order bits to be consumed first
269
0
  for (uint32_t candidate_bit = (1u << 31u); candidate_bit;
270
0
       candidate_bit >>= 1) {
271
0
    if (candidate_bit & mask) {
272
0
      const spvtools::OperandDesc* entry = nullptr;
273
0
      if (SPV_SUCCESS == spvtools::LookupOperand(type, candidate_bit, &entry)) {
274
0
        spvPushOperandTypes(entry->operands(), pattern);
275
0
      }
276
0
    }
277
0
  }
278
0
}
279
280
24
bool spvOperandIsConcrete(spv_operand_type_t type) {
281
24
  if (spvIsIdType(type) || spvOperandIsConcreteMask(type)) {
282
0
    return true;
283
0
  }
284
24
  switch (type) {
285
0
    case SPV_OPERAND_TYPE_LITERAL_INTEGER:
286
0
    case SPV_OPERAND_TYPE_LITERAL_FLOAT:
287
0
    case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
288
0
    case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
289
0
    case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
290
0
    case SPV_OPERAND_TYPE_LITERAL_STRING:
291
0
    case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
292
0
    case SPV_OPERAND_TYPE_EXECUTION_MODEL:
293
0
    case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
294
0
    case SPV_OPERAND_TYPE_MEMORY_MODEL:
295
0
    case SPV_OPERAND_TYPE_EXECUTION_MODE:
296
0
    case SPV_OPERAND_TYPE_STORAGE_CLASS:
297
0
    case SPV_OPERAND_TYPE_DIMENSIONALITY:
298
0
    case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
299
0
    case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
300
0
    case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
301
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
302
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
303
0
    case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
304
0
    case SPV_OPERAND_TYPE_LINKAGE_TYPE:
305
0
    case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
306
0
    case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
307
0
    case SPV_OPERAND_TYPE_DECORATION:
308
0
    case SPV_OPERAND_TYPE_BUILT_IN:
309
0
    case SPV_OPERAND_TYPE_GROUP_OPERATION:
310
0
    case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
311
0
    case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
312
0
    case SPV_OPERAND_TYPE_CAPABILITY:
313
0
    case SPV_OPERAND_TYPE_RAY_FLAGS:
314
0
    case SPV_OPERAND_TYPE_RAY_QUERY_INTERSECTION:
315
0
    case SPV_OPERAND_TYPE_RAY_QUERY_COMMITTED_INTERSECTION_TYPE:
316
0
    case SPV_OPERAND_TYPE_RAY_QUERY_CANDIDATE_INTERSECTION_TYPE:
317
0
    case SPV_OPERAND_TYPE_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
318
0
    case SPV_OPERAND_TYPE_DEBUG_COMPOSITE_TYPE:
319
0
    case SPV_OPERAND_TYPE_DEBUG_TYPE_QUALIFIER:
320
0
    case SPV_OPERAND_TYPE_DEBUG_OPERATION:
321
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
322
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_COMPOSITE_TYPE:
323
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_TYPE_QUALIFIER:
324
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_OPERATION:
325
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_IMPORTED_ENTITY:
326
0
    case SPV_OPERAND_TYPE_FPDENORM_MODE:
327
0
    case SPV_OPERAND_TYPE_FPOPERATION_MODE:
328
0
    case SPV_OPERAND_TYPE_QUANTIZATION_MODES:
329
0
    case SPV_OPERAND_TYPE_OVERFLOW_MODES:
330
24
    case SPV_OPERAND_TYPE_PACKED_VECTOR_FORMAT:
331
24
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_LAYOUT:
332
24
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_USE:
333
24
    case SPV_OPERAND_TYPE_INITIALIZATION_MODE_QUALIFIER:
334
24
    case SPV_OPERAND_TYPE_HOST_ACCESS_QUALIFIER:
335
24
    case SPV_OPERAND_TYPE_LOAD_CACHE_CONTROL:
336
24
    case SPV_OPERAND_TYPE_STORE_CACHE_CONTROL:
337
24
    case SPV_OPERAND_TYPE_NAMED_MAXIMUM_NUMBER_OF_REGISTERS:
338
24
    case SPV_OPERAND_TYPE_FPENCODING:
339
24
    case SPV_OPERAND_TYPE_TENSOR_CLAMP_MODE:
340
24
    case SPV_OPERAND_TYPE_COOPERATIVE_VECTOR_MATRIX_LAYOUT:
341
24
    case SPV_OPERAND_TYPE_COMPONENT_TYPE:
342
24
    case SPV_OPERAND_TYPE_KERNEL_PROPERTY_FLAGS:
343
24
    case SPV_OPERAND_TYPE_SHDEBUG100_BUILD_IDENTIFIER_FLAGS:
344
24
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
345
24
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_COMPOSITE_TYPE:
346
24
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_IMPORTED_ENTITY:
347
24
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_INFO_FLAGS:
348
24
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_OPERATION:
349
24
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_TYPE_QUALIFIER:
350
24
      return true;
351
0
    default:
352
0
      break;
353
24
  }
354
0
  return false;
355
24
}
356
357
131k
bool spvOperandIsConcreteMask(spv_operand_type_t type) {
358
131k
  switch (type) {
359
128
    case SPV_OPERAND_TYPE_IMAGE:
360
128
    case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
361
846
    case SPV_OPERAND_TYPE_SELECTION_CONTROL:
362
956
    case SPV_OPERAND_TYPE_LOOP_CONTROL:
363
1.26k
    case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
364
1.29k
    case SPV_OPERAND_TYPE_MEMORY_ACCESS:
365
1.29k
    case SPV_OPERAND_TYPE_FRAGMENT_SHADING_RATE:
366
1.29k
    case SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS:
367
1.29k
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_INFO_FLAGS:
368
1.29k
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_OPERANDS:
369
1.29k
    case SPV_OPERAND_TYPE_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
370
1.29k
    case SPV_OPERAND_TYPE_RAW_ACCESS_CHAIN_OPERANDS:
371
1.29k
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_REDUCE:
372
1.29k
    case SPV_OPERAND_TYPE_TENSOR_ADDRESSING_OPERANDS:
373
1.29k
    case SPV_OPERAND_TYPE_TENSOR_OPERANDS:
374
1.29k
      return true;
375
130k
    default:
376
130k
      break;
377
131k
  }
378
130k
  return false;
379
131k
}
380
381
82.2k
bool spvOperandIsOptional(spv_operand_type_t type) {
382
82.2k
  switch (type) {
383
9.66k
    case SPV_OPERAND_TYPE_OPTIONAL_ID:
384
9.96k
    case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
385
45.1k
    case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
386
45.1k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
387
45.1k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
388
45.1k
    case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
389
45.1k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
390
46.7k
    case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
391
48.4k
    case SPV_OPERAND_TYPE_OPTIONAL_PACKED_VECTOR_FORMAT:
392
48.4k
    case SPV_OPERAND_TYPE_OPTIONAL_COOPERATIVE_MATRIX_OPERANDS:
393
48.4k
    case SPV_OPERAND_TYPE_OPTIONAL_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
394
48.4k
    case SPV_OPERAND_TYPE_OPTIONAL_CIV:
395
48.4k
    case SPV_OPERAND_TYPE_OPTIONAL_RAW_ACCESS_CHAIN_OPERANDS:
396
49.0k
    case SPV_OPERAND_TYPE_OPTIONAL_FPENCODING:
397
49.0k
    case SPV_OPERAND_TYPE_OPTIONAL_TENSOR_OPERANDS:
398
49.0k
    case SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY:
399
49.0k
      return true;
400
33.1k
    default:
401
33.1k
      break;
402
82.2k
  }
403
  // Any variable operand is also optional.
404
33.1k
  return spvOperandIsVariable(type);
405
82.2k
}
406
407
33.1k
bool spvOperandIsVariable(spv_operand_type_t type) {
408
33.1k
  switch (type) {
409
23.6k
    case SPV_OPERAND_TYPE_VARIABLE_ID:
410
32.8k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
411
33.1k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
412
33.1k
    case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
413
33.1k
    case SPV_OPERAND_TYPE_VARIABLE_CAPABILITY:
414
33.1k
      return true;
415
0
    default:
416
0
      break;
417
33.1k
  }
418
0
  return false;
419
33.1k
}
420
421
bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
422
625k
                                  spv_operand_pattern_t* pattern) {
423
625k
  switch (type) {
424
33.7k
    case SPV_OPERAND_TYPE_VARIABLE_ID:
425
33.7k
      pattern->push_back(type);
426
33.7k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
427
33.7k
      return true;
428
9.12k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
429
9.12k
      pattern->push_back(type);
430
9.12k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER);
431
9.12k
      return true;
432
908
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
433
      // Represents Zero or more (Literal number, Id) pairs,
434
      // where the literal number must be a scalar integer.
435
908
      pattern->push_back(type);
436
908
      pattern->push_back(SPV_OPERAND_TYPE_ID);
437
908
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER);
438
908
      return true;
439
0
    case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
440
      // Represents Zero or more (Id, Literal number) pairs.
441
0
      pattern->push_back(type);
442
0
      pattern->push_back(SPV_OPERAND_TYPE_LITERAL_INTEGER);
443
0
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
444
0
      return true;
445
0
    case SPV_OPERAND_TYPE_VARIABLE_CAPABILITY:
446
0
      pattern->push_back(type);
447
0
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY);
448
0
      return true;
449
581k
    default:
450
581k
      break;
451
625k
  }
452
581k
  return false;
453
625k
}
454
455
spv_operand_type_t spvTakeFirstMatchableOperand(
456
581k
    spv_operand_pattern_t* pattern) {
457
581k
  assert(!pattern->empty());
458
581k
  spv_operand_type_t result;
459
625k
  do {
460
625k
    result = pattern->back();
461
625k
    pattern->pop_back();
462
625k
  } while (spvExpandOperandSequenceOnce(result, pattern));
463
581k
  return result;
464
581k
}
465
466
spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
467
0
    const spv_operand_pattern_t& pattern) {
468
0
  auto it =
469
0
      std::find(pattern.crbegin(), pattern.crend(), SPV_OPERAND_TYPE_RESULT_ID);
470
0
  if (it != pattern.crend()) {
471
0
    spv_operand_pattern_t alternatePattern(it - pattern.crbegin() + 2,
472
0
                                           SPV_OPERAND_TYPE_OPTIONAL_CIV);
473
0
    alternatePattern[1] = SPV_OPERAND_TYPE_RESULT_ID;
474
0
    return alternatePattern;
475
0
  }
476
477
  // No result-id found, so just expect CIVs.
478
0
  return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
479
0
}
480
481
1.31M
bool spvIsIdType(spv_operand_type_t type) {
482
1.31M
  switch (type) {
483
709k
    case SPV_OPERAND_TYPE_ID:
484
901k
    case SPV_OPERAND_TYPE_TYPE_ID:
485
1.13M
    case SPV_OPERAND_TYPE_RESULT_ID:
486
1.14M
    case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
487
1.14M
    case SPV_OPERAND_TYPE_SCOPE_ID:
488
1.14M
      return true;
489
169k
    default:
490
169k
      return false;
491
1.31M
  }
492
1.31M
}
493
494
867k
bool spvIsInIdType(spv_operand_type_t type) {
495
867k
  if (!spvIsIdType(type)) {
496
    // If it is not an ID it cannot be an input ID.
497
83.0k
    return false;
498
83.0k
  }
499
784k
  switch (type) {
500
    // Deny non-input IDs.
501
129k
    case SPV_OPERAND_TYPE_TYPE_ID:
502
292k
    case SPV_OPERAND_TYPE_RESULT_ID:
503
292k
      return false;
504
491k
    default:
505
491k
      return true;
506
784k
  }
507
784k
}
508
509
std::function<bool(unsigned)> spvOperandCanBeForwardDeclaredFunction(
510
44.9k
    spv::Op opcode) {
511
44.9k
  std::function<bool(unsigned index)> out;
512
44.9k
  if (spvOpcodeGeneratesType(opcode)) {
513
    // All types can use forward pointers.
514
4.51k
    out = [](unsigned) { return true; };
515
4.51k
    return out;
516
4.51k
  }
517
40.3k
  switch (opcode) {
518
0
    case spv::Op::OpExecutionMode:
519
0
    case spv::Op::OpExecutionModeId:
520
182
    case spv::Op::OpEntryPoint:
521
3.61k
    case spv::Op::OpName:
522
4.62k
    case spv::Op::OpMemberName:
523
5.34k
    case spv::Op::OpSelectionMerge:
524
7.76k
    case spv::Op::OpDecorate:
525
8.63k
    case spv::Op::OpMemberDecorate:
526
8.63k
    case spv::Op::OpMemberDecorateIdEXT:
527
8.63k
    case spv::Op::OpDecorateId:
528
8.63k
    case spv::Op::OpDecorateStringGOOGLE:
529
8.63k
    case spv::Op::OpMemberDecorateStringGOOGLE:
530
9.88k
    case spv::Op::OpBranch:
531
9.99k
    case spv::Op::OpLoopMerge:
532
9.99k
    case spv::Op::OpConditionalEntryPointINTEL:
533
9.99k
    case spv::Op::OpConditionalCapabilityINTEL:
534
9.99k
    case spv::Op::OpConditionalExtensionINTEL:
535
10.1k
      out = [](unsigned) { return true; };
536
9.99k
      break;
537
0
    case spv::Op::OpGroupDecorate:
538
0
    case spv::Op::OpGroupMemberDecorate:
539
758
    case spv::Op::OpBranchConditional:
540
820
    case spv::Op::OpSwitch:
541
1.77k
      out = [](unsigned index) { return index != 0; };
542
820
      break;
543
544
670
    case spv::Op::OpFunctionCall:
545
      // The Function parameter.
546
670
      out = [](unsigned index) { return index == 2; };
547
670
      break;
548
549
52
    case spv::Op::OpPhi:
550
52
      out = [](unsigned index) { return index > 1; };
551
52
      break;
552
553
0
    case spv::Op::OpEnqueueKernel:
554
      // The Invoke parameter.
555
0
      out = [](unsigned index) { return index == 8; };
556
0
      break;
557
558
0
    case spv::Op::OpGetKernelNDrangeSubGroupCount:
559
0
    case spv::Op::OpGetKernelNDrangeMaxSubGroupSize:
560
      // The Invoke parameter.
561
0
      out = [](unsigned index) { return index == 3; };
562
0
      break;
563
564
0
    case spv::Op::OpGetKernelWorkGroupSize:
565
0
    case spv::Op::OpGetKernelPreferredWorkGroupSizeMultiple:
566
      // The Invoke parameter.
567
0
      out = [](unsigned index) { return index == 2; };
568
0
      break;
569
24
    case spv::Op::OpTypeForwardPointer:
570
24
      out = [](unsigned index) { return index == 0; };
571
24
      break;
572
0
    case spv::Op::OpTypeArray:
573
0
      out = [](unsigned index) { return index == 1; };
574
0
      break;
575
0
    case spv::Op::OpCooperativeMatrixPerElementOpNV:
576
0
      out = [](unsigned index) { return index == 3; };
577
0
      break;
578
0
    case spv::Op::OpCooperativeMatrixReduceNV:
579
0
      out = [](unsigned index) { return index == 4; };
580
0
      break;
581
0
    case spv::Op::OpCooperativeMatrixLoadTensorNV:
582
      // approximate, due to variable operands
583
0
      out = [](unsigned index) { return index > 6; };
584
0
      break;
585
0
    case spv::Op::OpGraphEntryPointARM:
586
0
      out = [](unsigned index) { return index == 0; };
587
0
      break;
588
28.8k
    default:
589
28.8k
      out = [](unsigned) { return false; };
590
28.8k
      break;
591
40.3k
  }
592
40.3k
  return out;
593
40.3k
}
594
595
std::function<bool(unsigned)> spvDbgInfoExtOperandCanBeForwardDeclaredFunction(
596
0
    spv::Op opcode, spv_ext_inst_type_t ext_type, uint32_t key) {
597
  // The Vulkan debug info extended instruction set is non-semantic so allows no
598
  // forward references except if used through OpExtInstWithForwardRefsKHR.
599
0
  if (ext_type == SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100) {
600
0
    return [opcode](unsigned) {
601
0
      return opcode == spv::Op::OpExtInstWithForwardRefsKHR;
602
0
    };
603
0
  }
604
605
  // TODO(https://gitlab.khronos.org/spirv/SPIR-V/issues/532): Forward
606
  // references for debug info instructions are still in discussion. We must
607
  // update the following lines of code when we conclude the spec.
608
0
  std::function<bool(unsigned index)> out;
609
0
  if (ext_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100) {
610
0
    switch (OpenCLDebugInfo100Instructions(key)) {
611
0
      case OpenCLDebugInfo100DebugFunction:
612
0
        out = [](unsigned index) { return index == 13; };
613
0
        break;
614
0
      case OpenCLDebugInfo100DebugTypeComposite:
615
0
        out = [](unsigned index) { return index >= 13; };
616
0
        break;
617
0
      default:
618
0
        out = [](unsigned) { return false; };
619
0
        break;
620
0
    }
621
0
  } else {
622
0
    switch (DebugInfoInstructions(key)) {
623
0
      case DebugInfoDebugFunction:
624
0
        out = [](unsigned index) { return index == 13; };
625
0
        break;
626
0
      case DebugInfoDebugTypeComposite:
627
0
        out = [](unsigned index) { return index >= 12; };
628
0
        break;
629
0
      default:
630
0
        out = [](unsigned) { return false; };
631
0
        break;
632
0
    }
633
0
  }
634
0
  return out;
635
0
}
636
637
0
spv_fp_encoding_t spvFPEncodingFromOperandFPEncoding(spv::FPEncoding encoding) {
638
0
  switch (encoding) {
639
0
    case spv::FPEncoding::BFloat16KHR:
640
0
      return SPV_FP_ENCODING_BFLOAT16;
641
0
    case spv::FPEncoding::Float8E4M3EXT:
642
0
      return SPV_FP_ENCODING_FLOAT8_E4M3;
643
0
    case spv::FPEncoding::Float8E5M2EXT:
644
0
      return SPV_FP_ENCODING_FLOAT8_E5M2;
645
0
    case spv::FPEncoding::Max:
646
0
      break;
647
0
  }
648
0
  return SPV_FP_ENCODING_UNKNOWN;
649
0
}