Coverage Report

Created: 2026-06-08 19:29

/home/runner/work/DirectXShaderCompiler/DirectXShaderCompiler/external/SPIRV-Tools/source/operand.cpp
Line
Count
Source (jump to first uncovered line)
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
6
const char* spvOperandTypeStr(spv_operand_type_t type) {
33
6
  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
6
    case SPV_OPERAND_TYPE_EXECUTION_MODE:
66
6
      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
6
  }
234
0
  return "unknown";
235
6
}
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
2.72M
    spv_operand_pattern_t* pattern) {
252
  // Push them on in backward order.
253
2.72M
  auto n = types.size();
254
8.06M
  for (auto i = 0u; i < n; 
i++5.34M
) {
255
5.34M
    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
5.34M
    if (type != SPV_OPERAND_TYPE_NONE) {
259
5.34M
      pattern->push_back(type);
260
5.34M
    }
261
5.34M
  }
262
2.72M
}
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
4
bool spvOperandIsConcrete(spv_operand_type_t type) {
281
4
  if (spvIsIdType(type) || spvOperandIsConcreteMask(type)) {
282
0
    return true;
283
0
  }
284
4
  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
4
    case SPV_OPERAND_TYPE_PACKED_VECTOR_FORMAT:
331
4
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_LAYOUT:
332
4
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_USE:
333
4
    case SPV_OPERAND_TYPE_INITIALIZATION_MODE_QUALIFIER:
334
4
    case SPV_OPERAND_TYPE_HOST_ACCESS_QUALIFIER:
335
4
    case SPV_OPERAND_TYPE_LOAD_CACHE_CONTROL:
336
4
    case SPV_OPERAND_TYPE_STORE_CACHE_CONTROL:
337
4
    case SPV_OPERAND_TYPE_NAMED_MAXIMUM_NUMBER_OF_REGISTERS:
338
4
    case SPV_OPERAND_TYPE_FPENCODING:
339
4
    case SPV_OPERAND_TYPE_TENSOR_CLAMP_MODE:
340
4
    case SPV_OPERAND_TYPE_COOPERATIVE_VECTOR_MATRIX_LAYOUT:
341
4
    case SPV_OPERAND_TYPE_COMPONENT_TYPE:
342
4
    case SPV_OPERAND_TYPE_KERNEL_PROPERTY_FLAGS:
343
4
    case SPV_OPERAND_TYPE_SHDEBUG100_BUILD_IDENTIFIER_FLAGS:
344
4
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
345
4
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_COMPOSITE_TYPE:
346
4
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_IMPORTED_ENTITY:
347
4
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_INFO_FLAGS:
348
4
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_OPERATION:
349
4
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_TYPE_QUALIFIER:
350
4
      return true;
351
0
    default:
352
0
      break;
353
4
  }
354
0
  return false;
355
4
}
356
357
956k
bool spvOperandIsConcreteMask(spv_operand_type_t type) {
358
956k
  switch (type) {
359
2.05k
    case SPV_OPERAND_TYPE_IMAGE:
360
2.05k
    case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
361
2.81k
    case SPV_OPERAND_TYPE_SELECTION_CONTROL:
362
3.01k
    case SPV_OPERAND_TYPE_LOOP_CONTROL:
363
10.1k
    case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
364
10.5k
    case SPV_OPERAND_TYPE_MEMORY_ACCESS:
365
10.5k
    case SPV_OPERAND_TYPE_FRAGMENT_SHADING_RATE:
366
10.5k
    case SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS:
367
11.3k
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_INFO_FLAGS:
368
11.3k
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_OPERANDS:
369
11.3k
    case SPV_OPERAND_TYPE_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
370
11.3k
    case SPV_OPERAND_TYPE_RAW_ACCESS_CHAIN_OPERANDS:
371
11.3k
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_REDUCE:
372
11.3k
    case SPV_OPERAND_TYPE_TENSOR_ADDRESSING_OPERANDS:
373
11.3k
    case SPV_OPERAND_TYPE_TENSOR_OPERANDS:
374
11.3k
      return true;
375
944k
    default:
376
944k
      break;
377
956k
  }
378
944k
  return false;
379
956k
}
380
381
603k
bool spvOperandIsOptional(spv_operand_type_t type) {
382
603k
  switch (type) {
383
141k
    case SPV_OPERAND_TYPE_OPTIONAL_ID:
384
141k
    case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
385
339k
    case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
386
339k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
387
339k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
388
339k
    case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
389
339k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
390
347k
    case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
391
347k
    case SPV_OPERAND_TYPE_OPTIONAL_PACKED_VECTOR_FORMAT:
392
347k
    case SPV_OPERAND_TYPE_OPTIONAL_COOPERATIVE_MATRIX_OPERANDS:
393
347k
    case SPV_OPERAND_TYPE_OPTIONAL_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
394
347k
    case SPV_OPERAND_TYPE_OPTIONAL_CIV:
395
347k
    case SPV_OPERAND_TYPE_OPTIONAL_RAW_ACCESS_CHAIN_OPERANDS:
396
360k
    case SPV_OPERAND_TYPE_OPTIONAL_FPENCODING:
397
360k
    case SPV_OPERAND_TYPE_OPTIONAL_TENSOR_OPERANDS:
398
360k
    case SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY:
399
360k
      return true;
400
242k
    default:
401
242k
      break;
402
603k
  }
403
  // Any variable operand is also optional.
404
242k
  return spvOperandIsVariable(type);
405
603k
}
406
407
242k
bool spvOperandIsVariable(spv_operand_type_t type) {
408
242k
  switch (type) {
409
187k
    case SPV_OPERAND_TYPE_VARIABLE_ID:
410
242k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
411
242k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
412
242k
    case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
413
242k
    case SPV_OPERAND_TYPE_VARIABLE_CAPABILITY:
414
242k
      return true;
415
0
    default:
416
0
      break;
417
242k
  }
418
0
  return false;
419
242k
}
420
421
bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
422
5.41M
                                  spv_operand_pattern_t* pattern) {
423
5.41M
  switch (type) {
424
284k
    case SPV_OPERAND_TYPE_VARIABLE_ID:
425
284k
      pattern->push_back(type);
426
284k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
427
284k
      return true;
428
56.2k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
429
56.2k
      pattern->push_back(type);
430
56.2k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER);
431
56.2k
      return true;
432
934
    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
934
      pattern->push_back(type);
436
934
      pattern->push_back(SPV_OPERAND_TYPE_ID);
437
934
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER);
438
934
      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
5.07M
    default:
450
5.07M
      break;
451
5.41M
  }
452
5.07M
  return false;
453
5.41M
}
454
455
spv_operand_type_t spvTakeFirstMatchableOperand(
456
5.07M
    spv_operand_pattern_t* pattern) {
457
5.07M
  assert(!pattern->empty());
458
5.07M
  spv_operand_type_t result;
459
5.41M
  do {
460
5.41M
    result = pattern->back();
461
5.41M
    pattern->pop_back();
462
5.41M
  } while (spvExpandOperandSequenceOnce(result, pattern));
463
5.07M
  return result;
464
5.07M
}
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
3.57M
bool spvIsIdType(spv_operand_type_t type) {
482
3.57M
  switch (type) {
483
1.40M
    case SPV_OPERAND_TYPE_ID:
484
1.88M
    case SPV_OPERAND_TYPE_TYPE_ID:
485
2.60M
    case SPV_OPERAND_TYPE_RESULT_ID:
486
2.60M
    case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
487
2.61M
    case SPV_OPERAND_TYPE_SCOPE_ID:
488
2.61M
      return true;
489
966k
    default:
490
966k
      return false;
491
3.57M
  }
492
3.57M
}
493
494
877k
bool spvIsInIdType(spv_operand_type_t type) {
495
877k
  if (!spvIsIdType(type)) {
496
    // If it is not an ID it cannot be an input ID.
497
139k
    return false;
498
139k
  }
499
738k
  switch (type) {
500
    // Deny non-input IDs.
501
143k
    case SPV_OPERAND_TYPE_TYPE_ID:
502
372k
    case SPV_OPERAND_TYPE_RESULT_ID:
503
372k
      return false;
504
365k
    default:
505
365k
      return true;
506
738k
  }
507
738k
}
508
509
std::function<bool(unsigned)> spvOperandCanBeForwardDeclaredFunction(
510
337k
    spv::Op opcode) {
511
337k
  std::function<bool(unsigned index)> out;
512
337k
  if (spvOpcodeGeneratesType(opcode)) {
513
    // All types can use forward pointers.
514
49.0k
    out = [](unsigned) 
{ return true; }2
;
515
49.0k
    return out;
516
49.0k
  }
517
288k
  switch (opcode) {
518
2.95k
    case spv::Op::OpExecutionMode:
519
3.05k
    case spv::Op::OpExecutionModeId:
520
6.05k
    case spv::Op::OpEntryPoint:
521
46.2k
    case spv::Op::OpName:
522
52.4k
    case spv::Op::OpMemberName:
523
53.1k
    case spv::Op::OpSelectionMerge:
524
70.9k
    case spv::Op::OpDecorate:
525
76.6k
    case spv::Op::OpMemberDecorate:
526
76.6k
    case spv::Op::OpMemberDecorateIdEXT:
527
76.7k
    case spv::Op::OpDecorateId:
528
76.9k
    case spv::Op::OpDecorateStringGOOGLE:
529
76.9k
    case spv::Op::OpMemberDecorateStringGOOGLE:
530
78.4k
    case spv::Op::OpBranch:
531
78.6k
    case spv::Op::OpLoopMerge:
532
78.6k
    case spv::Op::OpConditionalEntryPointINTEL:
533
78.6k
    case spv::Op::OpConditionalCapabilityINTEL:
534
78.6k
    case spv::Op::OpConditionalExtensionINTEL:
535
84.4k
      out = [](unsigned) { return true; };
536
78.6k
      break;
537
0
    case spv::Op::OpGroupDecorate:
538
0
    case spv::Op::OpGroupMemberDecorate:
539
748
    case spv::Op::OpBranchConditional:
540
830
    case spv::Op::OpSwitch:
541
1.72k
      out = [](unsigned index) { return index != 0; };
542
830
      break;
543
544
3.28k
    case spv::Op::OpFunctionCall:
545
      // The Function parameter.
546
3.28k
      out = [](unsigned index) 
{ return index == 2; }3.27k
;
547
3.28k
      break;
548
549
0
    case spv::Op::OpConstantFunctionPointerINTEL:
550
      // The Function parameter.
551
0
      out = [](unsigned index) { return index == 2; };
552
0
      break;
553
554
34
    case spv::Op::OpPhi:
555
34
      out = [](unsigned index) 
{ return index > 1; }24
;
556
34
      break;
557
558
0
    case spv::Op::OpEnqueueKernel:
559
      // The Invoke parameter.
560
0
      out = [](unsigned index) { return index == 8; };
561
0
      break;
562
563
0
    case spv::Op::OpGetKernelNDrangeSubGroupCount:
564
0
    case spv::Op::OpGetKernelNDrangeMaxSubGroupSize:
565
      // The Invoke parameter.
566
0
      out = [](unsigned index) { return index == 3; };
567
0
      break;
568
569
0
    case spv::Op::OpGetKernelWorkGroupSize:
570
0
    case spv::Op::OpGetKernelPreferredWorkGroupSizeMultiple:
571
      // The Invoke parameter.
572
0
      out = [](unsigned index) { return index == 2; };
573
0
      break;
574
2
    case spv::Op::OpTypeForwardPointer:
575
2
      out = [](unsigned index) { return index == 0; };
576
2
      break;
577
0
    case spv::Op::OpTypeArray:
578
0
      out = [](unsigned index) { return index == 1; };
579
0
      break;
580
0
    case spv::Op::OpCooperativeMatrixPerElementOpNV:
581
0
      out = [](unsigned index) { return index == 3; };
582
0
      break;
583
0
    case spv::Op::OpCooperativeMatrixReduceNV:
584
0
      out = [](unsigned index) { return index == 4; };
585
0
      break;
586
0
    case spv::Op::OpCooperativeMatrixLoadTensorNV:
587
      // approximate, due to variable operands
588
0
      out = [](unsigned index) { return index > 6; };
589
0
      break;
590
0
    case spv::Op::OpGraphEntryPointARM:
591
0
      out = [](unsigned index) { return index == 0; };
592
0
      break;
593
205k
    default:
594
205k
      out = [](unsigned) 
{ return false; }0
;
595
205k
      break;
596
288k
  }
597
288k
  return out;
598
288k
}
599
600
std::function<bool(unsigned)> spvDbgInfoExtOperandCanBeForwardDeclaredFunction(
601
5.55k
    spv::Op opcode, spv_ext_inst_type_t ext_type, uint32_t key) {
602
  // The Vulkan debug info extended instruction set is non-semantic so allows no
603
  // forward references except if used through OpExtInstWithForwardRefsKHR.
604
5.55k
  if (ext_type == SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100) {
605
3.32k
    return [opcode](unsigned) {
606
6
      return opcode == spv::Op::OpExtInstWithForwardRefsKHR;
607
6
    };
608
3.32k
  }
609
610
  // TODO(https://gitlab.khronos.org/spirv/SPIR-V/issues/532): Forward
611
  // references for debug info instructions are still in discussion. We must
612
  // update the following lines of code when we conclude the spec.
613
2.23k
  std::function<bool(unsigned index)> out;
614
2.23k
  if (ext_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100) {
615
2.23k
    switch (OpenCLDebugInfo100Instructions(key)) {
616
200
      case OpenCLDebugInfo100DebugFunction:
617
200
        out = [](unsigned index) { return index == 13; };
618
200
        break;
619
64
      case OpenCLDebugInfo100DebugTypeComposite:
620
78
        out = [](unsigned index) { return index >= 13; };
621
64
        break;
622
1.96k
      default:
623
1.96k
        out = [](unsigned) 
{ return false; }0
;
624
1.96k
        break;
625
2.23k
    }
626
2.23k
  } else {
627
0
    switch (DebugInfoInstructions(key)) {
628
0
      case DebugInfoDebugFunction:
629
0
        out = [](unsigned index) { return index == 13; };
630
0
        break;
631
0
      case DebugInfoDebugTypeComposite:
632
0
        out = [](unsigned index) { return index >= 12; };
633
0
        break;
634
0
      default:
635
0
        out = [](unsigned) { return false; };
636
0
        break;
637
0
    }
638
0
  }
639
2.23k
  return out;
640
2.23k
}
641
642
0
spv_fp_encoding_t spvFPEncodingFromOperandFPEncoding(spv::FPEncoding encoding) {
643
0
  switch (encoding) {
644
0
    case spv::FPEncoding::BFloat16KHR:
645
0
      return SPV_FP_ENCODING_BFLOAT16;
646
0
    case spv::FPEncoding::Float8E4M3EXT:
647
0
      return SPV_FP_ENCODING_FLOAT8_E4M3;
648
0
    case spv::FPEncoding::Float8E5M2EXT:
649
0
      return SPV_FP_ENCODING_FLOAT8_E5M2;
650
0
    case spv::FPEncoding::Max:
651
0
      break;
652
0
  }
653
0
  return SPV_FP_ENCODING_UNKNOWN;
654
0
}