Coverage Report

Created: 2026-09-13 07:19

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
0
    case SPV_OPERAND_TYPE_GATHER_MODES:
229
0
      return "gather modes";
230
231
0
    case SPV_OPERAND_TYPE_NONE:
232
0
      return "NONE";
233
0
    default:
234
0
      break;
235
0
  }
236
0
  return "unknown";
237
0
}
238
239
void spvPushOperandTypes(const spv_operand_type_t* types,
240
0
                         spv_operand_pattern_t* pattern) {
241
  // Push them on in backward order.
242
0
  const spv_operand_type_t* endTypes;
243
0
  for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes) {
244
0
  }
245
246
0
  while (endTypes-- != types) {
247
0
    pattern->push_back(*endTypes);
248
0
  }
249
0
}
250
251
void spvPushOperandTypes(
252
    const spvtools::utils::Span<const spv_operand_type_t>& types,
253
535k
    spv_operand_pattern_t* pattern) {
254
  // Push them on in backward order.
255
535k
  auto n = types.size();
256
1.94M
  for (auto i = 0u; i < n; i++) {
257
1.40M
    auto type = types[n - 1 - i];
258
    // Check against the NONE type, in case the tables have them.
259
    // This might be cleaned up.
260
1.40M
    if (type != SPV_OPERAND_TYPE_NONE) {
261
1.40M
      pattern->push_back(type);
262
1.40M
    }
263
1.40M
  }
264
535k
}
265
266
void spvPushOperandTypesForMask(const spv_operand_type_t type,
267
                                const uint32_t mask,
268
0
                                spv_operand_pattern_t* pattern) {
269
  // Scan from highest bits to lowest bits because we will append in LIFO
270
  // fashion, and we need the operands for lower order bits to be consumed first
271
0
  for (uint32_t candidate_bit = (1u << 31u); candidate_bit;
272
0
       candidate_bit >>= 1) {
273
0
    if (candidate_bit & mask) {
274
0
      const spvtools::OperandDesc* entry = nullptr;
275
0
      if (SPV_SUCCESS == spvtools::LookupOperand(type, candidate_bit, &entry)) {
276
0
        spvPushOperandTypes(entry->operands(), pattern);
277
0
      }
278
0
    }
279
0
  }
280
0
}
281
282
47
bool spvOperandIsConcrete(spv_operand_type_t type) {
283
47
  if (spvIsIdType(type) || spvOperandIsConcreteMask(type)) {
284
0
    return true;
285
0
  }
286
47
  switch (type) {
287
0
    case SPV_OPERAND_TYPE_LITERAL_INTEGER:
288
0
    case SPV_OPERAND_TYPE_LITERAL_FLOAT:
289
0
    case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
290
0
    case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
291
0
    case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
292
0
    case SPV_OPERAND_TYPE_LITERAL_STRING:
293
0
    case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
294
0
    case SPV_OPERAND_TYPE_EXECUTION_MODEL:
295
0
    case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
296
0
    case SPV_OPERAND_TYPE_MEMORY_MODEL:
297
0
    case SPV_OPERAND_TYPE_EXECUTION_MODE:
298
0
    case SPV_OPERAND_TYPE_STORAGE_CLASS:
299
0
    case SPV_OPERAND_TYPE_DIMENSIONALITY:
300
0
    case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
301
0
    case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
302
0
    case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
303
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
304
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
305
0
    case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
306
0
    case SPV_OPERAND_TYPE_LINKAGE_TYPE:
307
0
    case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
308
0
    case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
309
0
    case SPV_OPERAND_TYPE_DECORATION:
310
0
    case SPV_OPERAND_TYPE_BUILT_IN:
311
0
    case SPV_OPERAND_TYPE_GROUP_OPERATION:
312
0
    case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
313
0
    case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
314
0
    case SPV_OPERAND_TYPE_CAPABILITY:
315
0
    case SPV_OPERAND_TYPE_RAY_FLAGS:
316
0
    case SPV_OPERAND_TYPE_RAY_QUERY_INTERSECTION:
317
0
    case SPV_OPERAND_TYPE_RAY_QUERY_COMMITTED_INTERSECTION_TYPE:
318
0
    case SPV_OPERAND_TYPE_RAY_QUERY_CANDIDATE_INTERSECTION_TYPE:
319
0
    case SPV_OPERAND_TYPE_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
320
0
    case SPV_OPERAND_TYPE_DEBUG_COMPOSITE_TYPE:
321
0
    case SPV_OPERAND_TYPE_DEBUG_TYPE_QUALIFIER:
322
0
    case SPV_OPERAND_TYPE_DEBUG_OPERATION:
323
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
324
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_COMPOSITE_TYPE:
325
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_TYPE_QUALIFIER:
326
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_OPERATION:
327
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_IMPORTED_ENTITY:
328
0
    case SPV_OPERAND_TYPE_FPDENORM_MODE:
329
0
    case SPV_OPERAND_TYPE_FPOPERATION_MODE:
330
0
    case SPV_OPERAND_TYPE_QUANTIZATION_MODES:
331
0
    case SPV_OPERAND_TYPE_OVERFLOW_MODES:
332
47
    case SPV_OPERAND_TYPE_PACKED_VECTOR_FORMAT:
333
47
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_LAYOUT:
334
47
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_USE:
335
47
    case SPV_OPERAND_TYPE_INITIALIZATION_MODE_QUALIFIER:
336
47
    case SPV_OPERAND_TYPE_HOST_ACCESS_QUALIFIER:
337
47
    case SPV_OPERAND_TYPE_LOAD_CACHE_CONTROL:
338
47
    case SPV_OPERAND_TYPE_STORE_CACHE_CONTROL:
339
47
    case SPV_OPERAND_TYPE_NAMED_MAXIMUM_NUMBER_OF_REGISTERS:
340
47
    case SPV_OPERAND_TYPE_FPENCODING:
341
47
    case SPV_OPERAND_TYPE_TENSOR_CLAMP_MODE:
342
47
    case SPV_OPERAND_TYPE_COOPERATIVE_VECTOR_MATRIX_LAYOUT:
343
47
    case SPV_OPERAND_TYPE_COMPONENT_TYPE:
344
47
    case SPV_OPERAND_TYPE_KERNEL_PROPERTY_FLAGS:
345
47
    case SPV_OPERAND_TYPE_SHDEBUG100_BUILD_IDENTIFIER_FLAGS:
346
47
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
347
47
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_COMPOSITE_TYPE:
348
47
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_IMPORTED_ENTITY:
349
47
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_INFO_FLAGS:
350
47
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_OPERATION:
351
47
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_TYPE_QUALIFIER:
352
47
    case SPV_OPERAND_TYPE_GATHER_MODES:
353
47
      return true;
354
0
    default:
355
0
      break;
356
47
  }
357
0
  return false;
358
47
}
359
360
329k
bool spvOperandIsConcreteMask(spv_operand_type_t type) {
361
329k
  switch (type) {
362
506
    case SPV_OPERAND_TYPE_IMAGE:
363
506
    case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
364
1.92k
    case SPV_OPERAND_TYPE_SELECTION_CONTROL:
365
2.38k
    case SPV_OPERAND_TYPE_LOOP_CONTROL:
366
3.07k
    case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
367
3.11k
    case SPV_OPERAND_TYPE_MEMORY_ACCESS:
368
3.11k
    case SPV_OPERAND_TYPE_FRAGMENT_SHADING_RATE:
369
3.11k
    case SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS:
370
3.11k
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_INFO_FLAGS:
371
3.11k
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_OPERANDS:
372
3.11k
    case SPV_OPERAND_TYPE_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
373
3.11k
    case SPV_OPERAND_TYPE_RAW_ACCESS_CHAIN_OPERANDS:
374
3.11k
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_REDUCE:
375
3.11k
    case SPV_OPERAND_TYPE_TENSOR_ADDRESSING_OPERANDS:
376
3.11k
    case SPV_OPERAND_TYPE_TENSOR_OPERANDS:
377
3.11k
      return true;
378
326k
    default:
379
326k
      break;
380
329k
  }
381
326k
  return false;
382
329k
}
383
384
206k
bool spvOperandIsOptional(spv_operand_type_t type) {
385
206k
  switch (type) {
386
25.9k
    case SPV_OPERAND_TYPE_OPTIONAL_ID:
387
26.2k
    case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
388
117k
    case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
389
117k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
390
117k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
391
117k
    case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
392
117k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
393
119k
    case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
394
123k
    case SPV_OPERAND_TYPE_OPTIONAL_PACKED_VECTOR_FORMAT:
395
123k
    case SPV_OPERAND_TYPE_OPTIONAL_COOPERATIVE_MATRIX_OPERANDS:
396
123k
    case SPV_OPERAND_TYPE_OPTIONAL_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
397
123k
    case SPV_OPERAND_TYPE_OPTIONAL_CIV:
398
123k
    case SPV_OPERAND_TYPE_OPTIONAL_RAW_ACCESS_CHAIN_OPERANDS:
399
125k
    case SPV_OPERAND_TYPE_OPTIONAL_FPENCODING:
400
125k
    case SPV_OPERAND_TYPE_OPTIONAL_TENSOR_OPERANDS:
401
125k
    case SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY:
402
125k
      return true;
403
80.9k
    default:
404
80.9k
      break;
405
206k
  }
406
  // Any variable operand is also optional.
407
80.9k
  return spvOperandIsVariable(type);
408
206k
}
409
410
80.9k
bool spvOperandIsVariable(spv_operand_type_t type) {
411
80.9k
  switch (type) {
412
48.0k
    case SPV_OPERAND_TYPE_VARIABLE_ID:
413
80.0k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
414
80.9k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
415
80.9k
    case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
416
80.9k
    case SPV_OPERAND_TYPE_VARIABLE_CAPABILITY:
417
80.9k
      return true;
418
0
    default:
419
0
      break;
420
80.9k
  }
421
0
  return false;
422
80.9k
}
423
424
bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
425
1.45M
                                  spv_operand_pattern_t* pattern) {
426
1.45M
  switch (type) {
427
87.0k
    case SPV_OPERAND_TYPE_VARIABLE_ID:
428
87.0k
      pattern->push_back(type);
429
87.0k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
430
87.0k
      return true;
431
36.7k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
432
36.7k
      pattern->push_back(type);
433
36.7k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER);
434
36.7k
      return true;
435
2.74k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
436
      // Represents Zero or more (Literal number, Id) pairs,
437
      // where the literal number must be a scalar integer.
438
2.74k
      pattern->push_back(type);
439
2.74k
      pattern->push_back(SPV_OPERAND_TYPE_ID);
440
2.74k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER);
441
2.74k
      return true;
442
0
    case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
443
      // Represents Zero or more (Id, Literal number) pairs.
444
0
      pattern->push_back(type);
445
0
      pattern->push_back(SPV_OPERAND_TYPE_LITERAL_INTEGER);
446
0
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
447
0
      return true;
448
0
    case SPV_OPERAND_TYPE_VARIABLE_CAPABILITY:
449
0
      pattern->push_back(type);
450
0
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY);
451
0
      return true;
452
1.32M
    default:
453
1.32M
      break;
454
1.45M
  }
455
1.32M
  return false;
456
1.45M
}
457
458
spv_operand_type_t spvTakeFirstMatchableOperand(
459
1.32M
    spv_operand_pattern_t* pattern) {
460
1.32M
  assert(!pattern->empty());
461
1.32M
  spv_operand_type_t result;
462
1.45M
  do {
463
1.45M
    result = pattern->back();
464
1.45M
    pattern->pop_back();
465
1.45M
  } while (spvExpandOperandSequenceOnce(result, pattern));
466
1.32M
  return result;
467
1.32M
}
468
469
spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
470
0
    const spv_operand_pattern_t& pattern) {
471
0
  auto it =
472
0
      std::find(pattern.crbegin(), pattern.crend(), SPV_OPERAND_TYPE_RESULT_ID);
473
0
  if (it != pattern.crend()) {
474
0
    spv_operand_pattern_t alternatePattern(it - pattern.crbegin() + 2,
475
0
                                           SPV_OPERAND_TYPE_OPTIONAL_CIV);
476
0
    alternatePattern[1] = SPV_OPERAND_TYPE_RESULT_ID;
477
0
    return alternatePattern;
478
0
  }
479
480
  // No result-id found, so just expect CIVs.
481
0
  return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
482
0
}
483
484
4.50M
bool spvIsIdType(spv_operand_type_t type) {
485
4.50M
  switch (type) {
486
2.39M
    case SPV_OPERAND_TYPE_ID:
487
3.09M
    case SPV_OPERAND_TYPE_TYPE_ID:
488
3.92M
    case SPV_OPERAND_TYPE_RESULT_ID:
489
3.92M
    case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
490
3.93M
    case SPV_OPERAND_TYPE_SCOPE_ID:
491
3.93M
      return true;
492
577k
    default:
493
577k
      return false;
494
4.50M
  }
495
4.50M
}
496
497
3.23M
bool spvIsInIdType(spv_operand_type_t type) {
498
3.23M
  if (!spvIsIdType(type)) {
499
    // If it is not an ID it cannot be an input ID.
500
344k
    return false;
501
344k
  }
502
2.89M
  switch (type) {
503
    // Deny non-input IDs.
504
521k
    case SPV_OPERAND_TYPE_TYPE_ID:
505
1.15M
    case SPV_OPERAND_TYPE_RESULT_ID:
506
1.15M
      return false;
507
1.74M
    default:
508
1.74M
      return true;
509
2.89M
  }
510
2.89M
}
511
512
std::function<bool(unsigned)> spvOperandCanBeForwardDeclaredFunction(
513
111k
    spv::Op opcode) {
514
111k
  std::function<bool(unsigned index)> out;
515
111k
  if (spvOpcodeGeneratesType(opcode)) {
516
    // All types can use forward pointers.
517
8.63k
    out = [](unsigned) { return true; };
518
8.63k
    return out;
519
8.63k
  }
520
103k
  switch (opcode) {
521
0
    case spv::Op::OpExecutionMode:
522
0
    case spv::Op::OpExecutionModeId:
523
296
    case spv::Op::OpEntryPoint:
524
9.99k
    case spv::Op::OpName:
525
11.7k
    case spv::Op::OpMemberName:
526
13.1k
    case spv::Op::OpSelectionMerge:
527
16.9k
    case spv::Op::OpDecorate:
528
18.8k
    case spv::Op::OpMemberDecorate:
529
18.8k
    case spv::Op::OpMemberDecorateIdEXT:
530
18.8k
    case spv::Op::OpDecorateId:
531
18.8k
    case spv::Op::OpDecorateStringGOOGLE:
532
18.8k
    case spv::Op::OpMemberDecorateStringGOOGLE:
533
22.4k
    case spv::Op::OpBranch:
534
22.8k
    case spv::Op::OpLoopMerge:
535
22.8k
    case spv::Op::OpConditionalEntryPointINTEL:
536
22.8k
    case spv::Op::OpConditionalCapabilityINTEL:
537
22.8k
    case spv::Op::OpConditionalExtensionINTEL:
538
23.2k
      out = [](unsigned) { return true; };
539
22.8k
      break;
540
0
    case spv::Op::OpGroupDecorate:
541
0
    case spv::Op::OpGroupMemberDecorate:
542
1.70k
    case spv::Op::OpBranchConditional:
543
1.86k
    case spv::Op::OpSwitch:
544
4.23k
      out = [](unsigned index) { return index != 0; };
545
1.86k
      break;
546
547
1.08k
    case spv::Op::OpFunctionCall:
548
      // The Function parameter.
549
1.08k
      out = [](unsigned index) { return index == 2; };
550
1.08k
      break;
551
552
0
    case spv::Op::OpConstantFunctionPointerINTEL:
553
      // The Function parameter.
554
0
      out = [](unsigned index) { return index == 2; };
555
0
      break;
556
557
232
    case spv::Op::OpPhi:
558
232
      out = [](unsigned index) { return index > 1; };
559
232
      break;
560
561
0
    case spv::Op::OpEnqueueKernel:
562
      // The Invoke parameter.
563
0
      out = [](unsigned index) { return index == 8; };
564
0
      break;
565
566
0
    case spv::Op::OpGetKernelNDrangeSubGroupCount:
567
0
    case spv::Op::OpGetKernelNDrangeMaxSubGroupSize:
568
      // The Invoke parameter.
569
0
      out = [](unsigned index) { return index == 3; };
570
0
      break;
571
572
0
    case spv::Op::OpGetKernelWorkGroupSize:
573
0
    case spv::Op::OpGetKernelPreferredWorkGroupSizeMultiple:
574
      // The Invoke parameter.
575
0
      out = [](unsigned index) { return index == 2; };
576
0
      break;
577
28
    case spv::Op::OpTypeForwardPointer:
578
28
      out = [](unsigned index) { return index == 0; };
579
28
      break;
580
0
    case spv::Op::OpTypeArray:
581
0
      out = [](unsigned index) { return index == 1; };
582
0
      break;
583
0
    case spv::Op::OpCooperativeMatrixPerElementOpEXT:
584
0
      out = [](unsigned index) { return index == 3; };
585
0
      break;
586
0
    case spv::Op::OpCooperativeMatrixReduceEXT:
587
0
      out = [](unsigned index) { return index == 4; };
588
0
      break;
589
0
    case spv::Op::OpCooperativeMatrixLoadTensorNV:
590
      // approximate, due to variable operands
591
0
      out = [](unsigned index) { return index > 6; };
592
0
      break;
593
0
    case spv::Op::OpGraphEntryPointARM:
594
0
      out = [](unsigned index) { return index == 0; };
595
0
      break;
596
0
    case spv::Op::OpExtInstWithForwardRefsKHR:
597
      // Any operand may be a forward reference.
598
0
      out = [](unsigned) { return true; };
599
0
      break;
600
76.9k
    default:
601
76.9k
      out = [](unsigned) { return false; };
602
76.9k
      break;
603
103k
  }
604
103k
  return out;
605
103k
}
606
607
std::function<bool(unsigned)> spvDbgInfoExtOperandCanBeForwardDeclaredFunction(
608
0
    spv::Op opcode, spv_ext_inst_type_t ext_type, uint32_t key) {
609
  // The Vulkan debug info extended instruction set is non-semantic so allows no
610
  // forward references except if used through OpExtInstWithForwardRefsKHR.
611
0
  if (ext_type == SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100) {
612
0
    return [opcode](unsigned) {
613
0
      return opcode == spv::Op::OpExtInstWithForwardRefsKHR;
614
0
    };
615
0
  }
616
617
  // TODO(https://gitlab.khronos.org/spirv/SPIR-V/issues/532): Forward
618
  // references for debug info instructions are still in discussion. We must
619
  // update the following lines of code when we conclude the spec.
620
0
  std::function<bool(unsigned index)> out;
621
0
  if (ext_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100) {
622
0
    switch (OpenCLDebugInfo100Instructions(key)) {
623
0
      case OpenCLDebugInfo100DebugFunction:
624
0
        out = [](unsigned index) { return index == 13; };
625
0
        break;
626
0
      case OpenCLDebugInfo100DebugTypeComposite:
627
0
        out = [](unsigned index) { return index >= 13; };
628
0
        break;
629
0
      default:
630
0
        out = [](unsigned) { return false; };
631
0
        break;
632
0
    }
633
0
  } else {
634
0
    switch (DebugInfoInstructions(key)) {
635
0
      case DebugInfoDebugFunction:
636
0
        out = [](unsigned index) { return index == 13; };
637
0
        break;
638
0
      case DebugInfoDebugTypeComposite:
639
0
        out = [](unsigned index) { return index >= 12; };
640
0
        break;
641
0
      default:
642
0
        out = [](unsigned) { return false; };
643
0
        break;
644
0
    }
645
0
  }
646
0
  return out;
647
0
}
648
649
0
spv_fp_encoding_t spvFPEncodingFromOperandFPEncoding(spv::FPEncoding encoding) {
650
0
  switch (encoding) {
651
0
    case spv::FPEncoding::BFloat16KHR:
652
0
      return SPV_FP_ENCODING_BFLOAT16;
653
0
    case spv::FPEncoding::Float8E4M3EXT:
654
0
      return SPV_FP_ENCODING_FLOAT8_E4M3;
655
0
    case spv::FPEncoding::Float8E5M2EXT:
656
0
      return SPV_FP_ENCODING_FLOAT8_E5M2;
657
0
    case spv::FPEncoding::Float6E2M3EXT:
658
0
      return SPV_FP_ENCODING_FLOAT6_E2M3;
659
0
    case spv::FPEncoding::Float6E3M2EXT:
660
0
      return SPV_FP_ENCODING_FLOAT6_E3M2;
661
0
    case spv::FPEncoding::Float4E2M1EXT:
662
0
      return SPV_FP_ENCODING_FLOAT4_E2M1;
663
0
    case spv::FPEncoding::Float8UnsignedE8M0EXT:
664
0
      return SPV_FP_ENCODING_FLOAT8_UNSIGNED_E8M0;
665
0
    case spv::FPEncoding::MXInt8EXT:
666
0
      return SPV_FP_ENCODING_MXINT8;
667
0
    case spv::FPEncoding::Max:
668
0
      break;
669
0
  }
670
0
  return SPV_FP_ENCODING_UNKNOWN;
671
0
}