فهرست منبع

Updated spirv-tools.

Бранимир Караџић 6 سال پیش
والد
کامیت
afff54d782
96فایلهای تغییر یافته به همراه2620 افزوده شده و 1247 حذف شده
  1. 0 1
      3rdparty/spirv-tools/Android.mk
  2. 0 2
      3rdparty/spirv-tools/BUILD.gn
  3. 1 1
      3rdparty/spirv-tools/include/generated/build-version.inc
  4. 6 6
      3rdparty/spirv-tools/include/generated/core.insts-unified1.inc
  5. 34 30
      3rdparty/spirv-tools/include/generated/enum_string_mapping.inc
  6. 82 48
      3rdparty/spirv-tools/include/generated/operand.kinds-unified1.inc
  7. 1 0
      3rdparty/spirv-tools/include/spirv-tools/libspirv.h
  8. 1 0
      3rdparty/spirv-tools/source/ext_inst.cpp
  9. 2 0
      3rdparty/spirv-tools/source/fuzz/CMakeLists.txt
  10. 4 0
      3rdparty/spirv-tools/source/fuzz/fuzzer.cpp
  11. 7 2
      3rdparty/spirv-tools/source/fuzz/fuzzer_context.cpp
  12. 21 6
      3rdparty/spirv-tools/source/fuzz/fuzzer_context.h
  13. 4 6
      3rdparty/spirv-tools/source/fuzz/fuzzer_pass_add_dead_breaks.cpp
  14. 3 4
      3rdparty/spirv-tools/source/fuzz/fuzzer_pass_add_dead_continues.cpp
  15. 148 0
      3rdparty/spirv-tools/source/fuzz/fuzzer_pass_copy_objects.cpp
  16. 38 0
      3rdparty/spirv-tools/source/fuzz/fuzzer_pass_copy_objects.h
  17. 15 24
      3rdparty/spirv-tools/source/fuzz/fuzzer_pass_obfuscate_constants.cpp
  18. 2 2
      3rdparty/spirv-tools/source/fuzz/fuzzer_pass_permute_blocks.cpp
  19. 5 5
      3rdparty/spirv-tools/source/fuzz/fuzzer_pass_split_blocks.cpp
  20. 161 0
      3rdparty/spirv-tools/source/fuzz/fuzzer_util.cpp
  21. 13 0
      3rdparty/spirv-tools/source/fuzz/fuzzer_util.h
  22. 6 4
      3rdparty/spirv-tools/source/fuzz/transformation.cpp
  23. 9 2
      3rdparty/spirv-tools/source/fuzz/transformation_add_dead_break.cpp
  24. 2 0
      3rdparty/spirv-tools/source/fuzz/transformation_add_dead_break.h
  25. 7 0
      3rdparty/spirv-tools/source/fuzz/transformation_add_dead_continue.cpp
  26. 3 0
      3rdparty/spirv-tools/source/fuzz/transformation_add_dead_continue.h
  27. 42 26
      3rdparty/spirv-tools/source/fuzz/transformation_copy_object.cpp
  28. 10 2
      3rdparty/spirv-tools/source/fuzz/transformation_copy_object.h
  29. 0 2
      3rdparty/spirv-tools/source/opt/CMakeLists.txt
  30. 12 1
      3rdparty/spirv-tools/source/opt/cfg.cpp
  31. 9 6
      3rdparty/spirv-tools/source/opt/cfg.h
  32. 3 0
      3rdparty/spirv-tools/source/opt/fold.cpp
  33. 4 0
      3rdparty/spirv-tools/source/opt/generate_webgpu_initializers_pass.cpp
  34. 9 0
      3rdparty/spirv-tools/source/opt/inline_pass.cpp
  35. 0 113
      3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.cpp
  36. 0 72
      3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.h
  37. 4 0
      3rdparty/spirv-tools/source/opt/mem_pass.cpp
  38. 4 3
      3rdparty/spirv-tools/source/opt/mem_pass.h
  39. 1 1
      3rdparty/spirv-tools/source/opt/optimizer.cpp
  40. 0 1
      3rdparty/spirv-tools/source/opt/passes.h
  41. 34 12
      3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.cpp
  42. 7 7
      3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.h
  43. 6 1
      3rdparty/spirv-tools/source/opt/wrap_opkill.cpp
  44. 11 1
      3rdparty/spirv-tools/source/spirv_target_env.cpp
  45. 1 0
      3rdparty/spirv-tools/source/table.cpp
  46. 5 0
      3rdparty/spirv-tools/source/text.cpp
  47. 20 12
      3rdparty/spirv-tools/source/val/validate_builtins.cpp
  48. 14 7
      3rdparty/spirv-tools/source/val/validate_instruction.cpp
  49. 11 1
      3rdparty/spirv-tools/source/val/validation_state.h
  50. 14 1
      3rdparty/spirv-tools/test/assembly_format_test.cpp
  51. 2 2
      3rdparty/spirv-tools/test/c_interface_test.cpp
  52. 479 0
      3rdparty/spirv-tools/test/fuzz/transformation_add_dead_break_test.cpp
  53. 220 0
      3rdparty/spirv-tools/test/fuzz/transformation_add_dead_continue_test.cpp
  54. 14 2
      3rdparty/spirv-tools/test/operand_capabilities_test.cpp
  55. 29 29
      3rdparty/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp
  56. 3 3
      3rdparty/spirv-tools/test/opt/ccp_test.cpp
  57. 22 0
      3rdparty/spirv-tools/test/opt/constant_manager_test.cpp
  58. 1 1
      3rdparty/spirv-tools/test/opt/copy_prop_array_test.cpp
  59. 4 4
      3rdparty/spirv-tools/test/opt/decompose_initialized_variables_test.cpp
  60. 14 14
      3rdparty/spirv-tools/test/opt/generate_webgpu_initializers_test.cpp
  61. 1 1
      3rdparty/spirv-tools/test/opt/graphics_robust_access_test.cpp
  62. 40 176
      3rdparty/spirv-tools/test/opt/inline_test.cpp
  63. 146 146
      3rdparty/spirv-tools/test/opt/inst_bindless_check_test.cpp
  64. 50 50
      3rdparty/spirv-tools/test/opt/inst_buff_addr_check_test.cpp
  65. 2 2
      3rdparty/spirv-tools/test/opt/legalize_vector_shuffle_test.cpp
  66. 62 27
      3rdparty/spirv-tools/test/opt/local_ssa_elim_test.cpp
  67. 43 42
      3rdparty/spirv-tools/test/opt/optimizer_test.cpp
  68. 6 6
      3rdparty/spirv-tools/test/opt/simplification_test.cpp
  69. 2 2
      3rdparty/spirv-tools/test/opt/split_invalid_unreachable_test.cpp
  70. 4 4
      3rdparty/spirv-tools/test/opt/strip_atomic_counter_memory_test.cpp
  71. 86 86
      3rdparty/spirv-tools/test/opt/upgrade_memory_model_test.cpp
  72. 24 0
      3rdparty/spirv-tools/test/opt/wrap_opkill_test.cpp
  73. 9 5
      3rdparty/spirv-tools/test/text_to_binary.constant_test.cpp
  74. 6 3
      3rdparty/spirv-tools/test/text_to_binary.control_flow_test.cpp
  75. 49 49
      3rdparty/spirv-tools/test/text_to_binary.extension_test.cpp
  76. 14 14
      3rdparty/spirv-tools/test/text_to_binary.memory_test.cpp
  77. 3 3
      3rdparty/spirv-tools/test/tools/expect.py
  78. 9 9
      3rdparty/spirv-tools/test/tools/opt/flags.py
  79. 7 1
      3rdparty/spirv-tools/test/val/CMakeLists.txt
  80. 2 2
      3rdparty/spirv-tools/test/val/val_adjacency_test.cpp
  81. 9 9
      3rdparty/spirv-tools/test/val/val_atomics_test.cpp
  82. 75 3
      3rdparty/spirv-tools/test/val/val_builtins_test.cpp
  83. 318 96
      3rdparty/spirv-tools/test/val/val_capability_test.cpp
  84. 2 1
      3rdparty/spirv-tools/test/val/val_decoration_test.cpp
  85. 2 2
      3rdparty/spirv-tools/test/val/val_id_test.cpp
  86. 23 23
      3rdparty/spirv-tools/test/val/val_image_test.cpp
  87. 4 4
      3rdparty/spirv-tools/test/val/val_limits_test.cpp
  88. 5 6
      3rdparty/spirv-tools/test/val/val_memory_test.cpp
  89. 1 1
      3rdparty/spirv-tools/test/val/val_webgpu_test.cpp
  90. 1 1
      3rdparty/spirv-tools/tools/as/as.cpp
  91. 1 1
      3rdparty/spirv-tools/tools/cfg/cfg.cpp
  92. 1 1
      3rdparty/spirv-tools/tools/dis/dis.cpp
  93. 1 1
      3rdparty/spirv-tools/tools/opt/opt.cpp
  94. 1 1
      3rdparty/spirv-tools/tools/reduce/reduce.cpp
  95. 3 2
      3rdparty/spirv-tools/tools/val/val.cpp
  96. 24 0
      3rdparty/spirv-tools/utils/generate_grammar_tables.py

+ 0 - 1
3rdparty/spirv-tools/Android.mk

@@ -131,7 +131,6 @@ SPVTOOLS_OPT_SRC_FILES := \
 		source/opt/local_redundancy_elimination.cpp \
 		source/opt/local_redundancy_elimination.cpp \
 		source/opt/local_single_block_elim_pass.cpp \
 		source/opt/local_single_block_elim_pass.cpp \
 		source/opt/local_single_store_elim_pass.cpp \
 		source/opt/local_single_store_elim_pass.cpp \
-		source/opt/local_ssa_elim_pass.cpp \
 		source/opt/loop_dependence.cpp \
 		source/opt/loop_dependence.cpp \
 		source/opt/loop_dependence_helpers.cpp \
 		source/opt/loop_dependence_helpers.cpp \
 		source/opt/loop_descriptor.cpp \
 		source/opt/loop_descriptor.cpp \

+ 0 - 2
3rdparty/spirv-tools/BUILD.gn

@@ -565,8 +565,6 @@ static_library("spvtools_opt") {
     "source/opt/local_single_block_elim_pass.h",
     "source/opt/local_single_block_elim_pass.h",
     "source/opt/local_single_store_elim_pass.cpp",
     "source/opt/local_single_store_elim_pass.cpp",
     "source/opt/local_single_store_elim_pass.h",
     "source/opt/local_single_store_elim_pass.h",
-    "source/opt/local_ssa_elim_pass.cpp",
-    "source/opt/local_ssa_elim_pass.h",
     "source/opt/log.h",
     "source/opt/log.h",
     "source/opt/loop_dependence.cpp",
     "source/opt/loop_dependence.cpp",
     "source/opt/loop_dependence.h",
     "source/opt/loop_dependence.h",

+ 1 - 1
3rdparty/spirv-tools/include/generated/build-version.inc

@@ -1 +1 @@
-"v2019.5-dev", "SPIRV-Tools v2019.5-dev v2019.4-37-g76261e2a"
+"v2019.5-dev", "SPIRV-Tools v2019.5-dev v2019.4-51-g1e146e8a"

+ 6 - 6
3rdparty/spirv-tools/include/generated/core.insts-unified1.inc

@@ -1,7 +1,7 @@
 static const SpvCapability pygen_variable_caps_Addresses[] = {SpvCapabilityAddresses};
 static const SpvCapability pygen_variable_caps_Addresses[] = {SpvCapabilityAddresses};
-static const SpvCapability pygen_variable_caps_AddressesPhysicalStorageBufferAddressesEXT[] = {SpvCapabilityAddresses, SpvCapabilityPhysicalStorageBufferAddressesEXT};
+static const SpvCapability pygen_variable_caps_AddressesPhysicalStorageBufferAddresses[] = {SpvCapabilityAddresses, SpvCapabilityPhysicalStorageBufferAddresses};
 static const SpvCapability pygen_variable_caps_AddressesVariablePointersVariablePointersStorageBuffer[] = {SpvCapabilityAddresses, SpvCapabilityVariablePointers, SpvCapabilityVariablePointersStorageBuffer};
 static const SpvCapability pygen_variable_caps_AddressesVariablePointersVariablePointersStorageBuffer[] = {SpvCapabilityAddresses, SpvCapabilityVariablePointers, SpvCapabilityVariablePointersStorageBuffer};
-static const SpvCapability pygen_variable_caps_AddressesVariablePointersVariablePointersStorageBufferPhysicalStorageBufferAddressesEXT[] = {SpvCapabilityAddresses, SpvCapabilityVariablePointers, SpvCapabilityVariablePointersStorageBuffer, SpvCapabilityPhysicalStorageBufferAddressesEXT};
+static const SpvCapability pygen_variable_caps_AddressesVariablePointersVariablePointersStorageBufferPhysicalStorageBufferAddresses[] = {SpvCapabilityAddresses, SpvCapabilityVariablePointers, SpvCapabilityVariablePointersStorageBuffer, SpvCapabilityPhysicalStorageBufferAddresses};
 static const SpvCapability pygen_variable_caps_CooperativeMatrixNV[] = {SpvCapabilityCooperativeMatrixNV};
 static const SpvCapability pygen_variable_caps_CooperativeMatrixNV[] = {SpvCapabilityCooperativeMatrixNV};
 static const SpvCapability pygen_variable_caps_DemoteToHelperInvocationEXT[] = {SpvCapabilityDemoteToHelperInvocationEXT};
 static const SpvCapability pygen_variable_caps_DemoteToHelperInvocationEXT[] = {SpvCapabilityDemoteToHelperInvocationEXT};
 static const SpvCapability pygen_variable_caps_DerivativeControl[] = {SpvCapabilityDerivativeControl};
 static const SpvCapability pygen_variable_caps_DerivativeControl[] = {SpvCapabilityDerivativeControl};
@@ -97,7 +97,7 @@ static const spv_opcode_desc_t kOpcodeTableEntries[] = {
   {"TypeReserveId", SpvOpTypeReserveId, 1, pygen_variable_caps_Pipes, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TypeReserveId", SpvOpTypeReserveId, 1, pygen_variable_caps_Pipes, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TypeQueue", SpvOpTypeQueue, 1, pygen_variable_caps_DeviceEnqueue, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TypeQueue", SpvOpTypeQueue, 1, pygen_variable_caps_DeviceEnqueue, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TypePipe", SpvOpTypePipe, 1, pygen_variable_caps_Pipes, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ACCESS_QUALIFIER}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TypePipe", SpvOpTypePipe, 1, pygen_variable_caps_Pipes, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ACCESS_QUALIFIER}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"TypeForwardPointer", SpvOpTypeForwardPointer, 2, pygen_variable_caps_AddressesPhysicalStorageBufferAddressesEXT, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_STORAGE_CLASS}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
+  {"TypeForwardPointer", SpvOpTypeForwardPointer, 2, pygen_variable_caps_AddressesPhysicalStorageBufferAddresses, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_STORAGE_CLASS}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ConstantTrue", SpvOpConstantTrue, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ConstantTrue", SpvOpConstantTrue, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ConstantFalse", SpvOpConstantFalse, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ConstantFalse", SpvOpConstantFalse, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Constant", SpvOpConstant, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Constant", SpvOpConstant, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
@@ -121,7 +121,7 @@ static const spv_opcode_desc_t kOpcodeTableEntries[] = {
   {"CopyMemorySized", SpvOpCopyMemorySized, 1, pygen_variable_caps_Addresses, 5, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"CopyMemorySized", SpvOpCopyMemorySized, 1, pygen_variable_caps_Addresses, 5, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"AccessChain", SpvOpAccessChain, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"AccessChain", SpvOpAccessChain, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"InBoundsAccessChain", SpvOpInBoundsAccessChain, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"InBoundsAccessChain", SpvOpInBoundsAccessChain, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"PtrAccessChain", SpvOpPtrAccessChain, 4, pygen_variable_caps_AddressesVariablePointersVariablePointersStorageBufferPhysicalStorageBufferAddressesEXT, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
+  {"PtrAccessChain", SpvOpPtrAccessChain, 4, pygen_variable_caps_AddressesVariablePointersVariablePointersStorageBufferPhysicalStorageBufferAddresses, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ArrayLength", SpvOpArrayLength, 1, pygen_variable_caps_Shader, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ArrayLength", SpvOpArrayLength, 1, pygen_variable_caps_Shader, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"GenericPtrMemSemantics", SpvOpGenericPtrMemSemantics, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"GenericPtrMemSemantics", SpvOpGenericPtrMemSemantics, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"InBoundsPtrAccessChain", SpvOpInBoundsPtrAccessChain, 1, pygen_variable_caps_Addresses, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"InBoundsPtrAccessChain", SpvOpInBoundsPtrAccessChain, 1, pygen_variable_caps_Addresses, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
@@ -168,10 +168,10 @@ static const spv_opcode_desc_t kOpcodeTableEntries[] = {
   {"SConvert", SpvOpSConvert, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"SConvert", SpvOpSConvert, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"FConvert", SpvOpFConvert, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"FConvert", SpvOpFConvert, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"QuantizeToF16", SpvOpQuantizeToF16, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"QuantizeToF16", SpvOpQuantizeToF16, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"ConvertPtrToU", SpvOpConvertPtrToU, 2, pygen_variable_caps_AddressesPhysicalStorageBufferAddressesEXT, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
+  {"ConvertPtrToU", SpvOpConvertPtrToU, 2, pygen_variable_caps_AddressesPhysicalStorageBufferAddresses, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"SatConvertSToU", SpvOpSatConvertSToU, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"SatConvertSToU", SpvOpSatConvertSToU, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"SatConvertUToS", SpvOpSatConvertUToS, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"SatConvertUToS", SpvOpSatConvertUToS, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"ConvertUToPtr", SpvOpConvertUToPtr, 2, pygen_variable_caps_AddressesPhysicalStorageBufferAddressesEXT, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
+  {"ConvertUToPtr", SpvOpConvertUToPtr, 2, pygen_variable_caps_AddressesPhysicalStorageBufferAddresses, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"PtrCastToGeneric", SpvOpPtrCastToGeneric, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"PtrCastToGeneric", SpvOpPtrCastToGeneric, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"GenericCastToPtr", SpvOpGenericCastToPtr, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"GenericCastToPtr", SpvOpGenericCastToPtr, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"GenericCastToPtrExplicit", SpvOpGenericCastToPtrExplicit, 1, pygen_variable_caps_Kernel, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_STORAGE_CLASS}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"GenericCastToPtrExplicit", SpvOpGenericCastToPtrExplicit, 1, pygen_variable_caps_Kernel, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_STORAGE_CLASS}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},

+ 34 - 30
3rdparty/spirv-tools/include/generated/enum_string_mapping.inc

@@ -268,6 +268,10 @@ const char* CapabilityToString(SpvCapability capability) {
       return "GroupNonUniformClustered";
       return "GroupNonUniformClustered";
     case SpvCapabilityGroupNonUniformQuad:
     case SpvCapabilityGroupNonUniformQuad:
       return "GroupNonUniformQuad";
       return "GroupNonUniformQuad";
+    case SpvCapabilityShaderLayer:
+      return "ShaderLayer";
+    case SpvCapabilityShaderViewportIndex:
+      return "ShaderViewportIndex";
     case SpvCapabilitySubgroupBallotKHR:
     case SpvCapabilitySubgroupBallotKHR:
       return "SubgroupBallotKHR";
       return "SubgroupBallotKHR";
     case SpvCapabilityDrawParameters:
     case SpvCapabilityDrawParameters:
@@ -348,38 +352,38 @@ const char* CapabilityToString(SpvCapability capability) {
       return "FragmentDensityEXT";
       return "FragmentDensityEXT";
     case SpvCapabilityGroupNonUniformPartitionedNV:
     case SpvCapabilityGroupNonUniformPartitionedNV:
       return "GroupNonUniformPartitionedNV";
       return "GroupNonUniformPartitionedNV";
-    case SpvCapabilityShaderNonUniformEXT:
-      return "ShaderNonUniformEXT";
-    case SpvCapabilityRuntimeDescriptorArrayEXT:
-      return "RuntimeDescriptorArrayEXT";
-    case SpvCapabilityInputAttachmentArrayDynamicIndexingEXT:
-      return "InputAttachmentArrayDynamicIndexingEXT";
-    case SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT:
-      return "UniformTexelBufferArrayDynamicIndexingEXT";
-    case SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT:
-      return "StorageTexelBufferArrayDynamicIndexingEXT";
-    case SpvCapabilityUniformBufferArrayNonUniformIndexingEXT:
-      return "UniformBufferArrayNonUniformIndexingEXT";
-    case SpvCapabilitySampledImageArrayNonUniformIndexingEXT:
-      return "SampledImageArrayNonUniformIndexingEXT";
-    case SpvCapabilityStorageBufferArrayNonUniformIndexingEXT:
-      return "StorageBufferArrayNonUniformIndexingEXT";
-    case SpvCapabilityStorageImageArrayNonUniformIndexingEXT:
-      return "StorageImageArrayNonUniformIndexingEXT";
-    case SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT:
-      return "InputAttachmentArrayNonUniformIndexingEXT";
-    case SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT:
-      return "UniformTexelBufferArrayNonUniformIndexingEXT";
-    case SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT:
-      return "StorageTexelBufferArrayNonUniformIndexingEXT";
+    case SpvCapabilityShaderNonUniform:
+      return "ShaderNonUniform";
+    case SpvCapabilityRuntimeDescriptorArray:
+      return "RuntimeDescriptorArray";
+    case SpvCapabilityInputAttachmentArrayDynamicIndexing:
+      return "InputAttachmentArrayDynamicIndexing";
+    case SpvCapabilityUniformTexelBufferArrayDynamicIndexing:
+      return "UniformTexelBufferArrayDynamicIndexing";
+    case SpvCapabilityStorageTexelBufferArrayDynamicIndexing:
+      return "StorageTexelBufferArrayDynamicIndexing";
+    case SpvCapabilityUniformBufferArrayNonUniformIndexing:
+      return "UniformBufferArrayNonUniformIndexing";
+    case SpvCapabilitySampledImageArrayNonUniformIndexing:
+      return "SampledImageArrayNonUniformIndexing";
+    case SpvCapabilityStorageBufferArrayNonUniformIndexing:
+      return "StorageBufferArrayNonUniformIndexing";
+    case SpvCapabilityStorageImageArrayNonUniformIndexing:
+      return "StorageImageArrayNonUniformIndexing";
+    case SpvCapabilityInputAttachmentArrayNonUniformIndexing:
+      return "InputAttachmentArrayNonUniformIndexing";
+    case SpvCapabilityUniformTexelBufferArrayNonUniformIndexing:
+      return "UniformTexelBufferArrayNonUniformIndexing";
+    case SpvCapabilityStorageTexelBufferArrayNonUniformIndexing:
+      return "StorageTexelBufferArrayNonUniformIndexing";
     case SpvCapabilityRayTracingNV:
     case SpvCapabilityRayTracingNV:
       return "RayTracingNV";
       return "RayTracingNV";
-    case SpvCapabilityVulkanMemoryModelKHR:
-      return "VulkanMemoryModelKHR";
-    case SpvCapabilityVulkanMemoryModelDeviceScopeKHR:
-      return "VulkanMemoryModelDeviceScopeKHR";
-    case SpvCapabilityPhysicalStorageBufferAddressesEXT:
-      return "PhysicalStorageBufferAddressesEXT";
+    case SpvCapabilityVulkanMemoryModel:
+      return "VulkanMemoryModel";
+    case SpvCapabilityVulkanMemoryModelDeviceScope:
+      return "VulkanMemoryModelDeviceScope";
+    case SpvCapabilityPhysicalStorageBufferAddresses:
+      return "PhysicalStorageBufferAddresses";
     case SpvCapabilityComputeDerivativeGroupLinearNV:
     case SpvCapabilityComputeDerivativeGroupLinearNV:
       return "ComputeDerivativeGroupLinearNV";
       return "ComputeDerivativeGroupLinearNV";
     case SpvCapabilityCooperativeMatrixNV:
     case SpvCapabilityCooperativeMatrixNV:

+ 82 - 48
3rdparty/spirv-tools/include/generated/operand.kinds-unified1.inc

@@ -19,6 +19,7 @@ static const SpvCapability pygen_variable_caps_FragmentShaderShadingRateInterloc
 static const SpvCapability pygen_variable_caps_GenericPointer[] = {SpvCapabilityGenericPointer};
 static const SpvCapability pygen_variable_caps_GenericPointer[] = {SpvCapabilityGenericPointer};
 static const SpvCapability pygen_variable_caps_Geometry[] = {SpvCapabilityGeometry};
 static const SpvCapability pygen_variable_caps_Geometry[] = {SpvCapabilityGeometry};
 static const SpvCapability pygen_variable_caps_GeometryMeshShadingNV[] = {SpvCapabilityGeometry, SpvCapabilityMeshShadingNV};
 static const SpvCapability pygen_variable_caps_GeometryMeshShadingNV[] = {SpvCapabilityGeometry, SpvCapabilityMeshShadingNV};
+static const SpvCapability pygen_variable_caps_GeometryShaderLayerShaderViewportIndexLayerEXT[] = {SpvCapabilityGeometry, SpvCapabilityShaderLayer, SpvCapabilityShaderViewportIndexLayerEXT};
 static const SpvCapability pygen_variable_caps_GeometryTessellation[] = {SpvCapabilityGeometry, SpvCapabilityTessellation};
 static const SpvCapability pygen_variable_caps_GeometryTessellation[] = {SpvCapabilityGeometry, SpvCapabilityTessellation};
 static const SpvCapability pygen_variable_caps_GeometryTessellationMeshShadingNV[] = {SpvCapabilityGeometry, SpvCapabilityTessellation, SpvCapabilityMeshShadingNV};
 static const SpvCapability pygen_variable_caps_GeometryTessellationMeshShadingNV[] = {SpvCapabilityGeometry, SpvCapabilityTessellation, SpvCapabilityMeshShadingNV};
 static const SpvCapability pygen_variable_caps_GeometryTessellationRayTracingNV[] = {SpvCapabilityGeometry, SpvCapabilityTessellation, SpvCapabilityRayTracingNV};
 static const SpvCapability pygen_variable_caps_GeometryTessellationRayTracingNV[] = {SpvCapabilityGeometry, SpvCapabilityTessellation, SpvCapabilityRayTracingNV};
@@ -29,10 +30,10 @@ static const SpvCapability pygen_variable_caps_GroupNonUniformClustered[] = {Spv
 static const SpvCapability pygen_variable_caps_GroupNonUniformPartitionedNV[] = {SpvCapabilityGroupNonUniformPartitionedNV};
 static const SpvCapability pygen_variable_caps_GroupNonUniformPartitionedNV[] = {SpvCapabilityGroupNonUniformPartitionedNV};
 static const SpvCapability pygen_variable_caps_ImageBasic[] = {SpvCapabilityImageBasic};
 static const SpvCapability pygen_variable_caps_ImageBasic[] = {SpvCapabilityImageBasic};
 static const SpvCapability pygen_variable_caps_ImageBuffer[] = {SpvCapabilityImageBuffer};
 static const SpvCapability pygen_variable_caps_ImageBuffer[] = {SpvCapabilityImageBuffer};
-static const SpvCapability pygen_variable_caps_ImageBufferShaderNonUniformEXT[] = {SpvCapabilityImageBuffer, SpvCapabilityShaderNonUniformEXT};
+static const SpvCapability pygen_variable_caps_ImageBufferShaderNonUniform[] = {SpvCapabilityImageBuffer, SpvCapabilityShaderNonUniform};
 static const SpvCapability pygen_variable_caps_ImageGatherExtended[] = {SpvCapabilityImageGatherExtended};
 static const SpvCapability pygen_variable_caps_ImageGatherExtended[] = {SpvCapabilityImageGatherExtended};
 static const SpvCapability pygen_variable_caps_InputAttachment[] = {SpvCapabilityInputAttachment};
 static const SpvCapability pygen_variable_caps_InputAttachment[] = {SpvCapabilityInputAttachment};
-static const SpvCapability pygen_variable_caps_InputAttachmentShaderNonUniformEXT[] = {SpvCapabilityInputAttachment, SpvCapabilityShaderNonUniformEXT};
+static const SpvCapability pygen_variable_caps_InputAttachmentShaderNonUniform[] = {SpvCapabilityInputAttachment, SpvCapabilityShaderNonUniform};
 static const SpvCapability pygen_variable_caps_Int64[] = {SpvCapabilityInt64};
 static const SpvCapability pygen_variable_caps_Int64[] = {SpvCapabilityInt64};
 static const SpvCapability pygen_variable_caps_Kernel[] = {SpvCapabilityKernel};
 static const SpvCapability pygen_variable_caps_Kernel[] = {SpvCapabilityKernel};
 static const SpvCapability pygen_variable_caps_KernelGroupNonUniform[] = {SpvCapabilityKernel, SpvCapabilityGroupNonUniform};
 static const SpvCapability pygen_variable_caps_KernelGroupNonUniform[] = {SpvCapabilityKernel, SpvCapabilityGroupNonUniform};
@@ -44,8 +45,9 @@ static const SpvCapability pygen_variable_caps_MeshShadingNV[] = {SpvCapabilityM
 static const SpvCapability pygen_variable_caps_MinLod[] = {SpvCapabilityMinLod};
 static const SpvCapability pygen_variable_caps_MinLod[] = {SpvCapabilityMinLod};
 static const SpvCapability pygen_variable_caps_MultiView[] = {SpvCapabilityMultiView};
 static const SpvCapability pygen_variable_caps_MultiView[] = {SpvCapabilityMultiView};
 static const SpvCapability pygen_variable_caps_MultiViewport[] = {SpvCapabilityMultiViewport};
 static const SpvCapability pygen_variable_caps_MultiViewport[] = {SpvCapabilityMultiViewport};
+static const SpvCapability pygen_variable_caps_MultiViewportShaderViewportIndexShaderViewportIndexLayerEXT[] = {SpvCapabilityMultiViewport, SpvCapabilityShaderViewportIndex, SpvCapabilityShaderViewportIndexLayerEXT};
 static const SpvCapability pygen_variable_caps_PerViewAttributesNVMeshShadingNV[] = {SpvCapabilityPerViewAttributesNV, SpvCapabilityMeshShadingNV};
 static const SpvCapability pygen_variable_caps_PerViewAttributesNVMeshShadingNV[] = {SpvCapabilityPerViewAttributesNV, SpvCapabilityMeshShadingNV};
-static const SpvCapability pygen_variable_caps_PhysicalStorageBufferAddressesEXT[] = {SpvCapabilityPhysicalStorageBufferAddressesEXT};
+static const SpvCapability pygen_variable_caps_PhysicalStorageBufferAddresses[] = {SpvCapabilityPhysicalStorageBufferAddresses};
 static const SpvCapability pygen_variable_caps_Pipes[] = {SpvCapabilityPipes};
 static const SpvCapability pygen_variable_caps_Pipes[] = {SpvCapabilityPipes};
 static const SpvCapability pygen_variable_caps_RayTracingNV[] = {SpvCapabilityRayTracingNV};
 static const SpvCapability pygen_variable_caps_RayTracingNV[] = {SpvCapabilityRayTracingNV};
 static const SpvCapability pygen_variable_caps_RoundingModeRTE[] = {SpvCapabilityRoundingModeRTE};
 static const SpvCapability pygen_variable_caps_RoundingModeRTE[] = {SpvCapabilityRoundingModeRTE};
@@ -57,7 +59,7 @@ static const SpvCapability pygen_variable_caps_Sampled1D[] = {SpvCapabilitySampl
 static const SpvCapability pygen_variable_caps_Sampled1DImage1D[] = {SpvCapabilitySampled1D, SpvCapabilityImage1D};
 static const SpvCapability pygen_variable_caps_Sampled1DImage1D[] = {SpvCapabilitySampled1D, SpvCapabilityImage1D};
 static const SpvCapability pygen_variable_caps_SampledBuffer[] = {SpvCapabilitySampledBuffer};
 static const SpvCapability pygen_variable_caps_SampledBuffer[] = {SpvCapabilitySampledBuffer};
 static const SpvCapability pygen_variable_caps_SampledBufferImageBuffer[] = {SpvCapabilitySampledBuffer, SpvCapabilityImageBuffer};
 static const SpvCapability pygen_variable_caps_SampledBufferImageBuffer[] = {SpvCapabilitySampledBuffer, SpvCapabilityImageBuffer};
-static const SpvCapability pygen_variable_caps_SampledBufferShaderNonUniformEXT[] = {SpvCapabilitySampledBuffer, SpvCapabilityShaderNonUniformEXT};
+static const SpvCapability pygen_variable_caps_SampledBufferShaderNonUniform[] = {SpvCapabilitySampledBuffer, SpvCapabilityShaderNonUniform};
 static const SpvCapability pygen_variable_caps_SampledCubeArray[] = {SpvCapabilitySampledCubeArray};
 static const SpvCapability pygen_variable_caps_SampledCubeArray[] = {SpvCapabilitySampledCubeArray};
 static const SpvCapability pygen_variable_caps_SampledRect[] = {SpvCapabilitySampledRect};
 static const SpvCapability pygen_variable_caps_SampledRect[] = {SpvCapabilitySampledRect};
 static const SpvCapability pygen_variable_caps_SampledRectImageRect[] = {SpvCapabilitySampledRect, SpvCapabilityImageRect};
 static const SpvCapability pygen_variable_caps_SampledRectImageRect[] = {SpvCapabilitySampledRect, SpvCapabilityImageRect};
@@ -65,7 +67,7 @@ static const SpvCapability pygen_variable_caps_Shader[] = {SpvCapabilityShader};
 static const SpvCapability pygen_variable_caps_ShaderImageCubeArray[] = {SpvCapabilityShader, SpvCapabilityImageCubeArray};
 static const SpvCapability pygen_variable_caps_ShaderImageCubeArray[] = {SpvCapabilityShader, SpvCapabilityImageCubeArray};
 static const SpvCapability pygen_variable_caps_ShaderKernel[] = {SpvCapabilityShader, SpvCapabilityKernel};
 static const SpvCapability pygen_variable_caps_ShaderKernel[] = {SpvCapabilityShader, SpvCapabilityKernel};
 static const SpvCapability pygen_variable_caps_ShaderKernelImageMSArray[] = {SpvCapabilityShader, SpvCapabilityKernel, SpvCapabilityImageMSArray};
 static const SpvCapability pygen_variable_caps_ShaderKernelImageMSArray[] = {SpvCapabilityShader, SpvCapabilityKernel, SpvCapabilityImageMSArray};
-static const SpvCapability pygen_variable_caps_ShaderNonUniformEXT[] = {SpvCapabilityShaderNonUniformEXT};
+static const SpvCapability pygen_variable_caps_ShaderNonUniform[] = {SpvCapabilityShaderNonUniform};
 static const SpvCapability pygen_variable_caps_ShaderSMBuiltinsNV[] = {SpvCapabilityShaderSMBuiltinsNV};
 static const SpvCapability pygen_variable_caps_ShaderSMBuiltinsNV[] = {SpvCapabilityShaderSMBuiltinsNV};
 static const SpvCapability pygen_variable_caps_ShaderStereoViewNV[] = {SpvCapabilityShaderStereoViewNV};
 static const SpvCapability pygen_variable_caps_ShaderStereoViewNV[] = {SpvCapabilityShaderStereoViewNV};
 static const SpvCapability pygen_variable_caps_ShaderViewportIndexLayerNV[] = {SpvCapabilityShaderViewportIndexLayerNV};
 static const SpvCapability pygen_variable_caps_ShaderViewportIndexLayerNV[] = {SpvCapabilityShaderViewportIndexLayerNV};
@@ -82,7 +84,7 @@ static const SpvCapability pygen_variable_caps_SubgroupDispatch[] = {SpvCapabili
 static const SpvCapability pygen_variable_caps_Tessellation[] = {SpvCapabilityTessellation};
 static const SpvCapability pygen_variable_caps_Tessellation[] = {SpvCapabilityTessellation};
 static const SpvCapability pygen_variable_caps_TransformFeedback[] = {SpvCapabilityTransformFeedback};
 static const SpvCapability pygen_variable_caps_TransformFeedback[] = {SpvCapabilityTransformFeedback};
 static const SpvCapability pygen_variable_caps_VariablePointersStorageBuffer[] = {SpvCapabilityVariablePointersStorageBuffer};
 static const SpvCapability pygen_variable_caps_VariablePointersStorageBuffer[] = {SpvCapabilityVariablePointersStorageBuffer};
-static const SpvCapability pygen_variable_caps_VulkanMemoryModelKHR[] = {SpvCapabilityVulkanMemoryModelKHR};
+static const SpvCapability pygen_variable_caps_VulkanMemoryModel[] = {SpvCapabilityVulkanMemoryModel};
 
 
 static const spvtools::Extension pygen_variable_exts_SPV_AMD_gpu_shader_half_float_fetch[] = {spvtools::Extension::kSPV_AMD_gpu_shader_half_float_fetch};
 static const spvtools::Extension pygen_variable_exts_SPV_AMD_gpu_shader_half_float_fetch[] = {spvtools::Extension::kSPV_AMD_gpu_shader_half_float_fetch};
 static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_ballot[] = {spvtools::Extension::kSPV_AMD_shader_ballot};
 static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_ballot[] = {spvtools::Extension::kSPV_AMD_shader_ballot};
@@ -97,7 +99,6 @@ static const spvtools::Extension pygen_variable_exts_SPV_EXT_fragment_invocation
 static const spvtools::Extension pygen_variable_exts_SPV_EXT_fragment_shader_interlock[] = {spvtools::Extension::kSPV_EXT_fragment_shader_interlock};
 static const spvtools::Extension pygen_variable_exts_SPV_EXT_fragment_shader_interlock[] = {spvtools::Extension::kSPV_EXT_fragment_shader_interlock};
 static const spvtools::Extension pygen_variable_exts_SPV_EXT_physical_storage_buffer[] = {spvtools::Extension::kSPV_EXT_physical_storage_buffer};
 static const spvtools::Extension pygen_variable_exts_SPV_EXT_physical_storage_buffer[] = {spvtools::Extension::kSPV_EXT_physical_storage_buffer};
 static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_stencil_export[] = {spvtools::Extension::kSPV_EXT_shader_stencil_export};
 static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_stencil_export[] = {spvtools::Extension::kSPV_EXT_shader_stencil_export};
-static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_viewport_index_layer[] = {spvtools::Extension::kSPV_EXT_shader_viewport_index_layer};
 static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_viewport_index_layerSPV_NV_viewport_array2[] = {spvtools::Extension::kSPV_EXT_shader_viewport_index_layer, spvtools::Extension::kSPV_NV_viewport_array2};
 static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_viewport_index_layerSPV_NV_viewport_array2[] = {spvtools::Extension::kSPV_EXT_shader_viewport_index_layer, spvtools::Extension::kSPV_NV_viewport_array2};
 static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1[] = {spvtools::Extension::kSPV_GOOGLE_hlsl_functionality1};
 static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1[] = {spvtools::Extension::kSPV_GOOGLE_hlsl_functionality1};
 static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_user_type[] = {spvtools::Extension::kSPV_GOOGLE_user_type};
 static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_user_type[] = {spvtools::Extension::kSPV_GOOGLE_user_type};
@@ -128,15 +129,14 @@ static const spvtools::Extension pygen_variable_exts_SPV_NV_cooperative_matrix[]
 static const spvtools::Extension pygen_variable_exts_SPV_NV_fragment_shader_barycentric[] = {spvtools::Extension::kSPV_NV_fragment_shader_barycentric};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_fragment_shader_barycentric[] = {spvtools::Extension::kSPV_NV_fragment_shader_barycentric};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_geometry_shader_passthrough[] = {spvtools::Extension::kSPV_NV_geometry_shader_passthrough};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_geometry_shader_passthrough[] = {spvtools::Extension::kSPV_NV_geometry_shader_passthrough};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_NV_mesh_shader};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_NV_mesh_shader};
+static const spvtools::Extension pygen_variable_exts_SPV_NV_mesh_shaderSPV_NV_viewport_array2[] = {spvtools::Extension::kSPV_NV_mesh_shader, spvtools::Extension::kSPV_NV_viewport_array2};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_ray_tracing[] = {spvtools::Extension::kSPV_NV_ray_tracing};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_ray_tracing[] = {spvtools::Extension::kSPV_NV_ray_tracing};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_sample_mask_override_coverage[] = {spvtools::Extension::kSPV_NV_sample_mask_override_coverage};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_sample_mask_override_coverage[] = {spvtools::Extension::kSPV_NV_sample_mask_override_coverage};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_image_footprint[] = {spvtools::Extension::kSPV_NV_shader_image_footprint};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_image_footprint[] = {spvtools::Extension::kSPV_NV_shader_image_footprint};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_sm_builtins[] = {spvtools::Extension::kSPV_NV_shader_sm_builtins};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_sm_builtins[] = {spvtools::Extension::kSPV_NV_shader_sm_builtins};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_subgroup_partitioned[] = {spvtools::Extension::kSPV_NV_shader_subgroup_partitioned};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_subgroup_partitioned[] = {spvtools::Extension::kSPV_NV_shader_subgroup_partitioned};
-static const spvtools::Extension pygen_variable_exts_SPV_NV_shading_rateSPV_EXT_fragment_invocation_density[] = {spvtools::Extension::kSPV_NV_shading_rate, spvtools::Extension::kSPV_EXT_fragment_invocation_density};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_stereo_view_rendering[] = {spvtools::Extension::kSPV_NV_stereo_view_rendering};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_stereo_view_rendering[] = {spvtools::Extension::kSPV_NV_stereo_view_rendering};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_viewport_array2[] = {spvtools::Extension::kSPV_NV_viewport_array2};
 static const spvtools::Extension pygen_variable_exts_SPV_NV_viewport_array2[] = {spvtools::Extension::kSPV_NV_viewport_array2};
-static const spvtools::Extension pygen_variable_exts_SPV_NV_viewport_array2SPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_NV_viewport_array2, spvtools::Extension::kSPV_NV_mesh_shader};
 
 
 static const spv_operand_desc_t pygen_variable_ImageOperandsEntries[] = {
 static const spv_operand_desc_t pygen_variable_ImageOperandsEntries[] = {
   {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
@@ -148,10 +148,14 @@ static const spv_operand_desc_t pygen_variable_ImageOperandsEntries[] = {
   {"ConstOffsets", 0x0020, 1, pygen_variable_caps_ImageGatherExtended, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ConstOffsets", 0x0020, 1, pygen_variable_caps_ImageGatherExtended, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Sample", 0x0040, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Sample", 0x0040, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"MinLod", 0x0080, 1, pygen_variable_caps_MinLod, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"MinLod", 0x0080, 1, pygen_variable_caps_MinLod, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"MakeTexelAvailableKHR", 0x0100, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {SPV_OPERAND_TYPE_SCOPE_ID}, 0xffffffffu, 0xffffffffu},
-  {"MakeTexelVisibleKHR", 0x0200, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {SPV_OPERAND_TYPE_SCOPE_ID}, 0xffffffffu, 0xffffffffu},
-  {"NonPrivateTexelKHR", 0x0400, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
-  {"VolatileTexelKHR", 0x0800, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
+  {"MakeTexelAvailable", 0x0100, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakeTexelAvailableKHR", 0x0100, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakeTexelVisible", 0x0200, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakeTexelVisibleKHR", 0x0200, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"NonPrivateTexel", 0x0400, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"NonPrivateTexelKHR", 0x0400, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"VolatileTexel", 0x0800, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"VolatileTexelKHR", 0x0800, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
   {"SignExtend", 0x1000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"SignExtend", 0x1000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"ZeroExtend", 0x2000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu}
   {"ZeroExtend", 0x2000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu}
 };
 };
@@ -205,10 +209,13 @@ static const spv_operand_desc_t pygen_variable_MemorySemanticsEntries[] = {
   {"CrossWorkgroupMemory", 0x0200, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"CrossWorkgroupMemory", 0x0200, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"AtomicCounterMemory", 0x0400, 1, pygen_variable_caps_AtomicStorage, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"AtomicCounterMemory", 0x0400, 1, pygen_variable_caps_AtomicStorage, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ImageMemory", 0x0800, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"ImageMemory", 0x0800, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"OutputMemoryKHR", 0x1000, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
-  {"MakeAvailableKHR", 0x2000, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
-  {"MakeVisibleKHR", 0x4000, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
-  {"Volatile", 0x8000, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu}
+  {"OutputMemory", 0x1000, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"OutputMemoryKHR", 0x1000, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakeAvailable", 0x2000, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakeAvailableKHR", 0x2000, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakeVisible", 0x4000, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakeVisibleKHR", 0x4000, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"Volatile", 0x8000, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu}
 };
 };
 
 
 static const spv_operand_desc_t pygen_variable_MemoryAccessEntries[] = {
 static const spv_operand_desc_t pygen_variable_MemoryAccessEntries[] = {
@@ -216,9 +223,12 @@ static const spv_operand_desc_t pygen_variable_MemoryAccessEntries[] = {
   {"Volatile", 0x0001, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Volatile", 0x0001, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Aligned", 0x0002, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Aligned", 0x0002, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Nontemporal", 0x0004, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Nontemporal", 0x0004, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"MakePointerAvailableKHR", 0x0008, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {SPV_OPERAND_TYPE_SCOPE_ID}, 0xffffffffu, 0xffffffffu},
-  {"MakePointerVisibleKHR", 0x0010, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {SPV_OPERAND_TYPE_SCOPE_ID}, 0xffffffffu, 0xffffffffu},
-  {"NonPrivatePointerKHR", 0x0020, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu}
+  {"MakePointerAvailable", 0x0008, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakePointerAvailableKHR", 0x0008, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakePointerVisible", 0x0010, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"MakePointerVisibleKHR", 0x0010, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"NonPrivatePointer", 0x0020, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"NonPrivatePointerKHR", 0x0020, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu}
 };
 };
 
 
 static const spv_operand_desc_t pygen_variable_KernelProfilingInfoEntries[] = {
 static const spv_operand_desc_t pygen_variable_KernelProfilingInfoEntries[] = {
@@ -257,14 +267,16 @@ static const spv_operand_desc_t pygen_variable_AddressingModelEntries[] = {
   {"Logical", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Logical", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Physical32", 1, 1, pygen_variable_caps_Addresses, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Physical32", 1, 1, pygen_variable_caps_Addresses, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Physical64", 2, 1, pygen_variable_caps_Addresses, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Physical64", 2, 1, pygen_variable_caps_Addresses, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"PhysicalStorageBuffer64EXT", 5348, 1, pygen_variable_caps_PhysicalStorageBufferAddressesEXT, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, 0xffffffffu, 0xffffffffu}
+  {"PhysicalStorageBuffer64", 5348, 1, pygen_variable_caps_PhysicalStorageBufferAddresses, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"PhysicalStorageBuffer64EXT", 5348, 1, pygen_variable_caps_PhysicalStorageBufferAddresses, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu}
 };
 };
 
 
 static const spv_operand_desc_t pygen_variable_MemoryModelEntries[] = {
 static const spv_operand_desc_t pygen_variable_MemoryModelEntries[] = {
   {"Simple", 0, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Simple", 0, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"GLSL450", 1, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"GLSL450", 1, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"OpenCL", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"OpenCL", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"VulkanKHR", 3, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu}
+  {"Vulkan", 3, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"VulkanKHR", 3, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu}
 };
 };
 
 
 static const spv_operand_desc_t pygen_variable_ExecutionModeEntries[] = {
 static const spv_operand_desc_t pygen_variable_ExecutionModeEntries[] = {
@@ -346,7 +358,8 @@ static const spv_operand_desc_t pygen_variable_StorageClassEntries[] = {
   {"HitAttributeNV", 5339, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu, 0xffffffffu},
   {"HitAttributeNV", 5339, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu, 0xffffffffu},
   {"IncomingRayPayloadNV", 5342, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu, 0xffffffffu},
   {"IncomingRayPayloadNV", 5342, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu, 0xffffffffu},
   {"ShaderRecordBufferNV", 5343, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu, 0xffffffffu},
   {"ShaderRecordBufferNV", 5343, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu, 0xffffffffu},
-  {"PhysicalStorageBufferEXT", 5349, 1, pygen_variable_caps_PhysicalStorageBufferAddressesEXT, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, 0xffffffffu, 0xffffffffu}
+  {"PhysicalStorageBuffer", 5349, 1, pygen_variable_caps_PhysicalStorageBufferAddresses, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"PhysicalStorageBufferEXT", 5349, 1, pygen_variable_caps_PhysicalStorageBufferAddresses, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu}
 };
 };
 
 
 static const spv_operand_desc_t pygen_variable_DimEntries[] = {
 static const spv_operand_desc_t pygen_variable_DimEntries[] = {
@@ -546,9 +559,12 @@ static const spv_operand_desc_t pygen_variable_DecorationEntries[] = {
   {"PerViewNV", 5272, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu, 0xffffffffu},
   {"PerViewNV", 5272, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu, 0xffffffffu},
   {"PerTaskNV", 5273, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu, 0xffffffffu},
   {"PerTaskNV", 5273, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu, 0xffffffffu},
   {"PerVertexNV", 5285, 1, pygen_variable_caps_FragmentBarycentricNV, 1, pygen_variable_exts_SPV_NV_fragment_shader_barycentric, {}, 0xffffffffu, 0xffffffffu},
   {"PerVertexNV", 5285, 1, pygen_variable_caps_FragmentBarycentricNV, 1, pygen_variable_exts_SPV_NV_fragment_shader_barycentric, {}, 0xffffffffu, 0xffffffffu},
-  {"NonUniformEXT", 5300, 1, pygen_variable_caps_ShaderNonUniformEXT, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
-  {"RestrictPointerEXT", 5355, 1, pygen_variable_caps_PhysicalStorageBufferAddressesEXT, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, 0xffffffffu, 0xffffffffu},
-  {"AliasedPointerEXT", 5356, 1, pygen_variable_caps_PhysicalStorageBufferAddressesEXT, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, 0xffffffffu, 0xffffffffu},
+  {"NonUniform", 5300, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"NonUniformEXT", 5300, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"RestrictPointer", 5355, 1, pygen_variable_caps_PhysicalStorageBufferAddresses, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"RestrictPointerEXT", 5355, 1, pygen_variable_caps_PhysicalStorageBufferAddresses, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"AliasedPointer", 5356, 1, pygen_variable_caps_PhysicalStorageBufferAddresses, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"AliasedPointerEXT", 5356, 1, pygen_variable_caps_PhysicalStorageBufferAddresses, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
   {"CounterBuffer", 5634, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"CounterBuffer", 5634, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"HlslCounterBufferGOOGLE", 5634, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_ID}, 0xffffffffu, 0xffffffffu},
   {"HlslCounterBufferGOOGLE", 5634, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_ID}, 0xffffffffu, 0xffffffffu},
   {"UserSemantic", 5635, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_LITERAL_STRING}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"UserSemantic", 5635, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_LITERAL_STRING}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
@@ -565,8 +581,8 @@ static const spv_operand_desc_t pygen_variable_BuiltInEntries[] = {
   {"InstanceId", 6, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"InstanceId", 6, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"PrimitiveId", 7, 3, pygen_variable_caps_GeometryTessellationRayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"PrimitiveId", 7, 3, pygen_variable_caps_GeometryTessellationRayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"InvocationId", 8, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"InvocationId", 8, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"Layer", 9, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"ViewportIndex", 10, 1, pygen_variable_caps_MultiViewport, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
+  {"Layer", 9, 3, pygen_variable_caps_GeometryShaderLayerShaderViewportIndexLayerEXT, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
+  {"ViewportIndex", 10, 3, pygen_variable_caps_MultiViewportShaderViewportIndexShaderViewportIndexLayerEXT, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TessLevelOuter", 11, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TessLevelOuter", 11, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TessLevelInner", 12, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TessLevelInner", 12, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TessCoord", 13, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"TessCoord", 13, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
@@ -621,7 +637,7 @@ static const spv_operand_desc_t pygen_variable_BuiltInEntries[] = {
   {"BaryCoordSmoothSampleAMD", 4997, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu, 0xffffffffu},
   {"BaryCoordSmoothSampleAMD", 4997, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu, 0xffffffffu},
   {"BaryCoordPullModelAMD", 4998, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu, 0xffffffffu},
   {"BaryCoordPullModelAMD", 4998, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu, 0xffffffffu},
   {"FragStencilRefEXT", 5014, 1, pygen_variable_caps_StencilExportEXT, 1, pygen_variable_exts_SPV_EXT_shader_stencil_export, {}, 0xffffffffu, 0xffffffffu},
   {"FragStencilRefEXT", 5014, 1, pygen_variable_caps_StencilExportEXT, 1, pygen_variable_exts_SPV_EXT_shader_stencil_export, {}, 0xffffffffu, 0xffffffffu},
-  {"ViewportMaskNV", 5253, 2, pygen_variable_caps_ShaderViewportMaskNVMeshShadingNV, 2, pygen_variable_exts_SPV_NV_viewport_array2SPV_NV_mesh_shader, {}, 0xffffffffu, 0xffffffffu},
+  {"ViewportMaskNV", 5253, 2, pygen_variable_caps_ShaderViewportMaskNVMeshShadingNV, 2, pygen_variable_exts_SPV_NV_mesh_shaderSPV_NV_viewport_array2, {}, 0xffffffffu, 0xffffffffu},
   {"SecondaryPositionNV", 5257, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu, 0xffffffffu},
   {"SecondaryPositionNV", 5257, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu, 0xffffffffu},
   {"SecondaryViewportMaskNV", 5258, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu, 0xffffffffu},
   {"SecondaryViewportMaskNV", 5258, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu, 0xffffffffu},
   {"PositionPerViewNV", 5261, 2, pygen_variable_caps_PerViewAttributesNVMeshShadingNV, 2, pygen_variable_exts_SPV_NVX_multiview_per_view_attributesSPV_NV_mesh_shader, {}, 0xffffffffu, 0xffffffffu},
   {"PositionPerViewNV", 5261, 2, pygen_variable_caps_PerViewAttributesNVMeshShadingNV, 2, pygen_variable_exts_SPV_NVX_multiview_per_view_attributesSPV_NV_mesh_shader, {}, 0xffffffffu, 0xffffffffu},
@@ -667,7 +683,8 @@ static const spv_operand_desc_t pygen_variable_ScopeEntries[] = {
   {"Workgroup", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Workgroup", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Subgroup", 3, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Subgroup", 3, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Invocation", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
   {"Invocation", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0), 0xffffffffu},
-  {"QueueFamilyKHR", 5, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu}
+  {"QueueFamily", 5, 1, pygen_variable_caps_VulkanMemoryModel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"QueueFamilyKHR", 5, 1, pygen_variable_caps_VulkanMemoryModel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu}
 };
 };
 
 
 static const spv_operand_desc_t pygen_variable_GroupOperationEntries[] = {
 static const spv_operand_desc_t pygen_variable_GroupOperationEntries[] = {
@@ -754,6 +771,8 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = {
   {"GroupNonUniformShuffleRelative", 66, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"GroupNonUniformShuffleRelative", 66, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"GroupNonUniformClustered", 67, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"GroupNonUniformClustered", 67, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"GroupNonUniformQuad", 68, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"GroupNonUniformQuad", 68, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
+  {"ShaderLayer", 69, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"ShaderViewportIndex", 70, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
   {"SubgroupBallotKHR", 4423, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, 0xffffffffu, 0xffffffffu},
   {"SubgroupBallotKHR", 4423, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, 0xffffffffu, 0xffffffffu},
   {"DrawParameters", 4427, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"DrawParameters", 4427, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"SubgroupVoteKHR", 4431, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_subgroup_vote, {}, 0xffffffffu, 0xffffffffu},
   {"SubgroupVoteKHR", 4431, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_subgroup_vote, {}, 0xffffffffu, 0xffffffffu},
@@ -769,9 +788,9 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = {
   {"VariablePointers", 4442, 1, pygen_variable_caps_VariablePointersStorageBuffer, 1, pygen_variable_exts_SPV_KHR_variable_pointers, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"VariablePointers", 4442, 1, pygen_variable_caps_VariablePointersStorageBuffer, 1, pygen_variable_exts_SPV_KHR_variable_pointers, {}, SPV_SPIRV_VERSION_WORD(1,3), 0xffffffffu},
   {"AtomicStorageOps", 4445, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_shader_atomic_counter_ops, {}, 0xffffffffu, 0xffffffffu},
   {"AtomicStorageOps", 4445, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_shader_atomic_counter_ops, {}, 0xffffffffu, 0xffffffffu},
   {"SampleMaskPostDepthCoverage", 4447, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_post_depth_coverage, {}, 0xffffffffu, 0xffffffffu},
   {"SampleMaskPostDepthCoverage", 4447, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_post_depth_coverage, {}, 0xffffffffu, 0xffffffffu},
-  {"StorageBuffer8BitAccess", 4448, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu, 0xffffffffu},
-  {"UniformAndStorageBuffer8BitAccess", 4449, 1, pygen_variable_caps_StorageBuffer8BitAccess, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu, 0xffffffffu},
-  {"StoragePushConstant8", 4450, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu, 0xffffffffu},
+  {"StorageBuffer8BitAccess", 4448, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"UniformAndStorageBuffer8BitAccess", 4449, 1, pygen_variable_caps_StorageBuffer8BitAccess, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StoragePushConstant8", 4450, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
   {"DenormPreserve", 4464, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"DenormPreserve", 4464, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"DenormFlushToZero", 4465, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"DenormFlushToZero", 4465, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"SignedZeroInfNanPreserve", 4466, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
   {"SignedZeroInfNanPreserve", 4466, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, SPV_SPIRV_VERSION_WORD(1,4), 0xffffffffu},
@@ -798,22 +817,37 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = {
   {"FragmentDensityEXT", 5291, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_EXT_fragment_invocation_densitySPV_NV_shading_rate, {}, 0xffffffffu, 0xffffffffu},
   {"FragmentDensityEXT", 5291, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_EXT_fragment_invocation_densitySPV_NV_shading_rate, {}, 0xffffffffu, 0xffffffffu},
   {"ShadingRateNV", 5291, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_EXT_fragment_invocation_densitySPV_NV_shading_rate, {}, 0xffffffffu, 0xffffffffu},
   {"ShadingRateNV", 5291, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_EXT_fragment_invocation_densitySPV_NV_shading_rate, {}, 0xffffffffu, 0xffffffffu},
   {"GroupNonUniformPartitionedNV", 5297, 0, nullptr, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, {}, 0xffffffffu, 0xffffffffu},
   {"GroupNonUniformPartitionedNV", 5297, 0, nullptr, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, {}, 0xffffffffu, 0xffffffffu},
-  {"ShaderNonUniformEXT", 5301, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"RuntimeDescriptorArrayEXT", 5302, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"InputAttachmentArrayDynamicIndexingEXT", 5303, 1, pygen_variable_caps_InputAttachment, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"UniformTexelBufferArrayDynamicIndexingEXT", 5304, 1, pygen_variable_caps_SampledBuffer, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"StorageTexelBufferArrayDynamicIndexingEXT", 5305, 1, pygen_variable_caps_ImageBuffer, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"UniformBufferArrayNonUniformIndexingEXT", 5306, 1, pygen_variable_caps_ShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"SampledImageArrayNonUniformIndexingEXT", 5307, 1, pygen_variable_caps_ShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"StorageBufferArrayNonUniformIndexingEXT", 5308, 1, pygen_variable_caps_ShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"StorageImageArrayNonUniformIndexingEXT", 5309, 1, pygen_variable_caps_ShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"InputAttachmentArrayNonUniformIndexingEXT", 5310, 2, pygen_variable_caps_InputAttachmentShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"UniformTexelBufferArrayNonUniformIndexingEXT", 5311, 2, pygen_variable_caps_SampledBufferShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
-  {"StorageTexelBufferArrayNonUniformIndexingEXT", 5312, 2, pygen_variable_caps_ImageBufferShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu, 0xffffffffu},
+  {"ShaderNonUniform", 5301, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"ShaderNonUniformEXT", 5301, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"RuntimeDescriptorArray", 5302, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"RuntimeDescriptorArrayEXT", 5302, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"InputAttachmentArrayDynamicIndexing", 5303, 1, pygen_variable_caps_InputAttachment, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"InputAttachmentArrayDynamicIndexingEXT", 5303, 1, pygen_variable_caps_InputAttachment, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"UniformTexelBufferArrayDynamicIndexing", 5304, 1, pygen_variable_caps_SampledBuffer, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"UniformTexelBufferArrayDynamicIndexingEXT", 5304, 1, pygen_variable_caps_SampledBuffer, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StorageTexelBufferArrayDynamicIndexing", 5305, 1, pygen_variable_caps_ImageBuffer, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StorageTexelBufferArrayDynamicIndexingEXT", 5305, 1, pygen_variable_caps_ImageBuffer, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"UniformBufferArrayNonUniformIndexing", 5306, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"UniformBufferArrayNonUniformIndexingEXT", 5306, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"SampledImageArrayNonUniformIndexing", 5307, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"SampledImageArrayNonUniformIndexingEXT", 5307, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StorageBufferArrayNonUniformIndexing", 5308, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StorageBufferArrayNonUniformIndexingEXT", 5308, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StorageImageArrayNonUniformIndexing", 5309, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StorageImageArrayNonUniformIndexingEXT", 5309, 1, pygen_variable_caps_ShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"InputAttachmentArrayNonUniformIndexing", 5310, 2, pygen_variable_caps_InputAttachmentShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"InputAttachmentArrayNonUniformIndexingEXT", 5310, 2, pygen_variable_caps_InputAttachmentShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"UniformTexelBufferArrayNonUniformIndexing", 5311, 2, pygen_variable_caps_SampledBufferShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"UniformTexelBufferArrayNonUniformIndexingEXT", 5311, 2, pygen_variable_caps_SampledBufferShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StorageTexelBufferArrayNonUniformIndexing", 5312, 2, pygen_variable_caps_ImageBufferShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"StorageTexelBufferArrayNonUniformIndexingEXT", 5312, 2, pygen_variable_caps_ImageBufferShaderNonUniform, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
   {"RayTracingNV", 5340, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu, 0xffffffffu},
   {"RayTracingNV", 5340, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu, 0xffffffffu},
-  {"VulkanMemoryModelKHR", 5345, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, 0xffffffffu, 0xffffffffu},
-  {"VulkanMemoryModelDeviceScopeKHR", 5346, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, 0xffffffffu, 0xffffffffu},
-  {"PhysicalStorageBufferAddressesEXT", 5347, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, 0xffffffffu, 0xffffffffu},
+  {"VulkanMemoryModel", 5345, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"VulkanMemoryModelKHR", 5345, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"VulkanMemoryModelDeviceScope", 5346, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"VulkanMemoryModelDeviceScopeKHR", 5346, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"PhysicalStorageBufferAddresses", 5347, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
+  {"PhysicalStorageBufferAddressesEXT", 5347, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_physical_storage_buffer, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
   {"ComputeDerivativeGroupLinearNV", 5350, 0, nullptr, 1, pygen_variable_exts_SPV_NV_compute_shader_derivatives, {}, 0xffffffffu, 0xffffffffu},
   {"ComputeDerivativeGroupLinearNV", 5350, 0, nullptr, 1, pygen_variable_exts_SPV_NV_compute_shader_derivatives, {}, 0xffffffffu, 0xffffffffu},
   {"CooperativeMatrixNV", 5357, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_NV_cooperative_matrix, {}, 0xffffffffu, 0xffffffffu},
   {"CooperativeMatrixNV", 5357, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_NV_cooperative_matrix, {}, 0xffffffffu, 0xffffffffu},
   {"FragmentShaderSampleInterlockEXT", 5363, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_fragment_shader_interlock, {}, 0xffffffffu, 0xffffffffu},
   {"FragmentShaderSampleInterlockEXT", 5363, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_fragment_shader_interlock, {}, 0xffffffffu, 0xffffffffu},

+ 1 - 0
3rdparty/spirv-tools/include/spirv-tools/libspirv.h

@@ -433,6 +433,7 @@ typedef enum {
   SPV_ENV_WEBGPU_0,       // Work in progress WebGPU 1.0.
   SPV_ENV_WEBGPU_0,       // Work in progress WebGPU 1.0.
   SPV_ENV_UNIVERSAL_1_4,  // SPIR-V 1.4 latest revision, no other restrictions.
   SPV_ENV_UNIVERSAL_1_4,  // SPIR-V 1.4 latest revision, no other restrictions.
   SPV_ENV_VULKAN_1_1_SPIRV_1_4,  // Vulkan 1.1 with SPIR-V 1.4 binary.
   SPV_ENV_VULKAN_1_1_SPIRV_1_4,  // Vulkan 1.1 with SPIR-V 1.4 binary.
+  SPV_ENV_UNIVERSAL_1_5,  // SPIR-V 1.5 latest revision, no other restrictions.
 } spv_target_env;
 } spv_target_env;
 
 
 // SPIR-V Validator can be parameterized with the following Universal Limits.
 // SPIR-V Validator can be parameterized with the following Universal Limits.

+ 1 - 0
3rdparty/spirv-tools/source/ext_inst.cpp

@@ -84,6 +84,7 @@ spv_result_t spvExtInstTableGet(spv_ext_inst_table* pExtInstTable,
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_UNIVERSAL_1_4:
+    case SPV_ENV_UNIVERSAL_1_5:
       *pExtInstTable = &kTable_1_0;
       *pExtInstTable = &kTable_1_0;
       return SPV_SUCCESS;
       return SPV_SUCCESS;
     default:
     default:

+ 2 - 0
3rdparty/spirv-tools/source/fuzz/CMakeLists.txt

@@ -34,6 +34,7 @@ if(SPIRV_BUILD_FUZZER)
         fuzzer_pass_add_dead_breaks.h
         fuzzer_pass_add_dead_breaks.h
         fuzzer_pass_add_dead_continues.h
         fuzzer_pass_add_dead_continues.h
         fuzzer_pass_add_useful_constructs.h
         fuzzer_pass_add_useful_constructs.h
+        fuzzer_pass_copy_objects.h
         fuzzer_pass_obfuscate_constants.h
         fuzzer_pass_obfuscate_constants.h
         fuzzer_pass_permute_blocks.h
         fuzzer_pass_permute_blocks.h
         fuzzer_pass_split_blocks.h
         fuzzer_pass_split_blocks.h
@@ -69,6 +70,7 @@ if(SPIRV_BUILD_FUZZER)
         fuzzer_pass_add_dead_breaks.cpp
         fuzzer_pass_add_dead_breaks.cpp
         fuzzer_pass_add_dead_continues.cpp
         fuzzer_pass_add_dead_continues.cpp
         fuzzer_pass_add_useful_constructs.cpp
         fuzzer_pass_add_useful_constructs.cpp
+        fuzzer_pass_copy_objects.cpp
         fuzzer_pass_obfuscate_constants.cpp
         fuzzer_pass_obfuscate_constants.cpp
         fuzzer_pass_permute_blocks.cpp
         fuzzer_pass_permute_blocks.cpp
         fuzzer_pass_split_blocks.cpp
         fuzzer_pass_split_blocks.cpp

+ 4 - 0
3rdparty/spirv-tools/source/fuzz/fuzzer.cpp

@@ -22,6 +22,7 @@
 #include "source/fuzz/fuzzer_pass_add_dead_breaks.h"
 #include "source/fuzz/fuzzer_pass_add_dead_breaks.h"
 #include "source/fuzz/fuzzer_pass_add_dead_continues.h"
 #include "source/fuzz/fuzzer_pass_add_dead_continues.h"
 #include "source/fuzz/fuzzer_pass_add_useful_constructs.h"
 #include "source/fuzz/fuzzer_pass_add_useful_constructs.h"
+#include "source/fuzz/fuzzer_pass_copy_objects.h"
 #include "source/fuzz/fuzzer_pass_obfuscate_constants.h"
 #include "source/fuzz/fuzzer_pass_obfuscate_constants.h"
 #include "source/fuzz/fuzzer_pass_permute_blocks.h"
 #include "source/fuzz/fuzzer_pass_permute_blocks.h"
 #include "source/fuzz/fuzzer_pass_split_blocks.h"
 #include "source/fuzz/fuzzer_pass_split_blocks.h"
@@ -107,6 +108,9 @@ Fuzzer::FuzzerResultStatus Fuzzer::Run(
       .Apply();
       .Apply();
 
 
   // Apply some semantics-preserving passes.
   // Apply some semantics-preserving passes.
+  FuzzerPassCopyObjects(ir_context.get(), &fact_manager, &fuzzer_context,
+                        transformation_sequence_out)
+      .Apply();
   FuzzerPassSplitBlocks(ir_context.get(), &fact_manager, &fuzzer_context,
   FuzzerPassSplitBlocks(ir_context.get(), &fact_manager, &fuzzer_context,
                         transformation_sequence_out)
                         transformation_sequence_out)
       .Apply();
       .Apply();

+ 7 - 2
3rdparty/spirv-tools/source/fuzz/fuzzer_context.cpp

@@ -26,6 +26,7 @@ namespace {
 
 
 const uint32_t kDefaultChanceOfAddingDeadBreak = 20;
 const uint32_t kDefaultChanceOfAddingDeadBreak = 20;
 const uint32_t kDefaultChanceOfAddingDeadContinue = 20;
 const uint32_t kDefaultChanceOfAddingDeadContinue = 20;
+const uint32_t kDefaultChanceOfCopyingObject = 20;
 const uint32_t kDefaultChanceOfMovingBlockDown = 25;
 const uint32_t kDefaultChanceOfMovingBlockDown = 25;
 const uint32_t kDefaultChanceOfObfuscatingConstant = 20;
 const uint32_t kDefaultChanceOfObfuscatingConstant = 20;
 const uint32_t kDefaultChanceOfSplittingBlock = 20;
 const uint32_t kDefaultChanceOfSplittingBlock = 20;
@@ -48,6 +49,7 @@ FuzzerContext::FuzzerContext(RandomGenerator* random_generator,
       next_fresh_id_(min_fresh_id),
       next_fresh_id_(min_fresh_id),
       chance_of_adding_dead_break_(kDefaultChanceOfAddingDeadBreak),
       chance_of_adding_dead_break_(kDefaultChanceOfAddingDeadBreak),
       chance_of_adding_dead_continue_(kDefaultChanceOfAddingDeadContinue),
       chance_of_adding_dead_continue_(kDefaultChanceOfAddingDeadContinue),
+      chance_of_copying_object_(kDefaultChanceOfCopyingObject),
       chance_of_moving_block_down_(kDefaultChanceOfMovingBlockDown),
       chance_of_moving_block_down_(kDefaultChanceOfMovingBlockDown),
       chance_of_obfuscating_constant_(kDefaultChanceOfObfuscatingConstant),
       chance_of_obfuscating_constant_(kDefaultChanceOfObfuscatingConstant),
       chance_of_splitting_block_(kDefaultChanceOfSplittingBlock),
       chance_of_splitting_block_(kDefaultChanceOfSplittingBlock),
@@ -58,8 +60,11 @@ FuzzerContext::~FuzzerContext() = default;
 
 
 uint32_t FuzzerContext::GetFreshId() { return next_fresh_id_++; }
 uint32_t FuzzerContext::GetFreshId() { return next_fresh_id_++; }
 
 
-RandomGenerator* FuzzerContext::GetRandomGenerator() {
-  return random_generator_;
+bool FuzzerContext::ChooseEven() { return random_generator_->RandomBool(); }
+
+bool FuzzerContext::ChoosePercentage(uint32_t percentage_chance) {
+  assert(percentage_chance <= 100);
+  return random_generator_->RandomPercentage() < percentage_chance;
 }
 }
 
 
 }  // namespace fuzz
 }  // namespace fuzz

+ 21 - 6
3rdparty/spirv-tools/source/fuzz/fuzzer_context.h

@@ -34,8 +34,22 @@ class FuzzerContext {
 
 
   ~FuzzerContext();
   ~FuzzerContext();
 
 
-  // Provides the random generator used to control fuzzing.
-  RandomGenerator* GetRandomGenerator();
+  // Returns a random boolean.
+  bool ChooseEven();
+
+  // Returns true if and only if a randomly-chosen integer in the range [0, 100]
+  // is less than |percentage_chance|.
+  bool ChoosePercentage(uint32_t percentage_chance);
+
+  // Returns a random index into |sequence|, which is expected to have a 'size'
+  // method, and which must be non-empty.  Typically 'HasSizeMethod' will be an
+  // std::vector.
+  template <typename HasSizeMethod>
+  uint32_t RandomIndex(HasSizeMethod sequence) {
+    assert(sequence.size() > 0);
+    return random_generator_->RandomUint32(
+        static_cast<uint32_t>(sequence.size()));
+  }
 
 
   // Yields an id that is guaranteed not to be used in the module being fuzzed,
   // Yields an id that is guaranteed not to be used in the module being fuzzed,
   // or to have been issued before.
   // or to have been issued before.
@@ -47,17 +61,17 @@ class FuzzerContext {
   uint32_t GetChanceOfAddingDeadContinue() {
   uint32_t GetChanceOfAddingDeadContinue() {
     return chance_of_adding_dead_continue_;
     return chance_of_adding_dead_continue_;
   }
   }
+  uint32_t GetChanceOfCopyingObject() { return chance_of_copying_object_; }
   uint32_t GetChanceOfMovingBlockDown() { return chance_of_moving_block_down_; }
   uint32_t GetChanceOfMovingBlockDown() { return chance_of_moving_block_down_; }
   uint32_t GetChanceOfObfuscatingConstant() {
   uint32_t GetChanceOfObfuscatingConstant() {
     return chance_of_obfuscating_constant_;
     return chance_of_obfuscating_constant_;
   }
   }
   uint32_t GetChanceOfSplittingBlock() { return chance_of_splitting_block_; }
   uint32_t GetChanceOfSplittingBlock() { return chance_of_splitting_block_; }
 
 
-  // Probability distributions to control how deeply to recurse.
+  // Functions to control how deeply to recurse.
   // Keep them in alphabetical order.
   // Keep them in alphabetical order.
-  const std::function<bool(uint32_t, RandomGenerator*)>&
-  GoDeeperInConstantObfuscation() {
-    return go_deeper_in_constant_obfuscation_;
+  bool GoDeeperInConstantObfuscation(uint32_t depth) {
+    return go_deeper_in_constant_obfuscation_(depth, random_generator_);
   }
   }
 
 
  private:
  private:
@@ -70,6 +84,7 @@ class FuzzerContext {
   // Keep them in alphabetical order.
   // Keep them in alphabetical order.
   uint32_t chance_of_adding_dead_break_;
   uint32_t chance_of_adding_dead_break_;
   uint32_t chance_of_adding_dead_continue_;
   uint32_t chance_of_adding_dead_continue_;
+  uint32_t chance_of_copying_object_;
   uint32_t chance_of_moving_block_down_;
   uint32_t chance_of_moving_block_down_;
   uint32_t chance_of_obfuscating_constant_;
   uint32_t chance_of_obfuscating_constant_;
   uint32_t chance_of_splitting_block_;
   uint32_t chance_of_splitting_block_;

+ 4 - 6
3rdparty/spirv-tools/source/fuzz/fuzzer_pass_add_dead_breaks.cpp

@@ -51,8 +51,7 @@ void FuzzerPassAddDeadBreaks::Apply() {
         //  merge blocks.  This will lead to interesting opportunities being
         //  merge blocks.  This will lead to interesting opportunities being
         //  missed.
         //  missed.
         auto candidate_transformation = TransformationAddDeadBreak(
         auto candidate_transformation = TransformationAddDeadBreak(
-            block.id(), merge_block_id,
-            GetFuzzerContext()->GetRandomGenerator()->RandomBool(), {});
+            block.id(), merge_block_id, GetFuzzerContext()->ChooseEven(), {});
         if (candidate_transformation.IsApplicable(GetIRContext(),
         if (candidate_transformation.IsApplicable(GetIRContext(),
                                                   *GetFactManager())) {
                                                   *GetFactManager())) {
           // Only consider a transformation as a candidate if it is applicable.
           // Only consider a transformation as a candidate if it is applicable.
@@ -77,16 +76,15 @@ void FuzzerPassAddDeadBreaks::Apply() {
   while (!candidate_transformations.empty()) {
   while (!candidate_transformations.empty()) {
     // Choose a random index into the sequence of remaining candidate
     // Choose a random index into the sequence of remaining candidate
     // transformations.
     // transformations.
-    auto index = GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-        static_cast<uint32_t>(candidate_transformations.size()));
+    auto index = GetFuzzerContext()->RandomIndex(candidate_transformations);
     // Remove the transformation at the chosen index from the sequence.
     // Remove the transformation at the chosen index from the sequence.
     auto transformation = std::move(candidate_transformations[index]);
     auto transformation = std::move(candidate_transformations[index]);
     candidate_transformations.erase(candidate_transformations.begin() + index);
     candidate_transformations.erase(candidate_transformations.begin() + index);
     // Probabilistically decide whether to try to apply it vs. ignore it, in the
     // Probabilistically decide whether to try to apply it vs. ignore it, in the
     // case that it is applicable.
     // case that it is applicable.
     if (transformation.IsApplicable(GetIRContext(), *GetFactManager()) &&
     if (transformation.IsApplicable(GetIRContext(), *GetFactManager()) &&
-        GetFuzzerContext()->GetRandomGenerator()->RandomPercentage() >
-            GetFuzzerContext()->GetChanceOfAddingDeadBreak()) {
+        GetFuzzerContext()->ChoosePercentage(
+            GetFuzzerContext()->GetChanceOfAddingDeadBreak())) {
       transformation.Apply(GetIRContext(), GetFactManager());
       transformation.Apply(GetIRContext(), GetFactManager());
       *GetTransformations()->add_transformation() = transformation.ToMessage();
       *GetTransformations()->add_transformation() = transformation.ToMessage();
     }
     }

+ 3 - 4
3rdparty/spirv-tools/source/fuzz/fuzzer_pass_add_dead_continues.cpp

@@ -40,14 +40,13 @@ void FuzzerPassAddDeadContinues::Apply() {
       //  merge blocks.  This will lead to interesting opportunities being
       //  merge blocks.  This will lead to interesting opportunities being
       //  missed.
       //  missed.
       auto candidate_transformation = TransformationAddDeadContinue(
       auto candidate_transformation = TransformationAddDeadContinue(
-          block.id(), GetFuzzerContext()->GetRandomGenerator()->RandomBool(),
-          {});
+          block.id(), GetFuzzerContext()->ChooseEven(), {});
       // Probabilistically decide whether to apply the transformation in the
       // Probabilistically decide whether to apply the transformation in the
       // case that it is applicable.
       // case that it is applicable.
       if (candidate_transformation.IsApplicable(GetIRContext(),
       if (candidate_transformation.IsApplicable(GetIRContext(),
                                                 *GetFactManager()) &&
                                                 *GetFactManager()) &&
-          GetFuzzerContext()->GetRandomGenerator()->RandomPercentage() >
-              GetFuzzerContext()->GetChanceOfAddingDeadContinue()) {
+          GetFuzzerContext()->ChoosePercentage(
+              GetFuzzerContext()->GetChanceOfAddingDeadContinue())) {
         candidate_transformation.Apply(GetIRContext(), GetFactManager());
         candidate_transformation.Apply(GetIRContext(), GetFactManager());
         *GetTransformations()->add_transformation() =
         *GetTransformations()->add_transformation() =
             candidate_transformation.ToMessage();
             candidate_transformation.ToMessage();

+ 148 - 0
3rdparty/spirv-tools/source/fuzz/fuzzer_pass_copy_objects.cpp

@@ -0,0 +1,148 @@
+// Copyright (c) 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "source/fuzz/fuzzer_pass_copy_objects.h"
+
+#include "source/fuzz/transformation_copy_object.h"
+
+namespace spvtools {
+namespace fuzz {
+
+FuzzerPassCopyObjects::FuzzerPassCopyObjects(
+    opt::IRContext* ir_context, FactManager* fact_manager,
+    FuzzerContext* fuzzer_context,
+    protobufs::TransformationSequence* transformations)
+    : FuzzerPass(ir_context, fact_manager, fuzzer_context, transformations) {}
+
+FuzzerPassCopyObjects::~FuzzerPassCopyObjects() = default;
+
+void FuzzerPassCopyObjects::Apply() {
+  // Consider every block in every function.
+  for (auto& function : *GetIRContext()->module()) {
+    for (auto& block : function) {
+      // We now consider every instruction in the block, randomly deciding
+      // whether to add an object copy before the instruction.
+
+      // In order to insert an object copy instruction, we need to be able to
+      // identify the instruction a copy should be inserted before.  We do this
+      // by tracking a base instruction, which must generate a result id, and an
+      // offset (to allow us to identify instructions that do not generate
+      // result ids).
+
+      // The initial base instruction is the block label.
+      uint32_t base = block.id();
+      uint32_t offset = 0;
+      // Consider every instruction in the block.
+      for (auto inst_it = block.begin(); inst_it != block.end(); ++inst_it) {
+        if (inst_it->HasResultId()) {
+          // In the case that the instruction has a result id, we use the
+          // instruction as its own base, with zero offset.
+          base = inst_it->result_id();
+          offset = 0;
+        } else {
+          // The instruction does not have a result id, so we need to identify
+          // it via the latest instruction that did have a result id (base), and
+          // an incremented offset.
+          offset++;
+        }
+
+        // Check whether it is legitimate to insert a copy before this
+        // instruction.
+        if (!TransformationCopyObject::CanInsertCopyBefore(inst_it)) {
+          continue;
+        }
+
+        // Randomly decide whether to try inserting an object copy here.
+        if (!GetFuzzerContext()->ChoosePercentage(
+                GetFuzzerContext()->GetChanceOfCopyingObject())) {
+          continue;
+        }
+
+        // Populate list of potential instructions that can be copied.
+        // TODO(afd) The following is (relatively) simple, but may end up being
+        //  prohibitively inefficient, as it walks the whole dominator tree for
+        //  every copy that is added.
+        std::vector<opt::Instruction*> copyable_instructions;
+
+        // Consider all global declarations
+        for (auto& global : GetIRContext()->module()->types_values()) {
+          if (TransformationCopyObject::IsCopyable(GetIRContext(), &global)) {
+            copyable_instructions.push_back(&global);
+          }
+        }
+
+        // Consider all previous instructions in this block
+        for (auto prev_inst_it = block.begin(); prev_inst_it != inst_it;
+             ++prev_inst_it) {
+          if (TransformationCopyObject::IsCopyable(GetIRContext(),
+                                                   &*prev_inst_it)) {
+            copyable_instructions.push_back(&*prev_inst_it);
+          }
+        }
+
+        // Walk the dominator tree to consider all instructions from dominating
+        // blocks
+        auto dominator_analysis =
+            GetIRContext()->GetDominatorAnalysis(&function);
+        for (auto next_dominator =
+                 dominator_analysis->ImmediateDominator(&block);
+             next_dominator != nullptr;
+             next_dominator =
+                 dominator_analysis->ImmediateDominator(next_dominator)) {
+          for (auto& dominating_inst : *next_dominator) {
+            if (TransformationCopyObject::IsCopyable(GetIRContext(),
+                                                     &dominating_inst)) {
+              copyable_instructions.push_back(&dominating_inst);
+            }
+          }
+        }
+
+        // At this point, |copyable_instructions| contains all the instructions
+        // we might think of copying.
+
+        if (!copyable_instructions.empty()) {
+          // Choose a copyable instruction at random, and create and apply an
+          // object copying transformation based on it.
+          uint32_t index =
+              GetFuzzerContext()->RandomIndex(copyable_instructions);
+          TransformationCopyObject transformation(
+              copyable_instructions[index]->result_id(), base, offset,
+              GetFuzzerContext()->GetFreshId());
+          assert(
+              transformation.IsApplicable(GetIRContext(), *GetFactManager()) &&
+              "This transformation should be applicable by construction.");
+          transformation.Apply(GetIRContext(), GetFactManager());
+          *GetTransformations()->add_transformation() =
+              transformation.ToMessage();
+
+          if (!inst_it->HasResultId()) {
+            // We have inserted a new instruction before the current
+            // instruction, and we are tracking the current id-less instruction
+            // via an offset (offset) from a previous instruction (base) that
+            // has an id. We increment |offset| to reflect the newly-inserted
+            // instruction.
+            //
+            // This is slightly preferable to the alternative of setting |base|
+            // to be the result id of the new instruction, since on replay we
+            // might end up eliminating this copy but keeping a subsequent copy.
+            offset++;
+          }
+        }
+      }
+    }
+  }
+}
+
+}  // namespace fuzz
+}  // namespace spvtools

+ 38 - 0
3rdparty/spirv-tools/source/fuzz/fuzzer_pass_copy_objects.h

@@ -0,0 +1,38 @@
+// Copyright (c) 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef SOURCE_FUZZ_FUZZER_PASS_COPY_OBJECTS_H_
+#define SOURCE_FUZZ_FUZZER_PASS_COPY_OBJECTS_H_
+
+#include "source/fuzz/fuzzer_pass.h"
+
+namespace spvtools {
+namespace fuzz {
+
+// A fuzzer pass for adding adding copies of objects to the module.
+class FuzzerPassCopyObjects : public FuzzerPass {
+ public:
+  FuzzerPassCopyObjects(opt::IRContext* ir_context, FactManager* fact_manager,
+                        FuzzerContext* fuzzer_context,
+                        protobufs::TransformationSequence* transformations);
+
+  ~FuzzerPassCopyObjects();
+
+  void Apply() override;
+};
+
+}  // namespace fuzz
+}  // namespace spvtools
+
+#endif  // SOURCE_FUZZ_FUZZER_PASS_COPY_OBJECTS_H_

+ 15 - 24
3rdparty/spirv-tools/source/fuzz/fuzzer_pass_obfuscate_constants.cpp

@@ -48,14 +48,12 @@ void FuzzerPassObfuscateConstants::ObfuscateBoolConstantViaConstantPair(
   // a 'greater than' or 'less than' kind of opcode, and then select a
   // a 'greater than' or 'less than' kind of opcode, and then select a
   // random opcode from the resulting subset.
   // random opcode from the resulting subset.
   SpvOp comparison_opcode;
   SpvOp comparison_opcode;
-  if (GetFuzzerContext()->GetRandomGenerator()->RandomBool()) {
-    comparison_opcode = greater_than_opcodes
-        [GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-            static_cast<uint32_t>(greater_than_opcodes.size()))];
+  if (GetFuzzerContext()->ChooseEven()) {
+    comparison_opcode = greater_than_opcodes[GetFuzzerContext()->RandomIndex(
+        greater_than_opcodes)];
   } else {
   } else {
-    comparison_opcode = less_than_opcodes
-        [GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-            static_cast<uint32_t>(less_than_opcodes.size()))];
+    comparison_opcode =
+        less_than_opcodes[GetFuzzerContext()->RandomIndex(less_than_opcodes)];
   }
   }
 
 
   // We now need to decide how to order constant_id_1 and constant_id_2 such
   // We now need to decide how to order constant_id_1 and constant_id_2 such
@@ -103,8 +101,7 @@ void FuzzerPassObfuscateConstants::ObfuscateBoolConstantViaConstantPair(
   for (uint32_t index : {0u, 1u}) {
   for (uint32_t index : {0u, 1u}) {
     // We randomly decide, based on the current depth of obfuscation, whether
     // We randomly decide, based on the current depth of obfuscation, whether
     // to further obfuscate this operand.
     // to further obfuscate this operand.
-    if (GetFuzzerContext()->GoDeeperInConstantObfuscation()(
-            depth, GetFuzzerContext()->GetRandomGenerator())) {
+    if (GetFuzzerContext()->GoDeeperInConstantObfuscation(depth)) {
       auto in_operand_use = transformation::MakeIdUseDescriptor(
       auto in_operand_use = transformation::MakeIdUseDescriptor(
           binary_operator_instruction->GetSingleWordInOperand(index),
           binary_operator_instruction->GetSingleWordInOperand(index),
           binary_operator_instruction->opcode(), index,
           binary_operator_instruction->opcode(), index,
@@ -252,9 +249,9 @@ void FuzzerPassObfuscateConstants::ObfuscateBoolConstant(
     // elements with known values.
     // elements with known values.
     return;
     return;
   }
   }
-  auto chosen_type_id = available_types_with_uniforms
-      [GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-          static_cast<uint32_t>(available_types_with_uniforms.size()))];
+  auto chosen_type_id =
+      available_types_with_uniforms[GetFuzzerContext()->RandomIndex(
+          available_types_with_uniforms)];
   auto available_constants =
   auto available_constants =
       GetFactManager()->GetConstantsAvailableFromUniformsForType(
       GetFactManager()->GetConstantsAvailableFromUniformsForType(
           GetIRContext(), chosen_type_id);
           GetIRContext(), chosen_type_id);
@@ -269,15 +266,12 @@ void FuzzerPassObfuscateConstants::ObfuscateBoolConstant(
 
 
   // We know we have at least two known-to-be-constant uniforms of the chosen
   // We know we have at least two known-to-be-constant uniforms of the chosen
   // type.  Pick one of them at random.
   // type.  Pick one of them at random.
-  auto constant_index_1 =
-      GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-          static_cast<uint32_t>(available_constants.size()));
+  auto constant_index_1 = GetFuzzerContext()->RandomIndex(available_constants);
   uint32_t constant_index_2;
   uint32_t constant_index_2;
 
 
   // Now choose another one distinct from the first one.
   // Now choose another one distinct from the first one.
   do {
   do {
-    constant_index_2 = GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-        static_cast<uint32_t>(available_constants.size()));
+    constant_index_2 = GetFuzzerContext()->RandomIndex(available_constants);
   } while (constant_index_1 == constant_index_2);
   } while (constant_index_1 == constant_index_2);
 
 
   auto constant_id_1 = available_constants[constant_index_1];
   auto constant_id_1 = available_constants[constant_index_1];
@@ -321,9 +315,7 @@ void FuzzerPassObfuscateConstants::ObfuscateScalarConstant(
 
 
   // Choose a random available uniform known to be equal to the constant.
   // Choose a random available uniform known to be equal to the constant.
   protobufs::UniformBufferElementDescriptor uniform_descriptor =
   protobufs::UniformBufferElementDescriptor uniform_descriptor =
-      uniform_descriptors
-          [GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-              static_cast<uint32_t>(uniform_descriptors.size()))];
+      uniform_descriptors[GetFuzzerContext()->RandomIndex(uniform_descriptors)];
   // Create, apply and record a transformation to replace the constant use with
   // Create, apply and record a transformation to replace the constant use with
   // the result of a load from the chosen uniform.
   // the result of a load from the chosen uniform.
   auto transformation = TransformationReplaceConstantWithUniform(
   auto transformation = TransformationReplaceConstantWithUniform(
@@ -445,13 +437,12 @@ void FuzzerPassObfuscateConstants::Apply() {
   // Go through the constant uses in a random order by repeatedly pulling out a
   // Go through the constant uses in a random order by repeatedly pulling out a
   // constant use at a random index.
   // constant use at a random index.
   while (!constant_uses.empty()) {
   while (!constant_uses.empty()) {
-    auto index = GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-        static_cast<uint32_t>(constant_uses.size()));
+    auto index = GetFuzzerContext()->RandomIndex(constant_uses);
     auto constant_use = std::move(constant_uses[index]);
     auto constant_use = std::move(constant_uses[index]);
     constant_uses.erase(constant_uses.begin() + index);
     constant_uses.erase(constant_uses.begin() + index);
     // Decide probabilistically whether to skip or obfuscate this constant use.
     // Decide probabilistically whether to skip or obfuscate this constant use.
-    if (GetFuzzerContext()->GetRandomGenerator()->RandomPercentage() >
-        GetFuzzerContext()->GetChanceOfObfuscatingConstant()) {
+    if (!GetFuzzerContext()->ChoosePercentage(
+            GetFuzzerContext()->GetChanceOfObfuscatingConstant())) {
       continue;
       continue;
     }
     }
     ObfuscateConstant(0, constant_use);
     ObfuscateConstant(0, constant_use);

+ 2 - 2
3rdparty/spirv-tools/source/fuzz/fuzzer_pass_permute_blocks.cpp

@@ -57,8 +57,8 @@ void FuzzerPassPermuteBlocks::Apply() {
     // would provide more freedom for A to move.
     // would provide more freedom for A to move.
     for (auto id = block_ids.rbegin(); id != block_ids.rend(); ++id) {
     for (auto id = block_ids.rbegin(); id != block_ids.rend(); ++id) {
       // Randomly decide whether to ignore the block id.
       // Randomly decide whether to ignore the block id.
-      if (GetFuzzerContext()->GetRandomGenerator()->RandomPercentage() >
-          GetFuzzerContext()->GetChanceOfMovingBlockDown()) {
+      if (!GetFuzzerContext()->ChoosePercentage(
+              GetFuzzerContext()->GetChanceOfMovingBlockDown())) {
         continue;
         continue;
       }
       }
       // Keep pushing the block down, until pushing down fails.
       // Keep pushing the block down, until pushing down fails.

+ 5 - 5
3rdparty/spirv-tools/source/fuzz/fuzzer_pass_split_blocks.cpp

@@ -44,8 +44,9 @@ void FuzzerPassSplitBlocks::Apply() {
   // Now go through all the block pointers that were gathered.
   // Now go through all the block pointers that were gathered.
   for (auto& block : blocks) {
   for (auto& block : blocks) {
     // Probabilistically decide whether to try to split this block.
     // Probabilistically decide whether to try to split this block.
-    if (GetFuzzerContext()->GetRandomGenerator()->RandomPercentage() >
-        GetFuzzerContext()->GetChanceOfSplittingBlock()) {
+    if (!GetFuzzerContext()->ChoosePercentage(
+            GetFuzzerContext()->GetChanceOfSplittingBlock())) {
+      // We are not going to try to split this block.
       continue;
       continue;
     }
     }
     // We are going to try to split this block.  We now need to choose where
     // We are going to try to split this block.  We now need to choose where
@@ -77,9 +78,8 @@ void FuzzerPassSplitBlocks::Apply() {
     }
     }
     // Having identified all the places we might be able to split the block,
     // Having identified all the places we might be able to split the block,
     // we choose one of them.
     // we choose one of them.
-    auto base_offset = base_offset_pairs
-        [GetFuzzerContext()->GetRandomGenerator()->RandomUint32(
-            static_cast<uint32_t>(base_offset_pairs.size()))];
+    auto base_offset =
+        base_offset_pairs[GetFuzzerContext()->RandomIndex(base_offset_pairs)];
     auto transformation =
     auto transformation =
         TransformationSplitBlock(base_offset.first, base_offset.second,
         TransformationSplitBlock(base_offset.first, base_offset.second,
                                  GetFuzzerContext()->GetFreshId());
                                  GetFuzzerContext()->GetFreshId());

+ 161 - 0
3rdparty/spirv-tools/source/fuzz/fuzzer_util.cpp

@@ -205,6 +205,167 @@ opt::BasicBlock::iterator GetIteratorForBaseInstructionAndOffset(
   return nullptr;
   return nullptr;
 }
 }
 
 
+std::vector<uint32_t> GetSuccessors(opt::BasicBlock* block) {
+  std::vector<uint32_t> result;
+  switch (block->terminator()->opcode()) {
+    case SpvOpBranch:
+      result.push_back(block->terminator()->GetSingleWordInOperand(0));
+      break;
+    case SpvOpBranchConditional:
+      result.push_back(block->terminator()->GetSingleWordInOperand(1));
+      result.push_back(block->terminator()->GetSingleWordInOperand(2));
+      break;
+    case SpvOpSwitch:
+      for (uint32_t i = 1; i < block->terminator()->NumInOperands(); i += 2) {
+        result.push_back(block->terminator()->GetSingleWordInOperand(i));
+      }
+      break;
+    default:
+      break;
+  }
+  return result;
+}
+
+void FindBypassedBlocks(opt::IRContext* context, opt::BasicBlock* bb_from,
+                        opt::BasicBlock* bb_to,
+                        std::set<opt::BasicBlock*>* bypassed_blocks) {
+  // This algorithm finds all blocks different from |bb_from| that:
+  // - are in the innermost structured control flow construct containing
+  // |bb_from|
+  // - can be reached from |bb_from| without traversing a back-edge or going
+  // through |bb_to|
+  //
+  // This is achieved by doing a depth-first search of the function's CFG,
+  // exploring merge blocks before successors, and grabbing all blocks that are
+  // visited in the sub-search rooted at |bb_from|. (As an optimization, the
+  // search terminates as soon as exploration of |bb_from| has completed.)
+
+  // This represents a basic block in a partial state of exploration.  As we
+  // wish to visit merge blocks in advance of regular successors, we track them
+  // separately.
+  struct StackNode {
+    opt::BasicBlock* block;
+    bool handled_merge;
+    std::vector<uint32_t> successors;
+    uint32_t next_successor;
+  };
+
+  auto enclosing_function = bb_from->GetParent();
+
+  // The set of block ids already visited during search.  We put |bb_to| in
+  // there initially so that search automatically backtracks when this block is
+  // reached.
+  std::set<uint32_t> visited;
+  visited.insert(bb_to->id());
+
+  // Tracks when we are in the region of blocks that are to be grabbed; we flip
+  // this to 'true' once we reach |bb_from| and have finished searching its
+  // merge block (in the case that it happens to be a header.
+  bool interested = false;
+
+  std::vector<StackNode> dfs_stack;
+  opt::BasicBlock* entry_block = enclosing_function->entry().get();
+  dfs_stack.push_back({entry_block, false, GetSuccessors(entry_block), 0});
+  while (!dfs_stack.empty()) {
+    StackNode* node = &dfs_stack.back();
+
+    // First make sure we search the merge block associated ith this block, if
+    // there is one.
+    if (!node->handled_merge) {
+      node->handled_merge = true;
+      if (node->block->MergeBlockIdIfAny()) {
+        opt::BasicBlock* merge_block =
+            context->cfg()->block(node->block->MergeBlockIdIfAny());
+        // A block can only be the merge block for one header, so this block
+        // should only be in |visited| if it is |bb_to|, which we put into
+        // |visited| in advance.
+        assert(visited.count(merge_block->id()) == 0 || merge_block == bb_to);
+        if (visited.count(merge_block->id()) == 0) {
+          visited.insert(merge_block->id());
+          dfs_stack.push_back(
+              {merge_block, false, GetSuccessors(merge_block), 0});
+        }
+      }
+      continue;
+    }
+
+    // If we find |bb_from|, we are interested in grabbing previously unseen
+    // successor blocks (by this point we will have already searched the merge
+    // block associated with |bb_from|, if there is one.
+    if (node->block == bb_from) {
+      interested = true;
+    }
+
+    // Consider the next unexplored successor.
+    if (node->next_successor < node->successors.size()) {
+      uint32_t successor_id = node->successors[node->next_successor];
+      if (visited.count(successor_id) == 0) {
+        visited.insert(successor_id);
+        opt::BasicBlock* successor_block = context->cfg()->block(successor_id);
+        if (interested) {
+          // If we're in the region of interest, grab this block.
+          bypassed_blocks->insert(successor_block);
+        }
+        dfs_stack.push_back(
+            {successor_block, false, GetSuccessors(successor_block), 0});
+      }
+      node->next_successor++;
+    } else {
+      // We have finished exploring |node|.  If it is |bb_from|, we can
+      // terminate search -- we have grabbed all the relevant blocks.
+      if (node->block == bb_from) {
+        break;
+      }
+      dfs_stack.pop_back();
+    }
+  }
+}
+
+bool NewEdgeLeavingConstructBodyRespectsUseDefDominance(
+    opt::IRContext* context, opt::BasicBlock* bb_from, opt::BasicBlock* bb_to) {
+  // Find those blocks that the edge from |bb_from| to |bb_to| might bypass.
+  std::set<opt::BasicBlock*> bypassed_blocks;
+  FindBypassedBlocks(context, bb_from, bb_to, &bypassed_blocks);
+
+  // For each bypassed block, check whether it contains a definition that is
+  // used by some non-bypassed block - that would be problematic.
+  for (auto defining_block : bypassed_blocks) {
+    for (auto& inst : *defining_block) {
+      if (!context->get_def_use_mgr()->WhileEachUse(
+              &inst,
+              [context, &bypassed_blocks](opt::Instruction* user,
+                                          uint32_t operand_index) -> bool {
+                // If this use is in an OpPhi, we need to check that dominance
+                // of the relevant *parent* block is not spoiled.  Otherwise we
+                // need to check that dominance of the block containing the use
+                // is not spoiled.
+                opt::BasicBlock* use_block_or_phi_parent =
+                    user->opcode() == SpvOpPhi
+                        ? context->cfg()->block(
+                              user->GetSingleWordOperand(operand_index + 1))
+                        : context->get_instr_block(user);
+
+                // There might not be any relevant block, e.g. if the use is in
+                // a decoration; in this case the new edge is unproblematic.
+                if (use_block_or_phi_parent == nullptr) {
+                  return true;
+                }
+
+                // If the use-block is not in |bypassed_blocks| then we have
+                // found a block in the construct that is reachable from
+                // |from_block|, and which defines an id that is used outside of
+                // the construct.  Adding an edge from |from_block| to
+                // |to_block| would prevent this use being dominated.
+                return bypassed_blocks.find(use_block_or_phi_parent) !=
+                       bypassed_blocks.end();
+              })) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
 }  // namespace fuzzerutil
 }  // namespace fuzzerutil
 
 
 }  // namespace fuzz
 }  // namespace fuzz

+ 13 - 0
3rdparty/spirv-tools/source/fuzz/fuzzer_util.h

@@ -74,6 +74,19 @@ bool BlockIsInLoopContinueConstruct(opt::IRContext* context, uint32_t block_id,
 opt::BasicBlock::iterator GetIteratorForBaseInstructionAndOffset(
 opt::BasicBlock::iterator GetIteratorForBaseInstructionAndOffset(
     opt::BasicBlock* block, const opt::Instruction* base_inst, uint32_t offset);
     opt::BasicBlock* block, const opt::Instruction* base_inst, uint32_t offset);
 
 
+// Block |bb_from| is assumed to be in a structured control flow construct, and
+// block |bb_to| is assumed to be either the merge bock for that construct (in
+// the case of a loop, conditional or switch) or the continue target for that
+// construct (in the case of a loop only).
+//
+// The function determines whether adding an edge from |bb_from| to |bb_to| -
+// i.e. a break or continue for the construct
+// - is legitimate with respect to the SPIR-V rule that a definition must
+// dominate all of its uses.  This is because adding such an edge can change
+// dominance in the control flow graph, potentially making the module invalid.
+bool NewEdgeLeavingConstructBodyRespectsUseDefDominance(
+    opt::IRContext* context, opt::BasicBlock* bb_from, opt::BasicBlock* bb_to);
+
 }  // namespace fuzzerutil
 }  // namespace fuzzerutil
 
 
 }  // namespace fuzz
 }  // namespace fuzz

+ 6 - 4
3rdparty/spirv-tools/source/fuzz/transformation.cpp

@@ -25,6 +25,7 @@
 #include "transformation_add_type_float.h"
 #include "transformation_add_type_float.h"
 #include "transformation_add_type_int.h"
 #include "transformation_add_type_int.h"
 #include "transformation_add_type_pointer.h"
 #include "transformation_add_type_pointer.h"
+#include "transformation_copy_object.h"
 #include "transformation_move_block_down.h"
 #include "transformation_move_block_down.h"
 #include "transformation_replace_boolean_constant_with_constant_binary.h"
 #include "transformation_replace_boolean_constant_with_constant_binary.h"
 #include "transformation_replace_constant_with_uniform.h"
 #include "transformation_replace_constant_with_uniform.h"
@@ -59,6 +60,8 @@ std::unique_ptr<Transformation> Transformation::FromMessage(
     case protobufs::Transformation::TransformationCase::kAddTypePointer:
     case protobufs::Transformation::TransformationCase::kAddTypePointer:
       return MakeUnique<TransformationAddTypePointer>(
       return MakeUnique<TransformationAddTypePointer>(
           message.add_type_pointer());
           message.add_type_pointer());
+    case protobufs::Transformation::TransformationCase::kCopyObject:
+      return MakeUnique<TransformationCopyObject>(message.copy_object());
     case protobufs::Transformation::TransformationCase::kMoveBlockDown:
     case protobufs::Transformation::TransformationCase::kMoveBlockDown:
       return MakeUnique<TransformationMoveBlockDown>(message.move_block_down());
       return MakeUnique<TransformationMoveBlockDown>(message.move_block_down());
     case protobufs::Transformation::TransformationCase::
     case protobufs::Transformation::TransformationCase::
@@ -71,13 +74,12 @@ std::unique_ptr<Transformation> Transformation::FromMessage(
           message.replace_constant_with_uniform());
           message.replace_constant_with_uniform());
     case protobufs::Transformation::TransformationCase::kSplitBlock:
     case protobufs::Transformation::TransformationCase::kSplitBlock:
       return MakeUnique<TransformationSplitBlock>(message.split_block());
       return MakeUnique<TransformationSplitBlock>(message.split_block());
-    default:
-      assert(message.transformation_case() ==
-                 protobufs::Transformation::TRANSFORMATION_NOT_SET &&
-             "Unhandled transformation type.");
+    case protobufs::Transformation::TRANSFORMATION_NOT_SET:
       assert(false && "An unset transformation was encountered.");
       assert(false && "An unset transformation was encountered.");
       return nullptr;
       return nullptr;
   }
   }
+  assert(false && "Should be unreachable as all cases must be handled above.");
+  return nullptr;
 }
 }
 
 
 }  // namespace fuzz
 }  // namespace fuzz

+ 9 - 2
3rdparty/spirv-tools/source/fuzz/transformation_add_dead_break.cpp

@@ -162,9 +162,16 @@ bool TransformationAddDeadBreak::IsApplicable(
     return false;
     return false;
   }
   }
 
 
-  // Finally, check that adding the break would respect the rules of structured
+  // Check that adding the break would respect the rules of structured
   // control flow.
   // control flow.
-  return AddingBreakRespectsStructuredControlFlow(context, bb_from);
+  if (!AddingBreakRespectsStructuredControlFlow(context, bb_from)) {
+    return false;
+  }
+
+  // Check that adding the break would not violate the property that a
+  // definition must dominate all of its uses.
+  return fuzzerutil::NewEdgeLeavingConstructBodyRespectsUseDefDominance(
+      context, bb_from, bb_to);
 }
 }
 
 
 void TransformationAddDeadBreak::Apply(opt::IRContext* context,
 void TransformationAddDeadBreak::Apply(opt::IRContext* context,

+ 2 - 0
3rdparty/spirv-tools/source/fuzz/transformation_add_dead_break.h

@@ -48,6 +48,8 @@ class TransformationAddDeadBreak : public Transformation {
   //   the condition, and the ids in |message_.phi_ids| used to extend
   //   the condition, and the ids in |message_.phi_ids| used to extend
   //   any OpPhi instructions at b as a result of the edge from a, must
   //   any OpPhi instructions at b as a result of the edge from a, must
   //   maintain validity of the module.
   //   maintain validity of the module.
+  //   In particular, the new branch must not lead to violations of the rule
+  //   that a use must be dominated by its definition.
   bool IsApplicable(opt::IRContext* context,
   bool IsApplicable(opt::IRContext* context,
                     const FactManager& fact_manager) const override;
                     const FactManager& fact_manager) const override;
 
 

+ 7 - 0
3rdparty/spirv-tools/source/fuzz/transformation_add_dead_continue.cpp

@@ -98,6 +98,13 @@ bool TransformationAddDeadContinue::IsApplicable(
     return false;
     return false;
   }
   }
 
 
+  // Check that adding the continue would not violate the property that a
+  // definition must dominate all of its uses.
+  if (!fuzzerutil::NewEdgeLeavingConstructBodyRespectsUseDefDominance(
+          context, bb_from, context->cfg()->block(continue_block))) {
+    return false;
+  }
+
   // The transformation is good if and only if the given phi ids are sufficient
   // The transformation is good if and only if the given phi ids are sufficient
   // to extend relevant OpPhi instructions in the continue block.
   // to extend relevant OpPhi instructions in the continue block.
   return fuzzerutil::PhiIdsOkForNewEdge(context, bb_from,
   return fuzzerutil::PhiIdsOkForNewEdge(context, bb_from,

+ 3 - 0
3rdparty/spirv-tools/source/fuzz/transformation_add_dead_continue.h

@@ -47,6 +47,9 @@ class TransformationAddDeadContinue : public Transformation {
   //   as the condition, and the ids in |message_.phi_ids| used to extend any
   //   as the condition, and the ids in |message_.phi_ids| used to extend any
   //   OpPhi instructions at b as a result of the edge from a, must maintain
   //   OpPhi instructions at b as a result of the edge from a, must maintain
   //   validity of the module.
   //   validity of the module.
+  //   In particular, adding an edge from somewhere in the loop to the continue
+  //   target must not prevent uses of ids in the continue target from being
+  //   dominated by the definitions of those ids.
   bool IsApplicable(opt::IRContext* context,
   bool IsApplicable(opt::IRContext* context,
                     const FactManager& fact_manager) const override;
                     const FactManager& fact_manager) const override;
 
 

+ 42 - 26
3rdparty/spirv-tools/source/fuzz/transformation_copy_object.cpp

@@ -46,18 +46,7 @@ bool TransformationCopyObject::IsApplicable(
   if (!object_inst) {
   if (!object_inst) {
     return false;
     return false;
   }
   }
-  if (!object_inst->type_id()) {
-    // We can only apply OpCopyObject to instructions that have types.
-    return false;
-  }
-  if (!context->get_decoration_mgr()
-           ->GetDecorationsFor(message_.object(), true)
-           .empty()) {
-    // We do not copy objects that have decorations: if the copy is not
-    // decorated analogously, using the original object vs. its copy may not be
-    // equivalent.
-    // TODO(afd): it would be possible to make the copy but not add an id
-    // synonym.
+  if (!IsCopyable(context, object_inst)) {
     return false;
     return false;
   }
   }
 
 
@@ -81,22 +70,11 @@ bool TransformationCopyObject::IsApplicable(
     // The offset was inappropriate.
     // The offset was inappropriate.
     return false;
     return false;
   }
   }
-  if (insert_before->PreviousNode() &&
-      (insert_before->PreviousNode()->opcode() == SpvOpLoopMerge ||
-       insert_before->PreviousNode()->opcode() == SpvOpSelectionMerge)) {
-    // We cannot insert a copy directly after a merge instruction.
-    return false;
-  }
-  if (insert_before->opcode() == SpvOpVariable) {
-    // We cannot insert a copy directly before a variable; variables in a
-    // function must be contiguous in the entry block.
-    return false;
-  }
-  // We cannot insert a copy directly before OpPhi, because OpPhi instructions
-  // need to be contiguous at the start of a block.
-  if (insert_before->opcode() == SpvOpPhi) {
+
+  if (!CanInsertCopyBefore(insert_before)) {
     return false;
     return false;
   }
   }
+
   // |message_object| must be available at the point where we want to add the
   // |message_object| must be available at the point where we want to add the
   // copy. It is available if it is at global scope (in which case it has no
   // copy. It is available if it is at global scope (in which case it has no
   // block), or if it dominates the point of insertion but is different from the
   // block), or if it dominates the point of insertion but is different from the
@@ -154,5 +132,43 @@ protobufs::Transformation TransformationCopyObject::ToMessage() const {
   return result;
   return result;
 }
 }
 
 
+bool TransformationCopyObject::IsCopyable(opt::IRContext* ir_context,
+                                          opt::Instruction* inst) {
+  if (!inst->HasResultId()) {
+    // We can only apply OpCopyObject to instructions that generate ids.
+    return false;
+  }
+  if (!inst->type_id()) {
+    // We can only apply OpCopyObject to instructions that have types.
+    return false;
+  }
+  // We do not copy objects that have decorations: if the copy is not
+  // decorated analogously, using the original object vs. its copy may not be
+  // equivalent.
+  // TODO(afd): it would be possible to make the copy but not add an id
+  // synonym.
+  return ir_context->get_decoration_mgr()
+      ->GetDecorationsFor(inst->result_id(), true)
+      .empty();
+}
+
+bool TransformationCopyObject::CanInsertCopyBefore(
+    const opt::BasicBlock::iterator& instruction_in_block) {
+  if (instruction_in_block->PreviousNode() &&
+      (instruction_in_block->PreviousNode()->opcode() == SpvOpLoopMerge ||
+       instruction_in_block->PreviousNode()->opcode() == SpvOpSelectionMerge)) {
+    // We cannot insert a copy directly after a merge instruction.
+    return false;
+  }
+  if (instruction_in_block->opcode() == SpvOpVariable) {
+    // We cannot insert a copy directly before a variable; variables in a
+    // function must be contiguous in the entry block.
+    return false;
+  }
+  // We cannot insert a copy directly before OpPhi, because OpPhi instructions
+  // need to be contiguous at the start of a block.
+  return instruction_in_block->opcode() != SpvOpPhi;
+}
+
 }  // namespace fuzz
 }  // namespace fuzz
 }  // namespace spvtools
 }  // namespace spvtools

+ 10 - 2
3rdparty/spirv-tools/source/fuzz/transformation_copy_object.h

@@ -28,8 +28,8 @@ class TransformationCopyObject : public Transformation {
   explicit TransformationCopyObject(
   explicit TransformationCopyObject(
       const protobufs::TransformationCopyObject& message);
       const protobufs::TransformationCopyObject& message);
 
 
-  TransformationCopyObject(uint32_t fresh_id, uint32_t object,
-                           uint32_t insert_after_id, uint32_t offset);
+  TransformationCopyObject(uint32_t object, uint32_t base_instruction_id,
+                           uint32_t offset, uint32_t fresh_id);
 
 
   // - |message_.fresh_id| must not be used by the module.
   // - |message_.fresh_id| must not be used by the module.
   // - |message_.object| must be a result id that is a legitimate operand for
   // - |message_.object| must be a result id that is a legitimate operand for
@@ -58,6 +58,14 @@ class TransformationCopyObject : public Transformation {
 
 
   protobufs::Transformation ToMessage() const override;
   protobufs::Transformation ToMessage() const override;
 
 
+  // Determines whether it is OK to make a copy of |inst|.
+  static bool IsCopyable(opt::IRContext* ir_context, opt::Instruction* inst);
+
+  // Determines whether it is OK to insert a copy instruction before the given
+  // instruction.
+  static bool CanInsertCopyBefore(
+      const opt::BasicBlock::iterator& instruction_in_block);
+
  private:
  private:
   protobufs::TransformationCopyObject message_;
   protobufs::TransformationCopyObject message_;
 };
 };

+ 0 - 2
3rdparty/spirv-tools/source/opt/CMakeLists.txt

@@ -69,7 +69,6 @@ set(SPIRV_TOOLS_OPT_SOURCES
   local_redundancy_elimination.h
   local_redundancy_elimination.h
   local_single_block_elim_pass.h
   local_single_block_elim_pass.h
   local_single_store_elim_pass.h
   local_single_store_elim_pass.h
-  local_ssa_elim_pass.h
   log.h
   log.h
   loop_dependence.h
   loop_dependence.h
   loop_descriptor.h
   loop_descriptor.h
@@ -176,7 +175,6 @@ set(SPIRV_TOOLS_OPT_SOURCES
   local_redundancy_elimination.cpp
   local_redundancy_elimination.cpp
   local_single_block_elim_pass.cpp
   local_single_block_elim_pass.cpp
   local_single_store_elim_pass.cpp
   local_single_store_elim_pass.cpp
-  local_ssa_elim_pass.cpp
   loop_dependence.cpp
   loop_dependence.cpp
   loop_dependence_helpers.cpp
   loop_dependence_helpers.cpp
   loop_descriptor.cpp
   loop_descriptor.cpp

+ 12 - 1
3rdparty/spirv-tools/source/opt/cfg.cpp

@@ -110,15 +110,26 @@ void CFG::ForEachBlockInPostOrder(BasicBlock* bb,
 
 
 void CFG::ForEachBlockInReversePostOrder(
 void CFG::ForEachBlockInReversePostOrder(
     BasicBlock* bb, const std::function<void(BasicBlock*)>& f) {
     BasicBlock* bb, const std::function<void(BasicBlock*)>& f) {
+  WhileEachBlockInReversePostOrder(bb, [f](BasicBlock* b) {
+    f(b);
+    return true;
+  });
+}
+
+bool CFG::WhileEachBlockInReversePostOrder(
+    BasicBlock* bb, const std::function<bool(BasicBlock*)>& f) {
   std::vector<BasicBlock*> po;
   std::vector<BasicBlock*> po;
   std::unordered_set<BasicBlock*> seen;
   std::unordered_set<BasicBlock*> seen;
   ComputePostOrderTraversal(bb, &po, &seen);
   ComputePostOrderTraversal(bb, &po, &seen);
 
 
   for (auto current_bb = po.rbegin(); current_bb != po.rend(); ++current_bb) {
   for (auto current_bb = po.rbegin(); current_bb != po.rend(); ++current_bb) {
     if (!IsPseudoExitBlock(*current_bb) && !IsPseudoEntryBlock(*current_bb)) {
     if (!IsPseudoExitBlock(*current_bb) && !IsPseudoEntryBlock(*current_bb)) {
-      f(*current_bb);
+      if (!f(*current_bb)) {
+        return false;
+      }
     }
     }
   }
   }
+  return true;
 }
 }
 
 
 void CFG::ComputeStructuredSuccessors(Function* func) {
 void CFG::ComputeStructuredSuccessors(Function* func) {

+ 9 - 6
3rdparty/spirv-tools/source/opt/cfg.h

@@ -65,18 +65,21 @@ class CFG {
   void ComputeStructuredOrder(Function* func, BasicBlock* root,
   void ComputeStructuredOrder(Function* func, BasicBlock* root,
                               std::list<BasicBlock*>* order);
                               std::list<BasicBlock*>* order);
 
 
-  // Applies |f| to the basic block in post order starting with |bb|.
-  // Note that basic blocks that cannot be reached from |bb| node will not be
-  // processed.
+  // Applies |f| to all blocks that can be reach from |bb| in post order.
   void ForEachBlockInPostOrder(BasicBlock* bb,
   void ForEachBlockInPostOrder(BasicBlock* bb,
                                const std::function<void(BasicBlock*)>& f);
                                const std::function<void(BasicBlock*)>& f);
 
 
-  // Applies |f| to the basic block in reverse post order starting with |bb|.
-  // Note that basic blocks that cannot be reached from |bb| node will not be
-  // processed.
+  // Applies |f| to all blocks that can be reach from |bb| in reverse post
+  // order.
   void ForEachBlockInReversePostOrder(
   void ForEachBlockInReversePostOrder(
       BasicBlock* bb, const std::function<void(BasicBlock*)>& f);
       BasicBlock* bb, const std::function<void(BasicBlock*)>& f);
 
 
+  // Applies |f| to all blocks that can be reach from |bb| in reverse post
+  // order.  Return false if |f| return false on any basic block, and stops
+  // processing.
+  bool WhileEachBlockInReversePostOrder(
+      BasicBlock* bb, const std::function<bool(BasicBlock*)>& f);
+
   // Registers |blk| as a basic block in the cfg, this also updates the
   // Registers |blk| as a basic block in the cfg, this also updates the
   // predecessor lists of each successor of |blk|. |blk| must have a terminator
   // predecessor lists of each successor of |blk|. |blk| must have a terminator
   // instruction at the end of the block.
   // instruction at the end of the block.

+ 3 - 0
3rdparty/spirv-tools/source/opt/fold.cpp

@@ -646,6 +646,9 @@ Instruction* InstructionFolder::FoldInstructionToConstant(
     if (folded_const != nullptr) {
     if (folded_const != nullptr) {
       Instruction* const_inst =
       Instruction* const_inst =
           const_mgr->GetDefiningInstruction(folded_const, inst->type_id());
           const_mgr->GetDefiningInstruction(folded_const, inst->type_id());
+      if (const_inst == nullptr) {
+        return nullptr;
+      }
       assert(const_inst->type_id() == inst->type_id());
       assert(const_inst->type_id() == inst->type_id());
       // May be a new instruction that needs to be analysed.
       // May be a new instruction that needs to be analysed.
       context_->UpdateDefUse(const_inst);
       context_->UpdateDefUse(const_inst);

+ 4 - 0
3rdparty/spirv-tools/source/opt/generate_webgpu_initializers_pass.cpp

@@ -59,6 +59,8 @@ Pass::Status GenerateWebGPUInitializersPass::Process() {
     changed = true;
     changed = true;
 
 
     auto* constant_inst = GetNullConstantForVariable(inst);
     auto* constant_inst = GetNullConstantForVariable(inst);
+    if (!constant_inst) return Status::Failure;
+
     if (seen_null_constants_.find(constant_inst) ==
     if (seen_null_constants_.find(constant_inst) ==
         seen_null_constants_.end()) {
         seen_null_constants_.end()) {
       constant_inst->InsertBefore(inst);
       constant_inst->InsertBefore(inst);
@@ -78,6 +80,8 @@ Pass::Status GenerateWebGPUInitializersPass::Process() {
 
 
       changed = true;
       changed = true;
       auto* constant_inst = GetNullConstantForVariable(inst);
       auto* constant_inst = GetNullConstantForVariable(inst);
+      if (!constant_inst) return Status::Failure;
+
       AddNullInitializerToVariable(constant_inst, inst);
       AddNullInitializerToVariable(constant_inst, inst);
     }
     }
   }
   }

+ 9 - 0
3rdparty/spirv-tools/source/opt/inline_pass.cpp

@@ -720,6 +720,15 @@ bool InlinePass::IsInlinableFunction(Function* func) {
     return false;
     return false;
   }
   }
 
 
+  // Do not inline functions with an OpKill because they may be inlined into a
+  // continue construct.
+  bool has_opkill = !func->WhileEachInst(
+      [](Instruction* inst) { return inst->opcode() != SpvOpKill; });
+
+  if (has_opkill) {
+    return false;
+  }
+
   return true;
   return true;
 }
 }
 
 

+ 0 - 113
3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.cpp

@@ -1,113 +0,0 @@
-// Copyright (c) 2017 The Khronos Group Inc.
-// Copyright (c) 2017 Valve Corporation
-// Copyright (c) 2017 LunarG Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "source/opt/local_ssa_elim_pass.h"
-
-#include "source/cfa.h"
-#include "source/opt/iterator.h"
-#include "source/opt/ssa_rewrite_pass.h"
-
-namespace spvtools {
-namespace opt {
-
-bool LocalMultiStoreElimPass::AllExtensionsSupported() const {
-  // If any extension not in whitelist, return false
-  for (auto& ei : get_module()->extensions()) {
-    const char* extName =
-        reinterpret_cast<const char*>(&ei.GetInOperand(0).words[0]);
-    if (extensions_whitelist_.find(extName) == extensions_whitelist_.end())
-      return false;
-  }
-  return true;
-}
-
-Pass::Status LocalMultiStoreElimPass::ProcessImpl() {
-  // Assumes relaxed logical addressing only (see instruction.h)
-  // TODO(greg-lunarg): Add support for physical addressing
-  if (context()->get_feature_mgr()->HasCapability(SpvCapabilityAddresses))
-    return Status::SuccessWithoutChange;
-  // Do not process if module contains OpGroupDecorate. Additional
-  // support required in KillNamesAndDecorates().
-  // TODO(greg-lunarg): Add support for OpGroupDecorate
-  for (auto& ai : get_module()->annotations())
-    if (ai.opcode() == SpvOpGroupDecorate) return Status::SuccessWithoutChange;
-  // Do not process if any disallowed extensions are enabled
-  if (!AllExtensionsSupported()) return Status::SuccessWithoutChange;
-  // Process functions
-  ProcessFunction pfn = [this](Function* fp) {
-    return SSARewriter(this).RewriteFunctionIntoSSA(fp);
-  };
-  bool modified = context()->ProcessEntryPointCallTree(pfn);
-  return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange;
-}
-
-LocalMultiStoreElimPass::LocalMultiStoreElimPass() = default;
-
-Pass::Status LocalMultiStoreElimPass::Process() {
-  // Initialize extension whitelist
-  InitExtensions();
-  return ProcessImpl();
-}
-
-void LocalMultiStoreElimPass::InitExtensions() {
-  extensions_whitelist_.clear();
-  extensions_whitelist_.insert({
-      "SPV_AMD_shader_explicit_vertex_parameter",
-      "SPV_AMD_shader_trinary_minmax",
-      "SPV_AMD_gcn_shader",
-      "SPV_KHR_shader_ballot",
-      "SPV_AMD_shader_ballot",
-      "SPV_AMD_gpu_shader_half_float",
-      "SPV_KHR_shader_draw_parameters",
-      "SPV_KHR_subgroup_vote",
-      "SPV_KHR_16bit_storage",
-      "SPV_KHR_device_group",
-      "SPV_KHR_multiview",
-      "SPV_NVX_multiview_per_view_attributes",
-      "SPV_NV_viewport_array2",
-      "SPV_NV_stereo_view_rendering",
-      "SPV_NV_sample_mask_override_coverage",
-      "SPV_NV_geometry_shader_passthrough",
-      "SPV_AMD_texture_gather_bias_lod",
-      "SPV_KHR_storage_buffer_storage_class",
-      "SPV_KHR_variable_pointers",
-      "SPV_AMD_gpu_shader_int16",
-      "SPV_KHR_post_depth_coverage",
-      "SPV_KHR_shader_atomic_counter_ops",
-      "SPV_EXT_shader_stencil_export",
-      "SPV_EXT_shader_viewport_index_layer",
-      "SPV_AMD_shader_image_load_store_lod",
-      "SPV_AMD_shader_fragment_mask",
-      "SPV_EXT_fragment_fully_covered",
-      "SPV_AMD_gpu_shader_half_float_fetch",
-      "SPV_GOOGLE_decorate_string",
-      "SPV_GOOGLE_hlsl_functionality1",
-      "SPV_GOOGLE_user_type",
-      "SPV_NV_shader_subgroup_partitioned",
-      "SPV_EXT_descriptor_indexing",
-      "SPV_NV_fragment_shader_barycentric",
-      "SPV_NV_compute_shader_derivatives",
-      "SPV_NV_shader_image_footprint",
-      "SPV_NV_shading_rate",
-      "SPV_NV_mesh_shader",
-      "SPV_NV_ray_tracing",
-      "SPV_EXT_fragment_invocation_density",
-      "SPV_EXT_physical_storage_buffer",
-  });
-}
-
-}  // namespace opt
-}  // namespace spvtools

+ 0 - 72
3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.h

@@ -1,72 +0,0 @@
-// Copyright (c) 2017 The Khronos Group Inc.
-// Copyright (c) 2017 Valve Corporation
-// Copyright (c) 2017 LunarG Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef SOURCE_OPT_LOCAL_SSA_ELIM_PASS_H_
-#define SOURCE_OPT_LOCAL_SSA_ELIM_PASS_H_
-
-#include <algorithm>
-#include <map>
-#include <queue>
-#include <string>
-#include <unordered_map>
-#include <unordered_set>
-#include <utility>
-#include <vector>
-
-#include "source/opt/basic_block.h"
-#include "source/opt/def_use_manager.h"
-#include "source/opt/mem_pass.h"
-#include "source/opt/module.h"
-
-namespace spvtools {
-namespace opt {
-
-// See optimizer.hpp for documentation.
-class LocalMultiStoreElimPass : public MemPass {
-  using cbb_ptr = const BasicBlock*;
-
- public:
-  using GetBlocksFunction =
-      std::function<std::vector<BasicBlock*>*(const BasicBlock*)>;
-
-  LocalMultiStoreElimPass();
-
-  const char* name() const override { return "eliminate-local-multi-store"; }
-  Status Process() override;
-
-  IRContext::Analysis GetPreservedAnalyses() override {
-    return IRContext::kAnalysisDefUse |
-           IRContext::kAnalysisInstrToBlockMapping |
-           IRContext::kAnalysisConstants | IRContext::kAnalysisTypes;
-  }
-
- private:
-  // Initialize extensions whitelist
-  void InitExtensions();
-
-  // Return true if all extensions in this module are allowed by this pass.
-  bool AllExtensionsSupported() const;
-
-  Pass::Status ProcessImpl();
-
-  // Extensions supported by this pass.
-  std::unordered_set<std::string> extensions_whitelist_;
-};
-
-}  // namespace opt
-}  // namespace spvtools
-
-#endif  // SOURCE_OPT_LOCAL_SSA_ELIM_PASS_H_

+ 4 - 0
3rdparty/spirv-tools/source/opt/mem_pass.cpp

@@ -233,6 +233,10 @@ uint32_t MemPass::Type2Undef(uint32_t type_id) {
   const auto uitr = type2undefs_.find(type_id);
   const auto uitr = type2undefs_.find(type_id);
   if (uitr != type2undefs_.end()) return uitr->second;
   if (uitr != type2undefs_.end()) return uitr->second;
   const uint32_t undefId = TakeNextId();
   const uint32_t undefId = TakeNextId();
+  if (undefId == 0) {
+    return 0;
+  }
+
   std::unique_ptr<Instruction> undef_inst(
   std::unique_ptr<Instruction> undef_inst(
       new Instruction(context(), SpvOpUndef, type_id, undefId, {}));
       new Instruction(context(), SpvOpUndef, type_id, undefId, {}));
   get_def_use_mgr()->AnalyzeInstDefUse(&*undef_inst);
   get_def_use_mgr()->AnalyzeInstDefUse(&*undef_inst);

+ 4 - 3
3rdparty/spirv-tools/source/opt/mem_pass.h

@@ -121,9 +121,10 @@ class MemPass : public Pass {
     return (op == SpvOpDecorate || op == SpvOpDecorateId);
     return (op == SpvOpDecorate || op == SpvOpDecorateId);
   }
   }
 
 
-  // Return undef in function for type. Create and insert an undef after the
-  // first non-variable in the function if it doesn't already exist. Add
-  // undef to function undef map.
+  // Return the id of an undef value with type |type_id|.  Create and insert an
+  // undef after the first non-variable in the function if it doesn't already
+  // exist. Add undef to function undef map.  Returns 0 of the value does not
+  // exist, and cannot be created.
   uint32_t Type2Undef(uint32_t type_id);
   uint32_t Type2Undef(uint32_t type_id);
 
 
   // Cache of verified target vars
   // Cache of verified target vars

+ 1 - 1
3rdparty/spirv-tools/source/opt/optimizer.cpp

@@ -715,7 +715,7 @@ Optimizer::PassToken CreateDeadBranchElimPass() {
 
 
 Optimizer::PassToken CreateLocalMultiStoreElimPass() {
 Optimizer::PassToken CreateLocalMultiStoreElimPass() {
   return MakeUnique<Optimizer::PassToken::Impl>(
   return MakeUnique<Optimizer::PassToken::Impl>(
-      MakeUnique<opt::LocalMultiStoreElimPass>());
+      MakeUnique<opt::SSARewritePass>());
 }
 }
 
 
 Optimizer::PassToken CreateAggressiveDCEPass() {
 Optimizer::PassToken CreateAggressiveDCEPass() {

+ 0 - 1
3rdparty/spirv-tools/source/opt/passes.h

@@ -52,7 +52,6 @@
 #include "source/opt/local_redundancy_elimination.h"
 #include "source/opt/local_redundancy_elimination.h"
 #include "source/opt/local_single_block_elim_pass.h"
 #include "source/opt/local_single_block_elim_pass.h"
 #include "source/opt/local_single_store_elim_pass.h"
 #include "source/opt/local_single_store_elim_pass.h"
-#include "source/opt/local_ssa_elim_pass.h"
 #include "source/opt/loop_fission.h"
 #include "source/opt/loop_fission.h"
 #include "source/opt/loop_fusion_pass.h"
 #include "source/opt/loop_fusion_pass.h"
 #include "source/opt/loop_peeling.h"
 #include "source/opt/loop_peeling.h"

+ 34 - 12
3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.cpp

@@ -274,6 +274,9 @@ uint32_t SSARewriter::GetReachingDef(uint32_t var_id, BasicBlock* bb) {
   // of the CFG, the variable is not defined, so we use undef.
   // of the CFG, the variable is not defined, so we use undef.
   if (val_id == 0) {
   if (val_id == 0) {
     val_id = pass_->GetUndefVal(var_id);
     val_id = pass_->GetUndefVal(var_id);
+    if (val_id == 0) {
+      return 0;
+    }
   }
   }
 
 
   WriteVariable(var_id, bb, val_id);
   WriteVariable(var_id, bb, val_id);
@@ -313,12 +316,15 @@ void SSARewriter::ProcessStore(Instruction* inst, BasicBlock* bb) {
   }
   }
 }
 }
 
 
-void SSARewriter::ProcessLoad(Instruction* inst, BasicBlock* bb) {
+bool SSARewriter::ProcessLoad(Instruction* inst, BasicBlock* bb) {
   uint32_t var_id = 0;
   uint32_t var_id = 0;
   (void)pass_->GetPtr(inst, &var_id);
   (void)pass_->GetPtr(inst, &var_id);
   if (pass_->IsTargetVar(var_id)) {
   if (pass_->IsTargetVar(var_id)) {
     // Get the immediate reaching definition for |var_id|.
     // Get the immediate reaching definition for |var_id|.
     uint32_t val_id = GetReachingDef(var_id, bb);
     uint32_t val_id = GetReachingDef(var_id, bb);
+    if (val_id == 0) {
+      return false;
+    }
 
 
     // Schedule a replacement for the result of this load instruction with
     // Schedule a replacement for the result of this load instruction with
     // |val_id|. After all the rewriting decisions are made, every use of
     // |val_id|. After all the rewriting decisions are made, every use of
@@ -337,6 +343,7 @@ void SSARewriter::ProcessLoad(Instruction* inst, BasicBlock* bb) {
               << " (replacement for %" << load_id << " is %" << val_id << ")\n";
               << " (replacement for %" << load_id << " is %" << val_id << ")\n";
 #endif
 #endif
   }
   }
+  return true;
 }
 }
 
 
 void SSARewriter::PrintPhiCandidates() const {
 void SSARewriter::PrintPhiCandidates() const {
@@ -356,7 +363,7 @@ void SSARewriter::PrintReplacementTable() const {
   std::cerr << "\n";
   std::cerr << "\n";
 }
 }
 
 
-void SSARewriter::GenerateSSAReplacements(BasicBlock* bb) {
+bool SSARewriter::GenerateSSAReplacements(BasicBlock* bb) {
 #if SSA_REWRITE_DEBUGGING_LEVEL > 1
 #if SSA_REWRITE_DEBUGGING_LEVEL > 1
   std::cerr << "Generating SSA replacements for block: " << bb->id() << "\n";
   std::cerr << "Generating SSA replacements for block: " << bb->id() << "\n";
   std::cerr << bb->PrettyPrint(SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES)
   std::cerr << bb->PrettyPrint(SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES)
@@ -368,7 +375,9 @@ void SSARewriter::GenerateSSAReplacements(BasicBlock* bb) {
     if (opcode == SpvOpStore || opcode == SpvOpVariable) {
     if (opcode == SpvOpStore || opcode == SpvOpVariable) {
       ProcessStore(&inst, bb);
       ProcessStore(&inst, bb);
     } else if (inst.opcode() == SpvOpLoad) {
     } else if (inst.opcode() == SpvOpLoad) {
-      ProcessLoad(&inst, bb);
+      if (!ProcessLoad(&inst, bb)) {
+        return false;
+      }
     }
     }
   }
   }
 
 
@@ -381,6 +390,7 @@ void SSARewriter::GenerateSSAReplacements(BasicBlock* bb) {
   PrintReplacementTable();
   PrintReplacementTable();
   std::cerr << "\n\n";
   std::cerr << "\n\n";
 #endif
 #endif
+  return true;
 }
 }
 
 
 uint32_t SSARewriter::GetReplacement(std::pair<uint32_t, uint32_t> repl) {
 uint32_t SSARewriter::GetReplacement(std::pair<uint32_t, uint32_t> repl) {
@@ -560,7 +570,7 @@ void SSARewriter::FinalizePhiCandidates() {
   }
   }
 }
 }
 
 
-bool SSARewriter::RewriteFunctionIntoSSA(Function* fp) {
+Pass::Status SSARewriter::RewriteFunctionIntoSSA(Function* fp) {
 #if SSA_REWRITE_DEBUGGING_LEVEL > 0
 #if SSA_REWRITE_DEBUGGING_LEVEL > 0
   std::cerr << "Function before SSA rewrite:\n"
   std::cerr << "Function before SSA rewrite:\n"
             << fp->PrettyPrint(0) << "\n\n\n";
             << fp->PrettyPrint(0) << "\n\n\n";
@@ -571,9 +581,17 @@ bool SSARewriter::RewriteFunctionIntoSSA(Function* fp) {
 
 
   // Generate all the SSA replacements and Phi candidates. This will
   // Generate all the SSA replacements and Phi candidates. This will
   // generate incomplete and trivial Phis.
   // generate incomplete and trivial Phis.
-  pass_->cfg()->ForEachBlockInReversePostOrder(
-      fp->entry().get(),
-      [this](BasicBlock* bb) { GenerateSSAReplacements(bb); });
+  bool succeeded = pass_->cfg()->WhileEachBlockInReversePostOrder(
+      fp->entry().get(), [this](BasicBlock* bb) {
+        if (!GenerateSSAReplacements(bb)) {
+          return false;
+        }
+        return true;
+      });
+
+  if (!succeeded) {
+    return Pass::Status::Failure;
+  }
 
 
   // Remove trivial Phis and add arguments to incomplete Phis.
   // Remove trivial Phis and add arguments to incomplete Phis.
   FinalizePhiCandidates();
   FinalizePhiCandidates();
@@ -586,16 +604,20 @@ bool SSARewriter::RewriteFunctionIntoSSA(Function* fp) {
             << fp->PrettyPrint(0) << "\n";
             << fp->PrettyPrint(0) << "\n";
 #endif
 #endif
 
 
-  return modified;
+  return modified ? Pass::Status::SuccessWithChange
+                  : Pass::Status::SuccessWithoutChange;
 }
 }
 
 
 Pass::Status SSARewritePass::Process() {
 Pass::Status SSARewritePass::Process() {
-  bool modified = false;
+  Status status = Status::SuccessWithoutChange;
   for (auto& fn : *get_module()) {
   for (auto& fn : *get_module()) {
-    modified |= SSARewriter(this).RewriteFunctionIntoSSA(&fn);
+    status =
+        CombineStatus(status, SSARewriter(this).RewriteFunctionIntoSSA(&fn));
+    if (status == Status::Failure) {
+      break;
+    }
   }
   }
-  return modified ? Pass::Status::SuccessWithChange
-                  : Pass::Status::SuccessWithoutChange;
+  return status;
 }
 }
 
 
 }  // namespace opt
 }  // namespace opt

+ 7 - 7
3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.h

@@ -46,9 +46,9 @@ class SSARewriter {
   // entry point for the SSA rewrite algorithm.  SSA-target variables are
   // entry point for the SSA rewrite algorithm.  SSA-target variables are
   // locally defined variables that meet the criteria set by IsSSATargetVar.
   // locally defined variables that meet the criteria set by IsSSATargetVar.
   //
   //
-  // It returns true if function |fp| was modified.  Otherwise, it returns
-  // false.
-  bool RewriteFunctionIntoSSA(Function* fp);
+  // Returns whether the function was modified or not, and whether or not the
+  // rewrite was successful.
+  Pass::Status RewriteFunctionIntoSSA(Function* fp);
 
 
  private:
  private:
   class PhiCandidate {
   class PhiCandidate {
@@ -128,8 +128,8 @@ class SSARewriter {
 
 
   // Generates all the SSA rewriting decisions for basic block |bb|.  This
   // Generates all the SSA rewriting decisions for basic block |bb|.  This
   // populates the Phi candidate table (|phi_candidate_|) and the load
   // populates the Phi candidate table (|phi_candidate_|) and the load
-  // replacement table (|load_replacement_).
-  void GenerateSSAReplacements(BasicBlock* bb);
+  // replacement table (|load_replacement_).  Returns true if successful.
+  bool GenerateSSAReplacements(BasicBlock* bb);
 
 
   // Seals block |bb|.  Sealing a basic block means |bb| and all its
   // Seals block |bb|.  Sealing a basic block means |bb| and all its
   // predecessors of |bb| have been scanned for loads/stores.
   // predecessors of |bb| have been scanned for loads/stores.
@@ -202,8 +202,8 @@ class SSARewriter {
   // Processes the load operation |inst| in basic block |bb|. This extracts
   // Processes the load operation |inst| in basic block |bb|. This extracts
   // the variable ID being stored into, determines whether the variable is an
   // the variable ID being stored into, determines whether the variable is an
   // SSA-target variable, and, if it is, it reads its reaching definition by
   // SSA-target variable, and, if it is, it reads its reaching definition by
-  // calling |GetReachingDef|.
-  void ProcessLoad(Instruction* inst, BasicBlock* bb);
+  // calling |GetReachingDef|.  Returns true if successful.
+  bool ProcessLoad(Instruction* inst, BasicBlock* bb);
 
 
   // Reads the current definition for variable |var_id| in basic block |bb|.
   // Reads the current definition for variable |var_id| in basic block |bb|.
   // If |var_id| is not defined in block |bb| it walks up the predecessors of
   // If |var_id| is not defined in block |bb| it walks up the predecessors of

+ 6 - 1
3rdparty/spirv-tools/source/opt/wrap_opkill.cpp

@@ -95,9 +95,14 @@ uint32_t WrapOpKill::GetOpKillFuncId() {
     return 0;
     return 0;
   }
   }
 
 
+  uint32_t void_type_id = GetVoidTypeId();
+  if (void_type_id == 0) {
+    return 0;
+  }
+
   // Generate the function start instruction
   // Generate the function start instruction
   std::unique_ptr<Instruction> func_start(new Instruction(
   std::unique_ptr<Instruction> func_start(new Instruction(
-      context(), SpvOpFunction, GetVoidTypeId(), opkill_func_id, {}));
+      context(), SpvOpFunction, void_type_id, opkill_func_id, {}));
   func_start->AddOperand({SPV_OPERAND_TYPE_FUNCTION_CONTROL, {0}});
   func_start->AddOperand({SPV_OPERAND_TYPE_FUNCTION_CONTROL, {0}});
   func_start->AddOperand({SPV_OPERAND_TYPE_ID, {GetVoidFunctionTypeId()}});
   func_start->AddOperand({SPV_OPERAND_TYPE_ID, {GetVoidFunctionTypeId()}});
   opkill_function_.reset(new Function(std::move(func_start)));
   opkill_function_.reset(new Function(std::move(func_start)));

+ 11 - 1
3rdparty/spirv-tools/source/spirv_target_env.cpp

@@ -66,6 +66,8 @@ const char* spvTargetEnvDescription(spv_target_env env) {
       return "SPIR-V 1.4";
       return "SPIR-V 1.4";
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
       return "SPIR-V 1.4 (under Vulkan 1.1 semantics)";
       return "SPIR-V 1.4 (under Vulkan 1.1 semantics)";
+    case SPV_ENV_UNIVERSAL_1_5:
+      return "SPIR-V 1.5";
   }
   }
   return "";
   return "";
 }
 }
@@ -99,6 +101,8 @@ uint32_t spvVersionForTargetEnv(spv_target_env env) {
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
       return SPV_SPIRV_VERSION_WORD(1, 4);
       return SPV_SPIRV_VERSION_WORD(1, 4);
+    case SPV_ENV_UNIVERSAL_1_5:
+      return SPV_SPIRV_VERSION_WORD(1, 5);
   }
   }
   return SPV_SPIRV_VERSION_WORD(0, 0);
   return SPV_SPIRV_VERSION_WORD(0, 0);
 }
 }
@@ -112,6 +116,7 @@ static const std::pair<const char*, spv_target_env> spvTargetEnvNameMap[] = {
     {"spv1.2", SPV_ENV_UNIVERSAL_1_2},
     {"spv1.2", SPV_ENV_UNIVERSAL_1_2},
     {"spv1.3", SPV_ENV_UNIVERSAL_1_3},
     {"spv1.3", SPV_ENV_UNIVERSAL_1_3},
     {"spv1.4", SPV_ENV_UNIVERSAL_1_4},
     {"spv1.4", SPV_ENV_UNIVERSAL_1_4},
+    {"spv1.5", SPV_ENV_UNIVERSAL_1_5},
     {"opencl1.2embedded", SPV_ENV_OPENCL_EMBEDDED_1_2},
     {"opencl1.2embedded", SPV_ENV_OPENCL_EMBEDDED_1_2},
     {"opencl1.2", SPV_ENV_OPENCL_1_2},
     {"opencl1.2", SPV_ENV_OPENCL_1_2},
     {"opencl2.0embedded", SPV_ENV_OPENCL_EMBEDDED_2_0},
     {"opencl2.0embedded", SPV_ENV_OPENCL_EMBEDDED_2_0},
@@ -165,6 +170,7 @@ bool spvIsVulkanEnv(spv_target_env env) {
     case SPV_ENV_UNIVERSAL_1_3:
     case SPV_ENV_UNIVERSAL_1_3:
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_UNIVERSAL_1_4:
+    case SPV_ENV_UNIVERSAL_1_5:
       return false;
       return false;
     case SPV_ENV_VULKAN_1_0:
     case SPV_ENV_VULKAN_1_0:
     case SPV_ENV_VULKAN_1_1:
     case SPV_ENV_VULKAN_1_1:
@@ -190,6 +196,7 @@ bool spvIsOpenCLEnv(spv_target_env env) {
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
+    case SPV_ENV_UNIVERSAL_1_5:
       return false;
       return false;
     case SPV_ENV_OPENCL_1_2:
     case SPV_ENV_OPENCL_1_2:
     case SPV_ENV_OPENCL_EMBEDDED_1_2:
     case SPV_ENV_OPENCL_EMBEDDED_1_2:
@@ -227,6 +234,7 @@ bool spvIsWebGPUEnv(spv_target_env env) {
     case SPV_ENV_OPENCL_2_2:
     case SPV_ENV_OPENCL_2_2:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
+    case SPV_ENV_UNIVERSAL_1_5:
       return false;
       return false;
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_WEBGPU_0:
       return true;
       return true;
@@ -253,6 +261,7 @@ bool spvIsOpenGLEnv(spv_target_env env) {
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
+    case SPV_ENV_UNIVERSAL_1_5:
       return false;
       return false;
     case SPV_ENV_OPENGL_4_0:
     case SPV_ENV_OPENGL_4_0:
     case SPV_ENV_OPENGL_4_1:
     case SPV_ENV_OPENGL_4_1:
@@ -299,7 +308,8 @@ std::string spvLogStringForEnv(spv_target_env env) {
     case SPV_ENV_UNIVERSAL_1_1:
     case SPV_ENV_UNIVERSAL_1_1:
     case SPV_ENV_UNIVERSAL_1_2:
     case SPV_ENV_UNIVERSAL_1_2:
     case SPV_ENV_UNIVERSAL_1_3:
     case SPV_ENV_UNIVERSAL_1_3:
-    case SPV_ENV_UNIVERSAL_1_4: {
+    case SPV_ENV_UNIVERSAL_1_4:
+    case SPV_ENV_UNIVERSAL_1_5: {
       return "Universal";
       return "Universal";
     }
     }
   }
   }

+ 1 - 0
3rdparty/spirv-tools/source/table.cpp

@@ -40,6 +40,7 @@ spv_context spvContextCreate(spv_target_env env) {
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_WEBGPU_0:
     case SPV_ENV_UNIVERSAL_1_4:
     case SPV_ENV_UNIVERSAL_1_4:
+    case SPV_ENV_UNIVERSAL_1_5:
       break;
       break;
     default:
     default:
       return nullptr;
       return nullptr;

+ 5 - 0
3rdparty/spirv-tools/source/text.cpp

@@ -546,6 +546,11 @@ spv_result_t spvTextEncodeOpcode(const spvtools::AssemblyGrammar& grammar,
            << "Expected <result-id> at the beginning of an instruction, found '"
            << "Expected <result-id> at the beginning of an instruction, found '"
            << firstWord << "'.";
            << firstWord << "'.";
   }
   }
+  if (!opcodeEntry->hasResult && !result_id.empty()) {
+    return context->diagnostic()
+           << "Cannot set ID " << result_id << " because " << opcodeName
+           << " does not produce a result ID.";
+  }
   pInst->opcode = opcodeEntry->opcode;
   pInst->opcode = opcodeEntry->opcode;
   context->setPosition(nextPosition);
   context->setPosition(nextPosition);
   // Reserve the first word for the instruction.
   // Reserve the first word for the instruction.

+ 20 - 12
3rdparty/spirv-tools/source/val/validate_builtins.cpp

@@ -2901,6 +2901,26 @@ spv_result_t BuiltInsValidator::ValidateSingleBuiltInAtDefinition(
     const Decoration& decoration, const Instruction& inst) {
     const Decoration& decoration, const Instruction& inst) {
   const SpvBuiltIn label = SpvBuiltIn(decoration.params()[0]);
   const SpvBuiltIn label = SpvBuiltIn(decoration.params()[0]);
 
 
+  // Builtins can only be applied to variables, structures or constants.
+  auto target_opcode = inst.opcode();
+  if (target_opcode != SpvOpTypeStruct && target_opcode != SpvOpVariable &&
+      !spvOpcodeIsConstant(target_opcode)) {
+    return _.diag(SPV_ERROR_INVALID_DATA, &inst)
+           << "BuiltIns can only target variables, structs or constants";
+  }
+
+  if (!spvIsVulkanOrWebGPUEnv(_.context()->target_env)) {
+    // Early return. All currently implemented rules are based on Vulkan or
+    // WebGPU spec.
+    //
+    // TODO: If you are adding validation rules for environments other than
+    // Vulkan or WebGPU (or general rules which are not environment
+    // independent), then you need to modify or remove this condition. Consider
+    // also adding early returns into BuiltIn-specific rules, so that the system
+    // doesn't spawn new rules which don't do anything.
+    return SPV_SUCCESS;
+  }
+
   if (spvIsWebGPUEnv(_.context()->target_env) &&
   if (spvIsWebGPUEnv(_.context()->target_env) &&
       !IsBuiltInValidForWebGPU(label)) {
       !IsBuiltInValidForWebGPU(label)) {
     return _.diag(SPV_ERROR_INVALID_DATA, &inst)
     return _.diag(SPV_ERROR_INVALID_DATA, &inst)
@@ -3156,18 +3176,6 @@ spv_result_t BuiltInsValidator::Run() {
 
 
 // Validates correctness of built-in variables.
 // Validates correctness of built-in variables.
 spv_result_t ValidateBuiltIns(ValidationState_t& _) {
 spv_result_t ValidateBuiltIns(ValidationState_t& _) {
-  if (!spvIsVulkanOrWebGPUEnv(_.context()->target_env)) {
-    // Early return. All currently implemented rules are based on Vulkan or
-    // WebGPU spec.
-    //
-    // TODO: If you are adding validation rules for environments other than
-    // Vulkan or WebGPU (or general rules which are not environment
-    // independent), then you need to modify or remove this condition. Consider
-    // also adding early returns into BuiltIn-specific rules, so that the system
-    // doesn't spawn new rules which don't do anything.
-    return SPV_SUCCESS;
-  }
-
   BuiltInsValidator validator(_);
   BuiltInsValidator validator(_);
   return validator.Run();
   return validator.Run();
 }
 }

+ 14 - 7
3rdparty/spirv-tools/source/val/validate_instruction.cpp

@@ -205,17 +205,24 @@ spv_result_t CheckRequiredCapabilities(ValidationState_t& state,
           operand_desc->capabilities, operand_desc->numCapabilities);
           operand_desc->capabilities, operand_desc->numCapabilities);
     }
     }
 
 
-    if (!state.HasAnyOfCapabilities(enabling_capabilities)) {
-      return state.diag(SPV_ERROR_INVALID_CAPABILITY, inst)
-             << "Operand " << which_operand << " of "
-             << spvOpcodeString(inst->opcode())
-             << " requires one of these capabilities: "
-             << ToString(enabling_capabilities, state.grammar());
+    // When encountering an OpCapability instruction, the instruction pass
+    // registers a capability with the module *before* checking capabilities.
+    // So in the case of an OpCapability instruction, don't bother checking
+    // enablement by another capability.
+    if (inst->opcode() != SpvOpCapability) {
+      const bool enabled_by_cap =
+          state.HasAnyOfCapabilities(enabling_capabilities);
+      if (!enabling_capabilities.IsEmpty() && !enabled_by_cap) {
+        return state.diag(SPV_ERROR_INVALID_CAPABILITY, inst)
+               << "Operand " << which_operand << " of "
+               << spvOpcodeString(inst->opcode())
+               << " requires one of these capabilities: "
+               << ToString(enabling_capabilities, state.grammar());
+      }
     }
     }
     return OperandVersionExtensionCheck(state, inst, which_operand,
     return OperandVersionExtensionCheck(state, inst, which_operand,
                                         *operand_desc, word);
                                         *operand_desc, word);
   }
   }
-
   return SPV_SUCCESS;
   return SPV_SUCCESS;
 }
 }
 
 

+ 11 - 1
3rdparty/spirv-tools/source/val/validation_state.h

@@ -330,6 +330,12 @@ class ValidationState_t {
     return module_capabilities_.Contains(cap);
     return module_capabilities_.Contains(cap);
   }
   }
 
 
+  /// Returns a reference to the set of capabilities in the module.
+  /// This is provided for debuggability.
+  const CapabilitySet& module_capabilities() const {
+    return module_capabilities_;
+  }
+
   /// Returns true if the extension is enabled in the module.
   /// Returns true if the extension is enabled in the module.
   bool HasExtension(Extension ext) const {
   bool HasExtension(Extension ext) const {
     return module_extensions_.Contains(ext);
     return module_extensions_.Contains(ext);
@@ -380,7 +386,11 @@ class ValidationState_t {
 
 
   /// Registers the decoration for the given <id>
   /// Registers the decoration for the given <id>
   void RegisterDecorationForId(uint32_t id, const Decoration& dec) {
   void RegisterDecorationForId(uint32_t id, const Decoration& dec) {
-    id_decorations_[id].push_back(dec);
+    auto& dec_list = id_decorations_[id];
+    auto lb = std::find(dec_list.begin(), dec_list.end(), dec);
+    if (lb == dec_list.end()) {
+      dec_list.push_back(dec);
+    }
   }
   }
 
 
   /// Registers the list of decorations for the given <id>
   /// Registers the list of decorations for the given <id>

+ 14 - 1
3rdparty/spirv-tools/test/assembly_format_test.cpp

@@ -20,7 +20,7 @@ namespace {
 using spvtest::ScopedContext;
 using spvtest::ScopedContext;
 using spvtest::TextToBinaryTest;
 using spvtest::TextToBinaryTest;
 
 
-TEST_F(TextToBinaryTest, NotPlacingResultIDAtTheBeginning) {
+TEST_F(TextToBinaryTest, InstOpcodeProducesResultIDButNoIDDefinedFails) {
   SetText("OpTypeMatrix %1 %2 1000");
   SetText("OpTypeMatrix %1 %2 1000");
   EXPECT_EQ(SPV_ERROR_INVALID_TEXT,
   EXPECT_EQ(SPV_ERROR_INVALID_TEXT,
             spvTextToBinary(ScopedContext().context, text.str, text.length,
             spvTextToBinary(ScopedContext().context, text.str, text.length,
@@ -33,5 +33,18 @@ TEST_F(TextToBinaryTest, NotPlacingResultIDAtTheBeginning) {
   EXPECT_EQ(0u, diagnostic->position.line);
   EXPECT_EQ(0u, diagnostic->position.line);
 }
 }
 
 
+TEST_F(TextToBinaryTest,
+       InstDefinesResultIDButOpcodeDoesNotProduceAResultFails) {
+  SetText("\n\n%foo = OpName %1 \"bar\"");
+  EXPECT_EQ(SPV_ERROR_INVALID_TEXT,
+            spvTextToBinary(ScopedContext().context, text.str, text.length,
+                            &binary, &diagnostic));
+  ASSERT_NE(nullptr, diagnostic);
+  EXPECT_STREQ(
+      "Cannot set ID %foo because OpName does not produce a result ID.",
+      diagnostic->error);
+  EXPECT_EQ(2u, diagnostic->position.line);
+}
+
 }  // namespace
 }  // namespace
 }  // namespace svptools
 }  // namespace svptools

+ 2 - 2
3rdparty/spirv-tools/test/c_interface_test.cpp

@@ -107,7 +107,7 @@ TEST(CInterface, DefaultConsumerNullDiagnosticForInvalidValidating) {
 }
 }
 
 
 TEST(CInterface, SpecifyConsumerNullDiagnosticForAssembling) {
 TEST(CInterface, SpecifyConsumerNullDiagnosticForAssembling) {
-  const char input_text[] = "%1 = OpName\n";
+  const char input_text[] = "     OpName\n";
 
 
   auto context = spvContextCreate(SPV_ENV_UNIVERSAL_1_1);
   auto context = spvContextCreate(SPV_ENV_UNIVERSAL_1_1);
   int invocation = 0;
   int invocation = 0;
@@ -213,7 +213,7 @@ TEST(CInterface, SpecifyConsumerNullDiagnosticForValidating) {
 // When having both a consumer and an diagnostic object, the diagnostic object
 // When having both a consumer and an diagnostic object, the diagnostic object
 // should take priority.
 // should take priority.
 TEST(CInterface, SpecifyConsumerSpecifyDiagnosticForAssembling) {
 TEST(CInterface, SpecifyConsumerSpecifyDiagnosticForAssembling) {
-  const char input_text[] = "%1 = OpName";
+  const char input_text[] = "     OpName";
 
 
   auto context = spvContextCreate(SPV_ENV_UNIVERSAL_1_1);
   auto context = spvContextCreate(SPV_ENV_UNIVERSAL_1_1);
   int invocation = 0;
   int invocation = 0;

+ 479 - 0
3rdparty/spirv-tools/test/fuzz/transformation_add_dead_break_test.cpp

@@ -2080,6 +2080,485 @@ TEST(TransformationAddDeadBreakTest, PhiInstructions) {
   ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
   ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
 }
 }
 
 
+TEST(TransformationAddDeadBreakTest, RespectDominanceRules1) {
+  // Right after the loop, an OpCopyObject defined by the loop is used.  Adding
+  // a dead break would prevent that use from being dominated by its definition,
+  // so is not allowed.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %104
+        %104 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpBranchConditional %11 %100 %101
+        %101 = OpLabel
+        %201 = OpCopyObject %10 %200
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  auto bad_transformation = TransformationAddDeadBreak(100, 101, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+}
+
+TEST(TransformationAddDeadBreakTest, RespectDominanceRules2) {
+  // This example captures the following idiom:
+  //
+  //   if {
+  // L1:
+  //   }
+  //   definition;
+  // L2:
+  //   use;
+  //
+  // Adding a dead jump from L1 to L2 would lead to 'definition' no longer
+  // dominating 'use', and so is not allowed.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpSelectionMerge %101 None
+               OpBranchConditional %11 %102 %103
+        %102 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %101
+        %101 = OpLabel
+        %201 = OpCopyObject %10 %200
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  auto bad_transformation = TransformationAddDeadBreak(102, 101, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+}
+
+TEST(TransformationAddDeadBreakTest, RespectDominanceRules3) {
+  // Right after the loop, an OpCopyObject defined by the loop is used in an
+  // OpPhi. Adding a dead break is OK in this case, due to the use being in an
+  // OpPhi.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %104
+        %104 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpBranchConditional %11 %100 %101
+        %101 = OpLabel
+        %201 = OpPhi %10 %200 %102
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  auto good_transformation = TransformationAddDeadBreak(100, 101, false, {11});
+  ASSERT_TRUE(good_transformation.IsApplicable(context.get(), fact_manager));
+
+  good_transformation.Apply(context.get(), &fact_manager);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  std::string after_transformation = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranchConditional %11 %101 %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %104
+        %104 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpBranchConditional %11 %100 %101
+        %101 = OpLabel
+        %201 = OpPhi %10 %200 %102 %11 %100
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
+}
+
+TEST(TransformationAddDeadBreakTest, RespectDominanceRules4) {
+  // This example captures the following idiom:
+  //
+  //   if {
+  // L1:
+  //   }
+  //   definition;
+  // L2:
+  //   use in OpPhi;
+  //
+  // Adding a dead jump from L1 to L2 is OK, due to 'use' being in an OpPhi.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpSelectionMerge %101 None
+               OpBranchConditional %11 %102 %103
+        %102 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %101
+        %101 = OpLabel
+        %201 = OpPhi %10 %200 %103
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  auto good_transformation = TransformationAddDeadBreak(102, 101, false, {11});
+  ASSERT_TRUE(good_transformation.IsApplicable(context.get(), fact_manager));
+
+  good_transformation.Apply(context.get(), &fact_manager);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  std::string after_transformation = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpSelectionMerge %101 None
+               OpBranchConditional %11 %102 %103
+        %102 = OpLabel
+               OpBranchConditional %11 %101 %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %101
+        %101 = OpLabel
+        %201 = OpPhi %10 %200 %103 %11 %102
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
+}
+
+TEST(TransformationAddDeadBreakTest, RespectDominanceRules5) {
+  // After, but not right after, the loop, an OpCopyObject defined by the loop
+  // is used in an OpPhi. Adding a dead break is not OK in this case.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %104
+        %104 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpBranchConditional %11 %100 %101
+        %101 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %201 = OpPhi %10 %200 %101
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  auto bad_transformation = TransformationAddDeadBreak(100, 101, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+}
+
+TEST(TransformationAddDeadBreakTest, RespectDominanceRules6) {
+  // This example captures the following idiom:
+  //
+  //   if {
+  // L1:
+  //   }
+  //   definition;
+  // L2:
+  //   goto L3;
+  // L3:
+  //   use in OpPhi;
+  //
+  // Adding a dead jump from L1 to L2 not OK, due to the use in an OpPhi being
+  // in L3.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpSelectionMerge %101 None
+               OpBranchConditional %11 %102 %103
+        %102 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %101
+        %101 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+        %201 = OpPhi %10 %200 %101
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  auto bad_transformation = TransformationAddDeadBreak(102, 101, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+}
+
+TEST(TransformationAddDeadBreakTest, RespectDominanceRules7) {
+  // This example - a variation on an earlier test - captures the following
+  // idiom:
+  //
+  //   loop {
+  // L1:
+  //   }
+  //   definition;
+  // L2:
+  //   use;
+  //
+  // Adding a dead jump from L1 to L2 would lead to 'definition' no longer
+  // dominating 'use', and so is not allowed.
+  //
+  // This version of the test captures the case where L1 appears after the
+  // loop merge (which SPIR-V dominance rules allow).
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %104 None
+               OpBranchConditional %11 %102 %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %101
+        %101 = OpLabel
+        %201 = OpCopyObject %10 %200
+               OpReturn
+        %102 = OpLabel
+               OpBranch %103
+        %104 = OpLabel
+               OpBranch %100
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  auto bad_transformation = TransformationAddDeadBreak(102, 101, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+}
+
+TEST(TransformationAddDeadBreakTest, RespectDominanceRules8) {
+  // A variation of RespectDominanceRules8 where the defining block appears
+  // in the loop, but after the definition of interest.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %104 None
+               OpBranchConditional %11 %102 %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %101
+        %102 = OpLabel
+               OpBranch %103
+        %101 = OpLabel
+        %201 = OpCopyObject %10 %200
+               OpReturn
+        %104 = OpLabel
+               OpBranch %100
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  auto bad_transformation = TransformationAddDeadBreak(102, 101, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+}
+
 }  // namespace
 }  // namespace
 }  // namespace fuzz
 }  // namespace fuzz
 }  // namespace spvtools
 }  // namespace spvtools

+ 220 - 0
3rdparty/spirv-tools/test/fuzz/transformation_add_dead_continue_test.cpp

@@ -1029,6 +1029,226 @@ TEST(TransformationAddDeadContinueTest, PhiInstructions) {
   ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
   ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
 }
 }
 
 
+TEST(TransformationAddDeadContinueTest, RespectDominanceRules1) {
+  // Checks that a dead continue cannot be added if it would prevent a block
+  // later in the loop from dominating the loop's continue construct, in the
+  // case where said block defines and id that is used in the loop's continue
+  // construct.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %6
+          %6 = OpLabel
+               OpLoopMerge %8 %9 None
+               OpBranch %7
+          %7 = OpLabel
+         %21 = OpCopyObject %10 %11
+               OpBranch %9
+          %9 = OpLabel
+         %20 = OpPhi %10 %21 %7
+               OpBranchConditional %11 %6 %8
+          %8 = OpLabel
+               OpBranch %12
+         %12 = OpLabel
+               OpLoopMerge %14 %15 None
+               OpBranch %13
+         %13 = OpLabel
+               OpBranch %22
+         %22 = OpLabel
+         %23 = OpCopyObject %10 %11
+               OpBranch %25
+         %25 = OpLabel
+               OpBranch %15
+         %15 = OpLabel
+         %26 = OpCopyObject %10 %23
+               OpBranchConditional %11 %12 %14
+         %14 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  // This transformation is not applicable because the dead continue from the
+  // loop body prevents the definition of %23 later in the loop body from
+  // dominating its use in the loop's continue target.
+  auto bad_transformation = TransformationAddDeadContinue(13, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+
+  auto good_transformation_1 = TransformationAddDeadContinue(7, false, {});
+  ASSERT_TRUE(good_transformation_1.IsApplicable(context.get(), fact_manager));
+  good_transformation_1.Apply(context.get(), &fact_manager);
+
+  auto good_transformation_2 = TransformationAddDeadContinue(22, false, {});
+  ASSERT_TRUE(good_transformation_2.IsApplicable(context.get(), fact_manager));
+  good_transformation_2.Apply(context.get(), &fact_manager);
+
+  // This transformation is OK, because the definition of %21 in the loop body
+  // is only used in an OpPhi in the loop's continue target.
+  auto good_transformation_3 = TransformationAddDeadContinue(6, false, {11});
+  ASSERT_TRUE(good_transformation_3.IsApplicable(context.get(), fact_manager));
+  good_transformation_3.Apply(context.get(), &fact_manager);
+
+  std::string after_transformations = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %6
+          %6 = OpLabel
+               OpLoopMerge %8 %9 None
+               OpBranchConditional %11 %9 %7
+          %7 = OpLabel
+         %21 = OpCopyObject %10 %11
+               OpBranchConditional %11 %9 %9
+          %9 = OpLabel
+         %20 = OpPhi %10 %21 %7 %11 %6
+               OpBranchConditional %11 %6 %8
+          %8 = OpLabel
+               OpBranch %12
+         %12 = OpLabel
+               OpLoopMerge %14 %15 None
+               OpBranch %13
+         %13 = OpLabel
+               OpBranch %22
+         %22 = OpLabel
+         %23 = OpCopyObject %10 %11
+               OpBranchConditional %11 %15 %25
+         %25 = OpLabel
+               OpBranch %15
+         %15 = OpLabel
+         %26 = OpCopyObject %10 %23
+               OpBranchConditional %11 %12 %14
+         %14 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  ASSERT_TRUE(IsEqual(env, after_transformations, context.get()));
+}
+
+TEST(TransformationAddDeadContinueTest, RespectDominanceRules2) {
+  // Checks that a dead continue cannot be added if it would lead to a use after
+  // the loop failing to be dominated by its definition.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %104
+        %104 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpBranchConditional %11 %100 %101
+        %101 = OpLabel
+        %201 = OpCopyObject %10 %200
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  // This transformation would shortcut the part of the loop body that defines
+  // an id used after the loop.
+  auto bad_transformation = TransformationAddDeadContinue(100, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+}
+
+TEST(TransformationAddDeadContinueTest, RespectDominanceRules3) {
+  // Checks that a dead continue cannot be added if it would lead to a dominance
+  // problem with an id used in an OpPhi after the loop.
+
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+         %10 = OpTypeBool
+         %11 = OpConstantFalse %10
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %200 = OpCopyObject %10 %11
+               OpBranch %104
+        %104 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpBranchConditional %11 %100 %101
+        %101 = OpLabel
+        %201 = OpPhi %10 %200 %102
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  ASSERT_TRUE(IsValid(env, context.get()));
+
+  FactManager fact_manager;
+
+  // This transformation would shortcut the part of the loop body that defines
+  // an id used after the loop.
+  auto bad_transformation = TransformationAddDeadContinue(100, false, {});
+  ASSERT_FALSE(bad_transformation.IsApplicable(context.get(), fact_manager));
+}
+
 }  // namespace
 }  // namespace
 }  // namespace fuzz
 }  // namespace fuzz
 }  // namespace spvtools
 }  // namespace spvtools

+ 14 - 2
3rdparty/spirv-tools/test/operand_capabilities_test.cpp

@@ -494,8 +494,8 @@ INSTANTIATE_TEST_SUITE_P(
             CASE3(BUILT_IN, BuiltInPrimitiveId, Geometry, Tessellation,
             CASE3(BUILT_IN, BuiltInPrimitiveId, Geometry, Tessellation,
                   RayTracingNV),
                   RayTracingNV),
             CASE2(BUILT_IN, BuiltInInvocationId, Geometry, Tessellation),
             CASE2(BUILT_IN, BuiltInInvocationId, Geometry, Tessellation),
-            CASE1(BUILT_IN, BuiltInLayer, Geometry),
-            CASE1(BUILT_IN, BuiltInViewportIndex, MultiViewport),  // Bug 15234
+            CASE2(BUILT_IN, BuiltInLayer, Geometry, ShaderViewportIndexLayerEXT),
+            CASE2(BUILT_IN, BuiltInViewportIndex, MultiViewport, ShaderViewportIndexLayerEXT),  // Bug 15234
             CASE1(BUILT_IN, BuiltInTessLevelOuter, Tessellation),
             CASE1(BUILT_IN, BuiltInTessLevelOuter, Tessellation),
             CASE1(BUILT_IN, BuiltInTessLevelInner, Tessellation),
             CASE1(BUILT_IN, BuiltInTessLevelInner, Tessellation),
             CASE1(BUILT_IN, BuiltInTessCoord, Tessellation),
             CASE1(BUILT_IN, BuiltInTessCoord, Tessellation),
@@ -532,6 +532,18 @@ INSTANTIATE_TEST_SUITE_P(
             // clang-format on
             // clang-format on
         })));
         })));
 
 
+INSTANTIATE_TEST_SUITE_P(
+    BuiltInV1_5, EnumCapabilityTest,
+    Combine(
+        Values(SPV_ENV_UNIVERSAL_1_5),
+        ValuesIn(std::vector<EnumCapabilityCase>{
+            // SPIR-V 1.5 adds new capabilities to enable these two builtins.
+            CASE3(BUILT_IN, BuiltInLayer, Geometry, ShaderLayer,
+                  ShaderViewportIndexLayerEXT),
+            CASE3(BUILT_IN, BuiltInViewportIndex, MultiViewport,
+                  ShaderViewportIndex, ShaderViewportIndexLayerEXT),
+        })));
+
 // See SPIR-V Section 3.22 Selection Control
 // See SPIR-V Section 3.22 Selection Control
 INSTANTIATE_TEST_SUITE_P(
 INSTANTIATE_TEST_SUITE_P(
     SelectionControl, EnumCapabilityTest,
     SelectionControl, EnumCapabilityTest,

+ 29 - 29
3rdparty/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp

@@ -6645,11 +6645,11 @@ TEST_F(AggressiveDCETest, NoEliminateForwardPointer) {
 
 
   const std::string predefs1 =
   const std::string predefs1 =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability PhysicalStorageBufferAddressesEXT
+OpCapability PhysicalStorageBufferAddresses
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel PhysicalStorageBuffer64EXT GLSL450
+OpMemoryModel PhysicalStorageBuffer64 GLSL450
 OpEntryPoint GLCompute %main "main"
 OpEntryPoint GLCompute %main "main"
 OpExecutionMode %main LocalSize 1 1 1
 OpExecutionMode %main LocalSize 1 1 1
 OpSource GLSL 450
 OpSource GLSL 450
@@ -6668,7 +6668,7 @@ OpName %r "r"
 OpMemberDecorate %blockType 0 Offset 0
 OpMemberDecorate %blockType 0 Offset 0
 OpMemberDecorate %blockType 1 Offset 8
 OpMemberDecorate %blockType 1 Offset 8
 OpDecorate %blockType Block
 OpDecorate %blockType Block
-OpDecorate %b AliasedPointerEXT
+OpDecorate %b AliasedPointer
 OpMemberDecorate %rootBlock 0 Offset 0
 OpMemberDecorate %rootBlock 0 Offset 0
 OpDecorate %rootBlock Block
 OpDecorate %rootBlock Block
 OpDecorate %r DescriptorSet 0
 OpDecorate %r DescriptorSet 0
@@ -6695,50 +6695,50 @@ OpDecorate %r Binding 0
   const std::string predefs2_before =
   const std::string predefs2_before =
       R"(%void = OpTypeVoid
       R"(%void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
-OpTypeForwardPointer %_ptr_PhysicalStorageBufferEXT_blockType PhysicalStorageBufferEXT
+OpTypeForwardPointer %_ptr_PhysicalStorageBuffer_blockType PhysicalStorageBuffer
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1
-%blockType = OpTypeStruct %int %_ptr_PhysicalStorageBufferEXT_blockType
-%_ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer PhysicalStorageBufferEXT %blockType
-%_ptr_Function__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer Function %_ptr_PhysicalStorageBufferEXT_blockType
-%rootBlock = OpTypeStruct %_ptr_PhysicalStorageBufferEXT_blockType
+%blockType = OpTypeStruct %int %_ptr_PhysicalStorageBuffer_blockType
+%_ptr_PhysicalStorageBuffer_blockType = OpTypePointer PhysicalStorageBuffer %blockType
+%_ptr_Function__ptr_PhysicalStorageBuffer_blockType = OpTypePointer Function %_ptr_PhysicalStorageBuffer_blockType
+%rootBlock = OpTypeStruct %_ptr_PhysicalStorageBuffer_blockType
 %_ptr_StorageBuffer_rootBlock = OpTypePointer StorageBuffer %rootBlock
 %_ptr_StorageBuffer_rootBlock = OpTypePointer StorageBuffer %rootBlock
 %r = OpVariable %_ptr_StorageBuffer_rootBlock StorageBuffer
 %r = OpVariable %_ptr_StorageBuffer_rootBlock StorageBuffer
 %int_0 = OpConstant %int 0
 %int_0 = OpConstant %int 0
-%_ptr_StorageBuffer__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer StorageBuffer %_ptr_PhysicalStorageBufferEXT_blockType
+%_ptr_StorageBuffer__ptr_PhysicalStorageBuffer_blockType = OpTypePointer StorageBuffer %_ptr_PhysicalStorageBuffer_blockType
 %int_1 = OpConstant %int 1
 %int_1 = OpConstant %int 1
-%_ptr_PhysicalStorageBufferEXT__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer PhysicalStorageBufferEXT %_ptr_PhysicalStorageBufferEXT_blockType
+%_ptr_PhysicalStorageBuffer__ptr_PhysicalStorageBuffer_blockType = OpTypePointer PhysicalStorageBuffer %_ptr_PhysicalStorageBuffer_blockType
 %int_531 = OpConstant %int 531
 %int_531 = OpConstant %int 531
-%_ptr_PhysicalStorageBufferEXT_int = OpTypePointer PhysicalStorageBufferEXT %int
+%_ptr_PhysicalStorageBuffer_int = OpTypePointer PhysicalStorageBuffer %int
 )";
 )";
 
 
   const std::string predefs2_after =
   const std::string predefs2_after =
       R"(%void = OpTypeVoid
       R"(%void = OpTypeVoid
 %8 = OpTypeFunction %void
 %8 = OpTypeFunction %void
-OpTypeForwardPointer %_ptr_PhysicalStorageBufferEXT_blockType PhysicalStorageBufferEXT
+OpTypeForwardPointer %_ptr_PhysicalStorageBuffer_blockType PhysicalStorageBuffer
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1
-%blockType = OpTypeStruct %int %_ptr_PhysicalStorageBufferEXT_blockType
-%_ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer PhysicalStorageBufferEXT %blockType
-%rootBlock = OpTypeStruct %_ptr_PhysicalStorageBufferEXT_blockType
+%blockType = OpTypeStruct %int %_ptr_PhysicalStorageBuffer_blockType
+%_ptr_PhysicalStorageBuffer_blockType = OpTypePointer PhysicalStorageBuffer %blockType
+%rootBlock = OpTypeStruct %_ptr_PhysicalStorageBuffer_blockType
 %_ptr_StorageBuffer_rootBlock = OpTypePointer StorageBuffer %rootBlock
 %_ptr_StorageBuffer_rootBlock = OpTypePointer StorageBuffer %rootBlock
 %r = OpVariable %_ptr_StorageBuffer_rootBlock StorageBuffer
 %r = OpVariable %_ptr_StorageBuffer_rootBlock StorageBuffer
 %int_0 = OpConstant %int 0
 %int_0 = OpConstant %int 0
-%_ptr_StorageBuffer__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer StorageBuffer %_ptr_PhysicalStorageBufferEXT_blockType
+%_ptr_StorageBuffer__ptr_PhysicalStorageBuffer_blockType = OpTypePointer StorageBuffer %_ptr_PhysicalStorageBuffer_blockType
 %int_1 = OpConstant %int 1
 %int_1 = OpConstant %int 1
-%_ptr_PhysicalStorageBufferEXT__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer PhysicalStorageBufferEXT %_ptr_PhysicalStorageBufferEXT_blockType
+%_ptr_PhysicalStorageBuffer__ptr_PhysicalStorageBuffer_blockType = OpTypePointer PhysicalStorageBuffer %_ptr_PhysicalStorageBuffer_blockType
 %int_531 = OpConstant %int 531
 %int_531 = OpConstant %int 531
-%_ptr_PhysicalStorageBufferEXT_int = OpTypePointer PhysicalStorageBufferEXT %int
+%_ptr_PhysicalStorageBuffer_int = OpTypePointer PhysicalStorageBuffer %int
 )";
 )";
 
 
   const std::string func_before =
   const std::string func_before =
       R"(%main = OpFunction %void None %3
       R"(%main = OpFunction %void None %3
 %5 = OpLabel
 %5 = OpLabel
-%b = OpVariable %_ptr_Function__ptr_PhysicalStorageBufferEXT_blockType Function
-%16 = OpAccessChain %_ptr_StorageBuffer__ptr_PhysicalStorageBufferEXT_blockType %r %int_0
-%17 = OpLoad %_ptr_PhysicalStorageBufferEXT_blockType %16
-%21 = OpAccessChain %_ptr_PhysicalStorageBufferEXT__ptr_PhysicalStorageBufferEXT_blockType %17 %int_1
-%22 = OpLoad %_ptr_PhysicalStorageBufferEXT_blockType %21 Aligned 8
+%b = OpVariable %_ptr_Function__ptr_PhysicalStorageBuffer_blockType Function
+%16 = OpAccessChain %_ptr_StorageBuffer__ptr_PhysicalStorageBuffer_blockType %r %int_0
+%17 = OpLoad %_ptr_PhysicalStorageBuffer_blockType %16
+%21 = OpAccessChain %_ptr_PhysicalStorageBuffer__ptr_PhysicalStorageBuffer_blockType %17 %int_1
+%22 = OpLoad %_ptr_PhysicalStorageBuffer_blockType %21 Aligned 8
 OpStore %b %22
 OpStore %b %22
-%26 = OpAccessChain %_ptr_PhysicalStorageBufferEXT_int %22 %int_0
+%26 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %22 %int_0
 OpStore %26 %int_531 Aligned 16
 OpStore %26 %int_531 Aligned 16
 OpReturn
 OpReturn
 OpFunctionEnd
 OpFunctionEnd
@@ -6747,11 +6747,11 @@ OpFunctionEnd
   const std::string func_after =
   const std::string func_after =
       R"(%main = OpFunction %void None %8
       R"(%main = OpFunction %void None %8
 %19 = OpLabel
 %19 = OpLabel
-%20 = OpAccessChain %_ptr_StorageBuffer__ptr_PhysicalStorageBufferEXT_blockType %r %int_0
-%21 = OpLoad %_ptr_PhysicalStorageBufferEXT_blockType %20
-%22 = OpAccessChain %_ptr_PhysicalStorageBufferEXT__ptr_PhysicalStorageBufferEXT_blockType %21 %int_1
-%23 = OpLoad %_ptr_PhysicalStorageBufferEXT_blockType %22 Aligned 8
-%24 = OpAccessChain %_ptr_PhysicalStorageBufferEXT_int %23 %int_0
+%20 = OpAccessChain %_ptr_StorageBuffer__ptr_PhysicalStorageBuffer_blockType %r %int_0
+%21 = OpLoad %_ptr_PhysicalStorageBuffer_blockType %20
+%22 = OpAccessChain %_ptr_PhysicalStorageBuffer__ptr_PhysicalStorageBuffer_blockType %21 %int_1
+%23 = OpLoad %_ptr_PhysicalStorageBuffer_blockType %22 Aligned 8
+%24 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %23 %int_0
 OpStore %24 %int_531 Aligned 16
 OpStore %24 %int_531 Aligned 16
 OpReturn
 OpReturn
 OpFunctionEnd
 OpFunctionEnd

+ 3 - 3
3rdparty/spirv-tools/test/opt/ccp_test.cpp

@@ -570,10 +570,10 @@ TEST_F(CCPTest, SkipSpecConstantInstrucitons) {
          %10 = OpSpecConstantFalse %bool
          %10 = OpSpecConstantFalse %bool
        %main = OpFunction %void None %4
        %main = OpFunction %void None %4
          %11 = OpLabel
          %11 = OpLabel
-         %12 = OpBranchConditional %10 %l1 %l2
-         %l1 = OpLabel
+               OpBranchConditional %10 %L1 %L2
+         %L1 = OpLabel
                OpReturn
                OpReturn
-         %l2 = OpLabel
+         %L2 = OpLabel
                OpReturn
                OpReturn
                OpFunctionEnd
                OpFunctionEnd
   )";
   )";

+ 22 - 0
3rdparty/spirv-tools/test/opt/constant_manager_test.cpp

@@ -82,6 +82,28 @@ TEST_F(ConstantManagerTest, GetDefiningInstruction2) {
   EXPECT_EQ(const_inst_2->result_id(), 4);
   EXPECT_EQ(const_inst_2->result_id(), 4);
 }
 }
 
 
+TEST_F(ConstantManagerTest, GetDefiningInstructionIdOverflow) {
+  const std::string text = R"(
+%1 = OpTypeInt 32 0
+%3 = OpConstant %1 1
+%4 = OpConstant %1 2
+  )";
+
+  std::unique_ptr<IRContext> context =
+      BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text,
+                  SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  ASSERT_NE(context, nullptr);
+
+  // Set the id bound to the max, so the new constant cannot be generated.
+  context->module()->SetIdBound(context->max_id_bound());
+
+  Type* int_type = context->get_type_mgr()->GetType(1);
+  IntConstant int_constant(int_type->AsInteger(), {3});
+  Instruction* inst =
+      context->get_constant_mgr()->GetDefiningInstruction(&int_constant, 1);
+  EXPECT_EQ(inst, nullptr);
+}
+
 }  // namespace
 }  // namespace
 }  // namespace analysis
 }  // namespace analysis
 }  // namespace opt
 }  // namespace opt

+ 1 - 1
3rdparty/spirv-tools/test/opt/copy_prop_array_test.cpp

@@ -1157,7 +1157,7 @@ OpDecorate %MyCBuffer Binding 0
 OpStore %23 %35
 OpStore %23 %35
 %36 = OpAccessChain %_ptr_Function_v4float %23 %24
 %36 = OpAccessChain %_ptr_Function_v4float %23 %24
 %37 = OpLoad %v4float %36
 %37 = OpLoad %v4float %36
-%39 = OpStore %36 %v4const
+      OpStore %36 %v4const
 OpStore %out_var_SV_Target %37
 OpStore %out_var_SV_Target %37
 OpReturn
 OpReturn
 OpFunctionEnd
 OpFunctionEnd

+ 4 - 4
3rdparty/spirv-tools/test/opt/decompose_initialized_variables_test.cpp

@@ -24,9 +24,9 @@ namespace {
 using DecomposeInitializedVariablesTest = PassTest<::testing::Test>;
 using DecomposeInitializedVariablesTest = PassTest<::testing::Test>;
 
 
 std::string single_entry_header = R"(OpCapability Shader
 std::string single_entry_header = R"(OpCapability Shader
-OpCapability VulkanMemoryModelKHR
+OpCapability VulkanMemoryModel
 OpExtension "SPV_KHR_vulkan_memory_model"
 OpExtension "SPV_KHR_vulkan_memory_model"
-OpMemoryModel Logical VulkanKHR
+OpMemoryModel Logical Vulkan
 OpEntryPoint Vertex %1 "shader"
 OpEntryPoint Vertex %1 "shader"
 %uint = OpTypeInt 32 0
 %uint = OpTypeInt 32 0
 %uint_1 = OpConstant %uint 1
 %uint_1 = OpConstant %uint 1
@@ -126,9 +126,9 @@ TEST_F(DecomposeInitializedVariablesTest, OutputUnchanged) {
 }
 }
 
 
 std::string multiple_entry_header = R"(OpCapability Shader
 std::string multiple_entry_header = R"(OpCapability Shader
-OpCapability VulkanMemoryModelKHR
+OpCapability VulkanMemoryModel
 OpExtension "SPV_KHR_vulkan_memory_model"
 OpExtension "SPV_KHR_vulkan_memory_model"
-OpMemoryModel Logical VulkanKHR
+OpMemoryModel Logical Vulkan
 OpEntryPoint Vertex %1 "vertex"
 OpEntryPoint Vertex %1 "vertex"
 OpEntryPoint Fragment %2 "fragment"
 OpEntryPoint Fragment %2 "fragment"
 %uint = OpTypeInt 32 0
 %uint = OpTypeInt 32 0

+ 14 - 14
3rdparty/spirv-tools/test/opt/generate_webgpu_initializers_test.cpp

@@ -46,9 +46,9 @@ std::string GetGlobalVariableTestString(std::string ptr_str,
   std::vector<const char*> result = {
   std::vector<const char*> result = {
       // clang-format off
       // clang-format off
                "OpCapability Shader",
                "OpCapability Shader",
-               "OpCapability VulkanMemoryModelKHR",
+               "OpCapability VulkanMemoryModel",
                "OpExtension \"SPV_KHR_vulkan_memory_model\"",
                "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-               "OpMemoryModel Logical VulkanKHR",
+               "OpMemoryModel Logical Vulkan",
                "OpEntryPoint Vertex %1 \"shader\"",
                "OpEntryPoint Vertex %1 \"shader\"",
        "%uint = OpTypeInt 32 0",
        "%uint = OpTypeInt 32 0",
                 ptr_str.c_str()};
                 ptr_str.c_str()};
@@ -132,9 +132,9 @@ std::string GetLocalVariableTestString(std::string ptr_str, std::string var_str,
   std::vector<const char*> result = {
   std::vector<const char*> result = {
       // clang-format off
       // clang-format off
                "OpCapability Shader",
                "OpCapability Shader",
-               "OpCapability VulkanMemoryModelKHR",
+               "OpCapability VulkanMemoryModel",
                "OpExtension \"SPV_KHR_vulkan_memory_model\"",
                "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-               "OpMemoryModel Logical VulkanKHR",
+               "OpMemoryModel Logical Vulkan",
                "OpEntryPoint Vertex %1 \"shader\"",
                "OpEntryPoint Vertex %1 \"shader\"",
        "%uint = OpTypeInt 32 0",
        "%uint = OpTypeInt 32 0",
                 ptr_str.c_str(),
                 ptr_str.c_str(),
@@ -206,9 +206,9 @@ TEST_F(GenerateWebGPUInitializersTest, AlreadyInitializedUnchanged) {
   std::vector<const char*> spirv = {
   std::vector<const char*> spirv = {
       // clang-format off
       // clang-format off
                        "OpCapability Shader",
                        "OpCapability Shader",
-                       "OpCapability VulkanMemoryModelKHR",
+                       "OpCapability VulkanMemoryModel",
                        "OpExtension \"SPV_KHR_vulkan_memory_model\"",
                        "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-                       "OpMemoryModel Logical VulkanKHR",
+                       "OpMemoryModel Logical Vulkan",
                        "OpEntryPoint Vertex %1 \"shader\"",
                        "OpEntryPoint Vertex %1 \"shader\"",
                "%uint = OpTypeInt 32 0",
                "%uint = OpTypeInt 32 0",
   "%_ptr_Private_uint = OpTypePointer Private %uint",
   "%_ptr_Private_uint = OpTypePointer Private %uint",
@@ -232,9 +232,9 @@ TEST_F(GenerateWebGPUInitializersTest, AmbigiousArrays) {
   std::vector<const char*> input_spirv = {
   std::vector<const char*> input_spirv = {
       // clang-format off
       // clang-format off
                                    "OpCapability Shader",
                                    "OpCapability Shader",
-                                   "OpCapability VulkanMemoryModelKHR",
+                                   "OpCapability VulkanMemoryModel",
                                    "OpExtension \"SPV_KHR_vulkan_memory_model\"",
                                    "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-                                   "OpMemoryModel Logical VulkanKHR",
+                                   "OpMemoryModel Logical Vulkan",
                                    "OpEntryPoint Vertex %1 \"shader\"",
                                    "OpEntryPoint Vertex %1 \"shader\"",
                            "%uint = OpTypeInt 32 0",
                            "%uint = OpTypeInt 32 0",
                          "%uint_2 = OpConstant %uint 2",
                          "%uint_2 = OpConstant %uint 2",
@@ -258,9 +258,9 @@ TEST_F(GenerateWebGPUInitializersTest, AmbigiousArrays) {
   std::vector<const char*> expected_spirv = {
   std::vector<const char*> expected_spirv = {
       // clang-format off
       // clang-format off
                                    "OpCapability Shader",
                                    "OpCapability Shader",
-                                   "OpCapability VulkanMemoryModelKHR",
+                                   "OpCapability VulkanMemoryModel",
                                    "OpExtension \"SPV_KHR_vulkan_memory_model\"",
                                    "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-                                   "OpMemoryModel Logical VulkanKHR",
+                                   "OpMemoryModel Logical Vulkan",
                                    "OpEntryPoint Vertex %1 \"shader\"",
                                    "OpEntryPoint Vertex %1 \"shader\"",
                            "%uint = OpTypeInt 32 0",
                            "%uint = OpTypeInt 32 0",
                          "%uint_2 = OpConstant %uint 2",
                          "%uint_2 = OpConstant %uint 2",
@@ -290,9 +290,9 @@ TEST_F(GenerateWebGPUInitializersTest, AmbigiousStructs) {
   std::vector<const char*> input_spirv = {
   std::vector<const char*> input_spirv = {
       // clang-format off
       // clang-format off
                           "OpCapability Shader",
                           "OpCapability Shader",
-                          "OpCapability VulkanMemoryModelKHR",
+                          "OpCapability VulkanMemoryModel",
                           "OpExtension \"SPV_KHR_vulkan_memory_model\"",
                           "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-                          "OpMemoryModel Logical VulkanKHR",
+                          "OpMemoryModel Logical Vulkan",
                           "OpEntryPoint Vertex %1 \"shader\"",
                           "OpEntryPoint Vertex %1 \"shader\"",
                   "%uint = OpTypeInt 32 0",
                   "%uint = OpTypeInt 32 0",
              "%_struct_3 = OpTypeStruct %uint",
              "%_struct_3 = OpTypeStruct %uint",
@@ -315,9 +315,9 @@ TEST_F(GenerateWebGPUInitializersTest, AmbigiousStructs) {
   std::vector<const char*> expected_spirv = {
   std::vector<const char*> expected_spirv = {
       // clang-format off
       // clang-format off
                           "OpCapability Shader",
                           "OpCapability Shader",
-                          "OpCapability VulkanMemoryModelKHR",
+                          "OpCapability VulkanMemoryModel",
                           "OpExtension \"SPV_KHR_vulkan_memory_model\"",
                           "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-                          "OpMemoryModel Logical VulkanKHR",
+                          "OpMemoryModel Logical Vulkan",
                           "OpEntryPoint Vertex %1 \"shader\"",
                           "OpEntryPoint Vertex %1 \"shader\"",
                   "%uint = OpTypeInt 32 0",
                   "%uint = OpTypeInt 32 0",
              "%_struct_3 = OpTypeStruct %uint",
              "%_struct_3 = OpTypeStruct %uint",

+ 1 - 1
3rdparty/spirv-tools/test/opt/graphics_robust_access_test.cpp

@@ -90,7 +90,7 @@ OpMemoryModel Physical64 OpenCL
 TEST_F(GraphicsRobustAccessTest,
 TEST_F(GraphicsRobustAccessTest,
        FailCantProcessPhysicalStorageBuffer64EXTAddressingModel) {
        FailCantProcessPhysicalStorageBuffer64EXTAddressingModel) {
   const std::string text = R"(
   const std::string text = R"(
-; CHECK: Addressing model must be Logical.  Found OpMemoryModel PhysicalStorageBuffer64EXT GLSL450
+; CHECK: Addressing model must be Logical.  Found OpMemoryModel PhysicalStorageBuffer64 GLSL450
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel PhysicalStorageBuffer64EXT GLSL450
 OpMemoryModel PhysicalStorageBuffer64EXT GLSL450
 )";
 )";

+ 40 - 176
3rdparty/spirv-tools/test/opt/inline_test.cpp

@@ -2792,182 +2792,6 @@ TEST_F(InlineTest, SetParent) {
   }
   }
 }
 }
 
 
-TEST_F(InlineTest, OpKill) {
-  const std::string text = R"(
-; CHECK: OpFunction
-; CHECK-NEXT: OpLabel
-; CHECK-NEXT: OpKill
-; CHECK-NEXT: OpLabel
-; CHECK-NEXT: OpReturn
-; CHECK-NEXT: OpFunctionEnd
-OpCapability Shader
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main"
-OpExecutionMode %main OriginUpperLeft
-%void = OpTypeVoid
-%voidfuncty = OpTypeFunction %void
-%main = OpFunction %void None %voidfuncty
-%1 = OpLabel
-%2 = OpFunctionCall %void %func
-OpReturn
-OpFunctionEnd
-%func = OpFunction %void None %voidfuncty
-%3 = OpLabel
-OpKill
-OpFunctionEnd
-)";
-
-  SinglePassRunAndMatch<InlineExhaustivePass>(text, true);
-}
-
-TEST_F(InlineTest, OpKillWithTrailingInstructions) {
-  const std::string text = R"(
-; CHECK: OpFunction
-; CHECK-NEXT: OpLabel
-; CHECK-NEXT: [[var:%\w+]] = OpVariable
-; CHECK-NEXT: OpKill
-; CHECK-NEXT: OpLabel
-; CHECK-NEXT: OpStore [[var]]
-; CHECK-NEXT: OpReturn
-; CHECK-NEXT: OpFunctionEnd
-OpCapability Shader
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main"
-OpExecutionMode %main OriginUpperLeft
-%void = OpTypeVoid
-%bool = OpTypeBool
-%true = OpConstantTrue %bool
-%bool_func_ptr = OpTypePointer Function %bool
-%voidfuncty = OpTypeFunction %void
-%main = OpFunction %void None %voidfuncty
-%1 = OpLabel
-%2 = OpVariable %bool_func_ptr Function
-%3 = OpFunctionCall %void %func
-OpStore %2 %true
-OpReturn
-OpFunctionEnd
-%func = OpFunction %void None %voidfuncty
-%4 = OpLabel
-OpKill
-OpFunctionEnd
-)";
-
-  SinglePassRunAndMatch<InlineExhaustivePass>(text, true);
-}
-
-TEST_F(InlineTest, OpKillInIf) {
-  const std::string text = R"(
-; CHECK: OpFunction
-; CHECK: OpLabel
-; CHECK: [[var:%\w+]] = OpVariable
-; CHECK-NEXT: [[ld:%\w+]] = OpLoad {{%\w+}} [[var]]
-; CHECK-NEXT: OpBranch [[label:%\w+]]
-; CHECK-NEXT: [[label]] = OpLabel
-; CHECK-NEXT: OpLoopMerge [[loop_merge:%\w+]] [[continue:%\w+]] None
-; CHECK-NEXT: OpBranch [[label:%\w+]]
-; CHECK-NEXT: [[label]] = OpLabel
-; CHECK-NEXT: OpSelectionMerge [[sel_merge:%\w+]] None
-; CHECK-NEXT: OpBranchConditional {{%\w+}} [[kill_label:%\w+]] [[label:%\w+]]
-; CHECK-NEXT: [[kill_label]] = OpLabel
-; CHECK-NEXT: OpKill
-; CHECK-NEXT: [[label]] = OpLabel
-; CHECK-NEXT: OpBranch [[loop_merge]]
-; CHECK-NEXT: [[sel_merge]] = OpLabel
-; CHECK-NEXT: OpBranch [[loop_merge]]
-; CHECK-NEXT: [[continue]] = OpLabel
-; CHECK-NEXT: OpBranchConditional
-; CHECK-NEXT: [[loop_merge]] = OpLabel
-; CHECK-NEXT: OpStore [[var]] [[ld]]
-; CHECK-NEXT: OpReturn
-; CHECK-NEXT: OpFunctionEnd
-OpCapability Shader
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main"
-OpExecutionMode %main OriginUpperLeft
-%void = OpTypeVoid
-%bool = OpTypeBool
-%true = OpConstantTrue %bool
-%bool_func_ptr = OpTypePointer Function %bool
-%voidfuncty = OpTypeFunction %void
-%main = OpFunction %void None %voidfuncty
-%1 = OpLabel
-%2 = OpVariable %bool_func_ptr Function
-%3 = OpLoad %bool %2
-%4 = OpFunctionCall %void %func
-OpStore %2 %3
-OpReturn
-OpFunctionEnd
-%func = OpFunction %void None %voidfuncty
-%5 = OpLabel
-OpSelectionMerge %6 None
-OpBranchConditional %true %7 %8
-%7 = OpLabel
-OpKill
-%8 = OpLabel
-OpReturn
-%6 = OpLabel
-OpReturn
-OpFunctionEnd
-)";
-
-  SinglePassRunAndMatch<InlineExhaustivePass>(text, true);
-}
-
-TEST_F(InlineTest, OpKillInLoop) {
-  const std::string text = R"(
-; CHECK: OpFunction
-; CHECK: OpLabel
-; CHECK: [[var:%\w+]] = OpVariable
-; CHECK-NEXT: [[ld:%\w+]] = OpLoad {{%\w+}} [[var]]
-; CHECK-NEXT: OpBranch [[loop:%\w+]]
-; CHECK-NEXT: [[loop]] = OpLabel
-; CHECK-NEXT: OpLoopMerge [[loop_merge:%\w+]] [[continue:%\w+]] None
-; CHECK-NEXT: OpBranch [[label:%\w+]]
-; CHECK-NEXT: [[label]] = OpLabel
-; CHECK-NEXT: OpKill
-; CHECK-NEXT: [[loop_merge]] = OpLabel
-; CHECK-NEXT: OpBranch [[label:%\w+]]
-; CHECK-NEXT: [[continue]] = OpLabel
-; CHECK-NEXT: OpBranch [[loop]]
-; CHECK-NEXT: [[label]] = OpLabel
-; CHECK-NEXT: OpStore [[var]] [[ld]]
-; CHECK-NEXT: OpReturn
-; CHECK-NEXT: OpFunctionEnd
-OpCapability Shader
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main"
-OpExecutionMode %main OriginUpperLeft
-%void = OpTypeVoid
-%bool = OpTypeBool
-%true = OpConstantTrue %bool
-%voidfuncty = OpTypeFunction %void
-%bool_func_ptr = OpTypePointer Function %bool
-%main = OpFunction %void None %voidfuncty
-%1 = OpLabel
-%2 = OpVariable %bool_func_ptr Function
-%3 = OpLoad %bool %2
-%4 = OpFunctionCall %void %func
-OpStore %2 %3
-OpReturn
-OpFunctionEnd
-%func = OpFunction %void None %voidfuncty
-%5 = OpLabel
-OpBranch %10
-%10 = OpLabel
-OpLoopMerge %6 %7 None
-OpBranch %8
-%8 = OpLabel
-OpKill
-%6 = OpLabel
-OpReturn
-%7 = OpLabel
-OpBranch %10
-OpFunctionEnd
-)";
-
-  SinglePassRunAndMatch<InlineExhaustivePass>(text, true);
-}
-
 TEST_F(InlineTest, OpVariableWithInit) {
 TEST_F(InlineTest, OpVariableWithInit) {
   // Check that there is a store that corresponds to the initializer.  This
   // Check that there is a store that corresponds to the initializer.  This
   // test makes sure that is a store to the variable in the loop and before any
   // test makes sure that is a store to the variable in the loop and before any
@@ -3112,6 +2936,46 @@ OpFunctionEnd
   SinglePassRunAndCheck<InlineExhaustivePass>(test, test, false, true);
   SinglePassRunAndCheck<InlineExhaustivePass>(test, test, false, true);
 }
 }
 
 
+TEST_F(InlineTest, DontInlineFuncWithOpKill) {
+  const std::string test =
+      R"(OpCapability Shader
+%1 = OpExtInstImport "GLSL.std.450"
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %main "main"
+OpExecutionMode %main OriginUpperLeft
+OpSource GLSL 330
+OpName %main "main"
+OpName %kill_ "kill("
+%void = OpTypeVoid
+%3 = OpTypeFunction %void
+%bool = OpTypeBool
+%true = OpConstantTrue %bool
+%main = OpFunction %void None %3
+%5 = OpLabel
+OpBranch %9
+%9 = OpLabel
+OpLoopMerge %11 %12 None
+OpBranch %13
+%13 = OpLabel
+OpBranchConditional %true %10 %11
+%10 = OpLabel
+OpBranch %12
+%12 = OpLabel
+%16 = OpFunctionCall %void %kill_
+OpBranch %9
+%11 = OpLabel
+OpReturn
+OpFunctionEnd
+%kill_ = OpFunction %void None %3
+%7 = OpLabel
+OpKill
+OpFunctionEnd
+)";
+
+  SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  SinglePassRunAndCheck<InlineExhaustivePass>(test, test, false, true);
+}
+
 // TODO(greg-lunarg): Add tests to verify handling of these cases:
 // TODO(greg-lunarg): Add tests to verify handling of these cases:
 //
 //
 //    Empty modules
 //    Empty modules

+ 146 - 146
3rdparty/spirv-tools/test/opt/inst_bindless_check_test.cpp

@@ -1915,7 +1915,7 @@ TEST_F(InstBindlessTest, RuntimeArray) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability RuntimeDescriptorArrayEXT
+OpCapability RuntimeDescriptorArray
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -1968,7 +1968,7 @@ OpDecorate %_entryPointOutput_vColor Location 0
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability RuntimeDescriptorArrayEXT
+OpCapability RuntimeDescriptorArray
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -2647,9 +2647,9 @@ TEST_F(InstBindlessTest, InstBoundsAndInitLoadUnsizedUBOArray) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -2670,9 +2670,9 @@ OpDecorate %uniformBuffer DescriptorSet 0
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %16 NonUniformEXT
-OpDecorate %20 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %16 NonUniform
+OpDecorate %20 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -2691,9 +2691,9 @@ OpDecorate %20 NonUniformEXT
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -2715,22 +2715,22 @@ OpDecorate %uniformBuffer DescriptorSet 0
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
-OpDecorate %102 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
+OpDecorate %102 NonUniform
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_31 Block
 OpDecorate %_struct_31 Block
 OpMemberDecorate %_struct_31 0 Offset 0
 OpMemberDecorate %_struct_31 0 Offset 0
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 Binding 1
 OpDecorate %33 Binding 1
-OpDecorate %130 NonUniformEXT
+OpDecorate %130 NonUniform
 OpDecorate %_struct_55 Block
 OpDecorate %_struct_55 Block
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 1 Offset 4
 OpMemberDecorate %_struct_55 1 Offset 4
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 Binding 0
 OpDecorate %57 Binding 0
 OpDecorate %gl_FragCoord BuiltIn FragCoord
 OpDecorate %gl_FragCoord BuiltIn FragCoord
-OpDecorate %127 NonUniformEXT
+OpDecorate %127 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %10 = OpTypeFunction %void
 %10 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -2928,9 +2928,9 @@ TEST_F(InstBindlessTest, InstBoundsAndInitLoadUnsizedSSBOArrayDeprecated) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -2951,9 +2951,9 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 3
 OpDecorate %storageBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %16 NonUniformEXT
-OpDecorate %20 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %16 NonUniform
+OpDecorate %20 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -2972,9 +2972,9 @@ OpDecorate %20 NonUniformEXT
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -2996,22 +2996,22 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 3
 OpDecorate %storageBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
-OpDecorate %102 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
+OpDecorate %102 NonUniform
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_31 Block
 OpDecorate %_struct_31 Block
 OpMemberDecorate %_struct_31 0 Offset 0
 OpMemberDecorate %_struct_31 0 Offset 0
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 Binding 1
 OpDecorate %33 Binding 1
-OpDecorate %130 NonUniformEXT
+OpDecorate %130 NonUniform
 OpDecorate %_struct_55 Block
 OpDecorate %_struct_55 Block
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 1 Offset 4
 OpMemberDecorate %_struct_55 1 Offset 4
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 Binding 0
 OpDecorate %57 Binding 0
 OpDecorate %gl_FragCoord BuiltIn FragCoord
 OpDecorate %gl_FragCoord BuiltIn FragCoord
-OpDecorate %127 NonUniformEXT
+OpDecorate %127 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %10 = OpTypeFunction %void
 %10 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -3198,9 +3198,9 @@ TEST_F(InstBindlessTest, InstBoundsAndInitLoadUnsizedSSBOArray) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -3221,9 +3221,9 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 3
 OpDecorate %storageBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %16 NonUniformEXT
-OpDecorate %20 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %16 NonUniform
+OpDecorate %20 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -3242,9 +3242,9 @@ OpDecorate %20 NonUniformEXT
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -3266,22 +3266,22 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 3
 OpDecorate %storageBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
-OpDecorate %102 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
+OpDecorate %102 NonUniform
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_31 Block
 OpDecorate %_struct_31 Block
 OpMemberDecorate %_struct_31 0 Offset 0
 OpMemberDecorate %_struct_31 0 Offset 0
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 Binding 1
 OpDecorate %33 Binding 1
-OpDecorate %130 NonUniformEXT
+OpDecorate %130 NonUniform
 OpDecorate %_struct_55 Block
 OpDecorate %_struct_55 Block
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 1 Offset 4
 OpMemberDecorate %_struct_55 1 Offset 4
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 Binding 0
 OpDecorate %57 Binding 0
 OpDecorate %gl_FragCoord BuiltIn FragCoord
 OpDecorate %gl_FragCoord BuiltIn FragCoord
-OpDecorate %127 NonUniformEXT
+OpDecorate %127 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %10 = OpTypeFunction %void
 %10 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -3704,9 +3704,9 @@ TEST_F(InstBindlessTest, InstBoundsInitStoreUnsizedSSBOArray) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -3726,8 +3726,8 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 4
 OpDecorate %storageBuffer Binding 4
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %14 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %14 NonUniform
 OpDecorate %b Location 1
 OpDecorate %b Location 1
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
@@ -3747,9 +3747,9 @@ OpDecorate %b Location 1
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -3770,8 +3770,8 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 4
 OpDecorate %storageBuffer Binding 4
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
 OpDecorate %b Location 1
 OpDecorate %b Location 1
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_31 Block
 OpDecorate %_struct_31 Block
@@ -3978,8 +3978,8 @@ TEST_F(InstBindlessTest, InstBoundsInitLoadSizedUBOArray) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -4000,9 +4000,9 @@ OpDecorate %uniformBuffer DescriptorSet 0
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %18 NonUniformEXT
-OpDecorate %22 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %18 NonUniform
+OpDecorate %22 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -4023,8 +4023,8 @@ OpDecorate %22 NonUniformEXT
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -4046,10 +4046,10 @@ OpDecorate %uniformBuffer DescriptorSet 0
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
-OpDecorate %89 NonUniformEXT
-OpDecorate %120 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
+OpDecorate %89 NonUniform
+OpDecorate %120 NonUniform
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_39 Block
 OpDecorate %_struct_39 Block
 OpMemberDecorate %_struct_39 0 Offset 0
 OpMemberDecorate %_struct_39 0 Offset 0
@@ -4061,7 +4061,7 @@ OpDecorate %_struct_98 Block
 OpMemberDecorate %_struct_98 0 Offset 0
 OpMemberDecorate %_struct_98 0 Offset 0
 OpDecorate %100 DescriptorSet 7
 OpDecorate %100 DescriptorSet 7
 OpDecorate %100 Binding 1
 OpDecorate %100 Binding 1
-OpDecorate %117 NonUniformEXT
+OpDecorate %117 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %10 = OpTypeFunction %void
 %10 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -6313,7 +6313,7 @@ TEST_F(InstBindlessTest, RuntimeArrayV2) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability RuntimeDescriptorArrayEXT
+OpCapability RuntimeDescriptorArray
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -6366,7 +6366,7 @@ OpDecorate %_entryPointOutput_vColor Location 0
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability RuntimeDescriptorArrayEXT
+OpCapability RuntimeDescriptorArray
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -6970,9 +6970,9 @@ TEST_F(InstBindlessTest, InstBoundsAndInitLoadUnsizedUBOArrayV2) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -6993,9 +6993,9 @@ OpDecorate %uniformBuffer DescriptorSet 0
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %16 NonUniformEXT
-OpDecorate %20 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %16 NonUniform
+OpDecorate %20 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -7014,9 +7014,9 @@ OpDecorate %20 NonUniformEXT
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -7038,22 +7038,22 @@ OpDecorate %uniformBuffer DescriptorSet 0
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
-OpDecorate %102 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
+OpDecorate %102 NonUniform
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_31 Block
 OpDecorate %_struct_31 Block
 OpMemberDecorate %_struct_31 0 Offset 0
 OpMemberDecorate %_struct_31 0 Offset 0
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 Binding 1
 OpDecorate %33 Binding 1
-OpDecorate %130 NonUniformEXT
+OpDecorate %130 NonUniform
 OpDecorate %_struct_55 Block
 OpDecorate %_struct_55 Block
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 1 Offset 4
 OpMemberDecorate %_struct_55 1 Offset 4
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 Binding 0
 OpDecorate %57 Binding 0
 OpDecorate %gl_FragCoord BuiltIn FragCoord
 OpDecorate %gl_FragCoord BuiltIn FragCoord
-OpDecorate %127 NonUniformEXT
+OpDecorate %127 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %10 = OpTypeFunction %void
 %10 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -7251,9 +7251,9 @@ TEST_F(InstBindlessTest, InstBoundsAndInitLoadUnsizedSSBOArrayDeprecatedV2) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -7274,9 +7274,9 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 3
 OpDecorate %storageBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %16 NonUniformEXT
-OpDecorate %20 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %16 NonUniform
+OpDecorate %20 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -7295,9 +7295,9 @@ OpDecorate %20 NonUniformEXT
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -7319,22 +7319,22 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 3
 OpDecorate %storageBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
-OpDecorate %102 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
+OpDecorate %102 NonUniform
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_31 Block
 OpDecorate %_struct_31 Block
 OpMemberDecorate %_struct_31 0 Offset 0
 OpMemberDecorate %_struct_31 0 Offset 0
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 Binding 1
 OpDecorate %33 Binding 1
-OpDecorate %130 NonUniformEXT
+OpDecorate %130 NonUniform
 OpDecorate %_struct_55 Block
 OpDecorate %_struct_55 Block
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 1 Offset 4
 OpMemberDecorate %_struct_55 1 Offset 4
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 Binding 0
 OpDecorate %57 Binding 0
 OpDecorate %gl_FragCoord BuiltIn FragCoord
 OpDecorate %gl_FragCoord BuiltIn FragCoord
-OpDecorate %127 NonUniformEXT
+OpDecorate %127 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %10 = OpTypeFunction %void
 %10 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -7521,9 +7521,9 @@ TEST_F(InstBindlessTest, InstBoundsAndInitLoadUnsizedSSBOArrayV2) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -7544,9 +7544,9 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 3
 OpDecorate %storageBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %16 NonUniformEXT
-OpDecorate %20 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %16 NonUniform
+OpDecorate %20 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -7565,9 +7565,9 @@ OpDecorate %20 NonUniformEXT
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -7589,22 +7589,22 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 3
 OpDecorate %storageBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
-OpDecorate %102 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
+OpDecorate %102 NonUniform
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_31 Block
 OpDecorate %_struct_31 Block
 OpMemberDecorate %_struct_31 0 Offset 0
 OpMemberDecorate %_struct_31 0 Offset 0
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 DescriptorSet 7
 OpDecorate %33 Binding 1
 OpDecorate %33 Binding 1
-OpDecorate %130 NonUniformEXT
+OpDecorate %130 NonUniform
 OpDecorate %_struct_55 Block
 OpDecorate %_struct_55 Block
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 0 Offset 0
 OpMemberDecorate %_struct_55 1 Offset 4
 OpMemberDecorate %_struct_55 1 Offset 4
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 DescriptorSet 7
 OpDecorate %57 Binding 0
 OpDecorate %57 Binding 0
 OpDecorate %gl_FragCoord BuiltIn FragCoord
 OpDecorate %gl_FragCoord BuiltIn FragCoord
-OpDecorate %127 NonUniformEXT
+OpDecorate %127 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %10 = OpTypeFunction %void
 %10 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -8027,9 +8027,9 @@ TEST_F(InstBindlessTest, InstBoundsInitStoreUnsizedSSBOArrayV2) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -8049,8 +8049,8 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 4
 OpDecorate %storageBuffer Binding 4
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %14 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %14 NonUniform
 OpDecorate %b Location 1
 OpDecorate %b Location 1
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
@@ -8070,9 +8070,9 @@ OpDecorate %b Location 1
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability RuntimeDescriptorArrayEXT
-OpCapability StorageBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability RuntimeDescriptorArray
+OpCapability StorageBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -8093,8 +8093,8 @@ OpDecorate %storageBuffer DescriptorSet 0
 OpDecorate %storageBuffer Binding 4
 OpDecorate %storageBuffer Binding 4
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
 OpDecorate %b Location 1
 OpDecorate %b Location 1
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_31 Block
 OpDecorate %_struct_31 Block
@@ -8301,8 +8301,8 @@ TEST_F(InstBindlessTest, InstBoundsInitLoadSizedUBOArrayV2) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -8323,9 +8323,9 @@ OpDecorate %uniformBuffer DescriptorSet 0
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %18 NonUniformEXT
-OpDecorate %22 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %18 NonUniform
+OpDecorate %22 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -8346,8 +8346,8 @@ OpDecorate %22 NonUniformEXT
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
-OpCapability UniformBufferArrayNonUniformIndexingEXT
+OpCapability ShaderNonUniform
+OpCapability UniformBufferArrayNonUniformIndexing
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -8369,10 +8369,10 @@ OpDecorate %uniformBuffer DescriptorSet 0
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %uniformBuffer Binding 3
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Flat
 OpDecorate %nu_ii Location 0
 OpDecorate %nu_ii Location 0
-OpDecorate %nu_ii NonUniformEXT
-OpDecorate %7 NonUniformEXT
-OpDecorate %89 NonUniformEXT
-OpDecorate %120 NonUniformEXT
+OpDecorate %nu_ii NonUniform
+OpDecorate %7 NonUniform
+OpDecorate %89 NonUniform
+OpDecorate %120 NonUniform
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_runtimearr_uint ArrayStride 4
 OpDecorate %_struct_39 Block
 OpDecorate %_struct_39 Block
 OpMemberDecorate %_struct_39 0 Offset 0
 OpMemberDecorate %_struct_39 0 Offset 0
@@ -8384,7 +8384,7 @@ OpDecorate %_struct_98 Block
 OpMemberDecorate %_struct_98 0 Offset 0
 OpMemberDecorate %_struct_98 0 Offset 0
 OpDecorate %100 DescriptorSet 7
 OpDecorate %100 DescriptorSet 7
 OpDecorate %100 Binding 1
 OpDecorate %100 Binding 1
-OpDecorate %117 NonUniformEXT
+OpDecorate %117 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %10 = OpTypeFunction %void
 %10 = OpTypeFunction %void
 %float = OpTypeFloat 32
 %float = OpTypeFloat 32
@@ -8575,7 +8575,7 @@ TEST_F(InstBindlessTest,
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability RuntimeDescriptorArrayEXT
+OpCapability RuntimeDescriptorArray
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -8622,7 +8622,7 @@ OpDecorate %images NonWritable
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability RuntimeDescriptorArrayEXT
+OpCapability RuntimeDescriptorArray
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
@@ -8895,7 +8895,7 @@ TEST_F(InstBindlessTest,
   // }
   // }
 
 
   const std::string defs_before =
   const std::string defs_before =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -8923,7 +8923,7 @@ OpDecorate %images NonWritable
 )";
 )";
 
 
   const std::string defs_after =
   const std::string defs_after =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -9219,7 +9219,7 @@ TEST_F(InstBindlessTest,
   // }
   // }
 
 
   const std::string defs_before =
   const std::string defs_before =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -9247,7 +9247,7 @@ OpDecorate %images NonWritable
 )";
 )";
 
 
   const std::string defs_after =
   const std::string defs_after =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -9543,7 +9543,7 @@ TEST_F(InstBindlessTest,
   // }
   // }
 
 
   const std::string defs_before =
   const std::string defs_before =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -9571,7 +9571,7 @@ OpDecorate %images NonWritable
 )";
 )";
 
 
   const std::string defs_after =
   const std::string defs_after =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -9867,7 +9867,7 @@ TEST_F(InstBindlessTest,
   // }
   // }
 
 
   const std::string defs_before =
   const std::string defs_before =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -9895,7 +9895,7 @@ OpDecorate %images NonWritable
 )";
 )";
 
 
   const std::string defs_after =
   const std::string defs_after =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -10191,7 +10191,7 @@ TEST_F(InstBindlessTest,
   // }
   // }
 
 
   const std::string defs_before =
   const std::string defs_before =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -10219,7 +10219,7 @@ OpDecorate %images NonWritable
 )";
 )";
 
 
   const std::string defs_after =
   const std::string defs_after =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -10515,7 +10515,7 @@ TEST_F(InstBindlessTest,
   // }
   // }
 
 
   const std::string defs_before =
   const std::string defs_before =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"
@@ -10543,7 +10543,7 @@ OpDecorate %images NonWritable
 )";
 )";
 
 
   const std::string defs_after =
   const std::string defs_after =
-      R"(OpCapability RuntimeDescriptorArrayEXT
+      R"(OpCapability RuntimeDescriptorArray
 OpCapability RayTracingNV
 OpCapability RayTracingNV
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_EXT_descriptor_indexing"
 OpExtension "SPV_NV_ray_tracing"
 OpExtension "SPV_NV_ray_tracing"

+ 50 - 50
3rdparty/spirv-tools/test/opt/inst_buff_addr_check_test.cpp

@@ -51,10 +51,10 @@ TEST_F(InstBuffAddrTest, InstPhysicalStorageBufferStore) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability PhysicalStorageBufferAddressesEXT
+OpCapability PhysicalStorageBufferAddresses
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_EXT_physical_storage_buffer"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel PhysicalStorageBuffer64EXT GLSL450
+OpMemoryModel PhysicalStorageBuffer64 GLSL450
 OpEntryPoint GLCompute %main "main"
 OpEntryPoint GLCompute %main "main"
 OpExecutionMode %main LocalSize 1 1 1
 OpExecutionMode %main LocalSize 1 1 1
 OpSource GLSL 450
 OpSource GLSL 450
@@ -78,31 +78,31 @@ OpDecorate %u_info DescriptorSet 0
 OpDecorate %u_info Binding 0
 OpDecorate %u_info Binding 0
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
-OpTypeForwardPointer %_ptr_PhysicalStorageBufferEXT_bufStruct PhysicalStorageBufferEXT
+OpTypeForwardPointer %_ptr_PhysicalStorageBuffer_bufStruct PhysicalStorageBuffer
 %uint = OpTypeInt 32 0
 %uint = OpTypeInt 32 0
-%ufoo = OpTypeStruct %_ptr_PhysicalStorageBufferEXT_bufStruct %uint
+%ufoo = OpTypeStruct %_ptr_PhysicalStorageBuffer_bufStruct %uint
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1
 %uint_2 = OpConstant %uint 2
 %uint_2 = OpConstant %uint 2
 %_arr_int_uint_2 = OpTypeArray %int %uint_2
 %_arr_int_uint_2 = OpTypeArray %int %uint_2
 %bufStruct = OpTypeStruct %_arr_int_uint_2 %int
 %bufStruct = OpTypeStruct %_arr_int_uint_2 %int
-%_ptr_PhysicalStorageBufferEXT_bufStruct = OpTypePointer PhysicalStorageBufferEXT %bufStruct
+%_ptr_PhysicalStorageBuffer_bufStruct = OpTypePointer PhysicalStorageBuffer %bufStruct
 %_ptr_Uniform_ufoo = OpTypePointer Uniform %ufoo
 %_ptr_Uniform_ufoo = OpTypePointer Uniform %ufoo
 %u_info = OpVariable %_ptr_Uniform_ufoo Uniform
 %u_info = OpVariable %_ptr_Uniform_ufoo Uniform
 %int_0 = OpConstant %int 0
 %int_0 = OpConstant %int 0
-%_ptr_Uniform__ptr_PhysicalStorageBufferEXT_bufStruct = OpTypePointer Uniform %_ptr_PhysicalStorageBufferEXT_bufStruct
+%_ptr_Uniform__ptr_PhysicalStorageBuffer_bufStruct = OpTypePointer Uniform %_ptr_PhysicalStorageBuffer_bufStruct
 %int_1 = OpConstant %int 1
 %int_1 = OpConstant %int 1
 %int_3239 = OpConstant %int 3239
 %int_3239 = OpConstant %int 3239
-%_ptr_PhysicalStorageBufferEXT_int = OpTypePointer PhysicalStorageBufferEXT %int
+%_ptr_PhysicalStorageBuffer_int = OpTypePointer PhysicalStorageBuffer %int
 )";
 )";
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability PhysicalStorageBufferAddressesEXT
+OpCapability PhysicalStorageBufferAddresses
 OpCapability Int64
 OpCapability Int64
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel PhysicalStorageBuffer64EXT GLSL450
+OpMemoryModel PhysicalStorageBuffer64 GLSL450
 OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID
 OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID
 OpExecutionMode %main LocalSize 1 1 1
 OpExecutionMode %main LocalSize 1 1 1
 OpSource GLSL 450
 OpSource GLSL 450
@@ -138,21 +138,21 @@ OpDecorate %79 Binding 0
 OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
 OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
 %void = OpTypeVoid
 %void = OpTypeVoid
 %8 = OpTypeFunction %void
 %8 = OpTypeFunction %void
-OpTypeForwardPointer %_ptr_PhysicalStorageBufferEXT_bufStruct PhysicalStorageBufferEXT
+OpTypeForwardPointer %_ptr_PhysicalStorageBuffer_bufStruct PhysicalStorageBuffer
 %uint = OpTypeInt 32 0
 %uint = OpTypeInt 32 0
-%ufoo = OpTypeStruct %_ptr_PhysicalStorageBufferEXT_bufStruct %uint
+%ufoo = OpTypeStruct %_ptr_PhysicalStorageBuffer_bufStruct %uint
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1
 %uint_2 = OpConstant %uint 2
 %uint_2 = OpConstant %uint 2
 %_arr_int_uint_2 = OpTypeArray %int %uint_2
 %_arr_int_uint_2 = OpTypeArray %int %uint_2
 %bufStruct = OpTypeStruct %_arr_int_uint_2 %int
 %bufStruct = OpTypeStruct %_arr_int_uint_2 %int
-%_ptr_PhysicalStorageBufferEXT_bufStruct = OpTypePointer PhysicalStorageBufferEXT %bufStruct
+%_ptr_PhysicalStorageBuffer_bufStruct = OpTypePointer PhysicalStorageBuffer %bufStruct
 %_ptr_Uniform_ufoo = OpTypePointer Uniform %ufoo
 %_ptr_Uniform_ufoo = OpTypePointer Uniform %ufoo
 %u_info = OpVariable %_ptr_Uniform_ufoo Uniform
 %u_info = OpVariable %_ptr_Uniform_ufoo Uniform
 %int_0 = OpConstant %int 0
 %int_0 = OpConstant %int 0
-%_ptr_Uniform__ptr_PhysicalStorageBufferEXT_bufStruct = OpTypePointer Uniform %_ptr_PhysicalStorageBufferEXT_bufStruct
+%_ptr_Uniform__ptr_PhysicalStorageBuffer_bufStruct = OpTypePointer Uniform %_ptr_PhysicalStorageBuffer_bufStruct
 %int_1 = OpConstant %int 1
 %int_1 = OpConstant %int 1
 %int_3239 = OpConstant %int 3239
 %int_3239 = OpConstant %int 3239
-%_ptr_PhysicalStorageBufferEXT_int = OpTypePointer PhysicalStorageBufferEXT %int
+%_ptr_PhysicalStorageBuffer_int = OpTypePointer PhysicalStorageBuffer %int
 %ulong = OpTypeInt 64 0
 %ulong = OpTypeInt 64 0
 %uint_4 = OpConstant %uint 4
 %uint_4 = OpConstant %uint 4
 %bool = OpTypeBool
 %bool = OpTypeBool
@@ -188,9 +188,9 @@ OpTypeForwardPointer %_ptr_PhysicalStorageBufferEXT_bufStruct PhysicalStorageBuf
   const std::string func_before =
   const std::string func_before =
       R"(%main = OpFunction %void None %3
       R"(%main = OpFunction %void None %3
 %5 = OpLabel
 %5 = OpLabel
-%17 = OpAccessChain %_ptr_Uniform__ptr_PhysicalStorageBufferEXT_bufStruct %u_info %int_0
-%18 = OpLoad %_ptr_PhysicalStorageBufferEXT_bufStruct %17
-%22 = OpAccessChain %_ptr_PhysicalStorageBufferEXT_int %18 %int_1
+%17 = OpAccessChain %_ptr_Uniform__ptr_PhysicalStorageBuffer_bufStruct %u_info %int_0
+%18 = OpLoad %_ptr_PhysicalStorageBuffer_bufStruct %17
+%22 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %18 %int_1
 OpStore %22 %int_3239 Aligned 16
 OpStore %22 %int_3239 Aligned 16
 OpReturn
 OpReturn
 OpFunctionEnd
 OpFunctionEnd
@@ -199,9 +199,9 @@ OpFunctionEnd
   const std::string func_after =
   const std::string func_after =
       R"(%main = OpFunction %void None %8
       R"(%main = OpFunction %void None %8
 %19 = OpLabel
 %19 = OpLabel
-%20 = OpAccessChain %_ptr_Uniform__ptr_PhysicalStorageBufferEXT_bufStruct %u_info %int_0
-%21 = OpLoad %_ptr_PhysicalStorageBufferEXT_bufStruct %20
-%22 = OpAccessChain %_ptr_PhysicalStorageBufferEXT_int %21 %int_1
+%20 = OpAccessChain %_ptr_Uniform__ptr_PhysicalStorageBuffer_bufStruct %u_info %int_0
+%21 = OpLoad %_ptr_PhysicalStorageBuffer_bufStruct %20
+%22 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %21 %int_1
 %24 = OpConvertPtrToU %ulong %22
 %24 = OpConvertPtrToU %ulong %22
 %61 = OpFunctionCall %bool %26 %24 %uint_4
 %61 = OpFunctionCall %bool %26 %24 %uint_4
 OpSelectionMerge %62 None
 OpSelectionMerge %62 None
@@ -339,11 +339,11 @@ TEST_F(InstBuffAddrTest, InstPhysicalStorageBufferLoadAndStore) {
 
 
   const std::string defs_before =
   const std::string defs_before =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability PhysicalStorageBufferAddressesEXT
+OpCapability PhysicalStorageBufferAddresses
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel PhysicalStorageBuffer64EXT GLSL450
+OpMemoryModel PhysicalStorageBuffer64 GLSL450
 OpEntryPoint GLCompute %main "main"
 OpEntryPoint GLCompute %main "main"
 OpExecutionMode %main LocalSize 1 1 1
 OpExecutionMode %main LocalSize 1 1 1
 OpSource GLSL 450
 OpSource GLSL 450
@@ -364,29 +364,29 @@ OpDecorate %r DescriptorSet 0
 OpDecorate %r Binding 0
 OpDecorate %r Binding 0
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
-OpTypeForwardPointer %_ptr_PhysicalStorageBufferEXT_blockType PhysicalStorageBufferEXT
+OpTypeForwardPointer %_ptr_PhysicalStorageBuffer_blockType PhysicalStorageBuffer
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1
-%blockType = OpTypeStruct %int %_ptr_PhysicalStorageBufferEXT_blockType
-%_ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer PhysicalStorageBufferEXT %blockType
-%rootBlock = OpTypeStruct %_ptr_PhysicalStorageBufferEXT_blockType
+%blockType = OpTypeStruct %int %_ptr_PhysicalStorageBuffer_blockType
+%_ptr_PhysicalStorageBuffer_blockType = OpTypePointer PhysicalStorageBuffer %blockType
+%rootBlock = OpTypeStruct %_ptr_PhysicalStorageBuffer_blockType
 %_ptr_StorageBuffer_rootBlock = OpTypePointer StorageBuffer %rootBlock
 %_ptr_StorageBuffer_rootBlock = OpTypePointer StorageBuffer %rootBlock
 %r = OpVariable %_ptr_StorageBuffer_rootBlock StorageBuffer
 %r = OpVariable %_ptr_StorageBuffer_rootBlock StorageBuffer
 %int_0 = OpConstant %int 0
 %int_0 = OpConstant %int 0
-%_ptr_StorageBuffer__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer StorageBuffer %_ptr_PhysicalStorageBufferEXT_blockType
+%_ptr_StorageBuffer__ptr_PhysicalStorageBuffer_blockType = OpTypePointer StorageBuffer %_ptr_PhysicalStorageBuffer_blockType
 %int_1 = OpConstant %int 1
 %int_1 = OpConstant %int 1
-%_ptr_PhysicalStorageBufferEXT__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer PhysicalStorageBufferEXT %_ptr_PhysicalStorageBufferEXT_blockType
+%_ptr_PhysicalStorageBuffer__ptr_PhysicalStorageBuffer_blockType = OpTypePointer PhysicalStorageBuffer %_ptr_PhysicalStorageBuffer_blockType
 %int_531 = OpConstant %int 531
 %int_531 = OpConstant %int 531
-%_ptr_PhysicalStorageBufferEXT_int = OpTypePointer PhysicalStorageBufferEXT %int
+%_ptr_PhysicalStorageBuffer_int = OpTypePointer PhysicalStorageBuffer %int
 )";
 )";
 
 
   const std::string defs_after =
   const std::string defs_after =
       R"(OpCapability Shader
       R"(OpCapability Shader
-OpCapability PhysicalStorageBufferAddressesEXT
+OpCapability PhysicalStorageBufferAddresses
 OpCapability Int64
 OpCapability Int64
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_EXT_physical_storage_buffer"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel PhysicalStorageBuffer64EXT GLSL450
+OpMemoryModel PhysicalStorageBuffer64 GLSL450
 OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID
 OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID
 OpExecutionMode %main LocalSize 1 1 1
 OpExecutionMode %main LocalSize 1 1 1
 OpSource GLSL 450
 OpSource GLSL 450
@@ -419,19 +419,19 @@ OpDecorate %86 Binding 0
 OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
 OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
 %void = OpTypeVoid
 %void = OpTypeVoid
 %3 = OpTypeFunction %void
 %3 = OpTypeFunction %void
-OpTypeForwardPointer %_ptr_PhysicalStorageBufferEXT_blockType PhysicalStorageBufferEXT
+OpTypeForwardPointer %_ptr_PhysicalStorageBuffer_blockType PhysicalStorageBuffer
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1
-%blockType = OpTypeStruct %int %_ptr_PhysicalStorageBufferEXT_blockType
-%_ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer PhysicalStorageBufferEXT %blockType
-%rootBlock = OpTypeStruct %_ptr_PhysicalStorageBufferEXT_blockType
+%blockType = OpTypeStruct %int %_ptr_PhysicalStorageBuffer_blockType
+%_ptr_PhysicalStorageBuffer_blockType = OpTypePointer PhysicalStorageBuffer %blockType
+%rootBlock = OpTypeStruct %_ptr_PhysicalStorageBuffer_blockType
 %_ptr_StorageBuffer_rootBlock = OpTypePointer StorageBuffer %rootBlock
 %_ptr_StorageBuffer_rootBlock = OpTypePointer StorageBuffer %rootBlock
 %r = OpVariable %_ptr_StorageBuffer_rootBlock StorageBuffer
 %r = OpVariable %_ptr_StorageBuffer_rootBlock StorageBuffer
 %int_0 = OpConstant %int 0
 %int_0 = OpConstant %int 0
-%_ptr_StorageBuffer__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer StorageBuffer %_ptr_PhysicalStorageBufferEXT_blockType
+%_ptr_StorageBuffer__ptr_PhysicalStorageBuffer_blockType = OpTypePointer StorageBuffer %_ptr_PhysicalStorageBuffer_blockType
 %int_1 = OpConstant %int 1
 %int_1 = OpConstant %int 1
-%_ptr_PhysicalStorageBufferEXT__ptr_PhysicalStorageBufferEXT_blockType = OpTypePointer PhysicalStorageBufferEXT %_ptr_PhysicalStorageBufferEXT_blockType
+%_ptr_PhysicalStorageBuffer__ptr_PhysicalStorageBuffer_blockType = OpTypePointer PhysicalStorageBuffer %_ptr_PhysicalStorageBuffer_blockType
 %int_531 = OpConstant %int 531
 %int_531 = OpConstant %int 531
-%_ptr_PhysicalStorageBufferEXT_int = OpTypePointer PhysicalStorageBufferEXT %int
+%_ptr_PhysicalStorageBuffer_int = OpTypePointer PhysicalStorageBuffer %int
 %uint = OpTypeInt 32 0
 %uint = OpTypeInt 32 0
 %uint_2 = OpConstant %uint 2
 %uint_2 = OpConstant %uint 2
 %ulong = OpTypeInt 64 0
 %ulong = OpTypeInt 64 0
@@ -464,18 +464,18 @@ OpTypeForwardPointer %_ptr_PhysicalStorageBufferEXT_blockType PhysicalStorageBuf
 %uint_7 = OpConstant %uint 7
 %uint_7 = OpConstant %uint 7
 %uint_9 = OpConstant %uint 9
 %uint_9 = OpConstant %uint 9
 %uint_44 = OpConstant %uint 44
 %uint_44 = OpConstant %uint 44
-%132 = OpConstantNull %_ptr_PhysicalStorageBufferEXT_blockType
+%132 = OpConstantNull %_ptr_PhysicalStorageBuffer_blockType
 %uint_46 = OpConstant %uint 46
 %uint_46 = OpConstant %uint 46
 )";
 )";
 
 
   const std::string func_before =
   const std::string func_before =
       R"(%main = OpFunction %void None %3
       R"(%main = OpFunction %void None %3
 %5 = OpLabel
 %5 = OpLabel
-%16 = OpAccessChain %_ptr_StorageBuffer__ptr_PhysicalStorageBufferEXT_blockType %r %int_0
-%17 = OpLoad %_ptr_PhysicalStorageBufferEXT_blockType %16
-%21 = OpAccessChain %_ptr_PhysicalStorageBufferEXT__ptr_PhysicalStorageBufferEXT_blockType %17 %int_1
-%22 = OpLoad %_ptr_PhysicalStorageBufferEXT_blockType %21 Aligned 8
-%26 = OpAccessChain %_ptr_PhysicalStorageBufferEXT_int %22 %int_0
+%16 = OpAccessChain %_ptr_StorageBuffer__ptr_PhysicalStorageBuffer_blockType %r %int_0
+%17 = OpLoad %_ptr_PhysicalStorageBuffer_blockType %16
+%21 = OpAccessChain %_ptr_PhysicalStorageBuffer__ptr_PhysicalStorageBuffer_blockType %17 %int_1
+%22 = OpLoad %_ptr_PhysicalStorageBuffer_blockType %21 Aligned 8
+%26 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %22 %int_0
 OpStore %26 %int_531 Aligned 16
 OpStore %26 %int_531 Aligned 16
 OpReturn
 OpReturn
 OpFunctionEnd
 OpFunctionEnd
@@ -484,15 +484,15 @@ OpFunctionEnd
   const std::string func_after =
   const std::string func_after =
       R"(%main = OpFunction %void None %3
       R"(%main = OpFunction %void None %3
 %5 = OpLabel
 %5 = OpLabel
-%16 = OpAccessChain %_ptr_StorageBuffer__ptr_PhysicalStorageBufferEXT_blockType %r %int_0
-%17 = OpLoad %_ptr_PhysicalStorageBufferEXT_blockType %16
-%21 = OpAccessChain %_ptr_PhysicalStorageBufferEXT__ptr_PhysicalStorageBufferEXT_blockType %17 %int_1
+%16 = OpAccessChain %_ptr_StorageBuffer__ptr_PhysicalStorageBuffer_blockType %r %int_0
+%17 = OpLoad %_ptr_PhysicalStorageBuffer_blockType %16
+%21 = OpAccessChain %_ptr_PhysicalStorageBuffer__ptr_PhysicalStorageBuffer_blockType %17 %int_1
 %30 = OpConvertPtrToU %ulong %21
 %30 = OpConvertPtrToU %ulong %21
 %67 = OpFunctionCall %bool %32 %30 %uint_8
 %67 = OpFunctionCall %bool %32 %30 %uint_8
 OpSelectionMerge %68 None
 OpSelectionMerge %68 None
 OpBranchConditional %67 %69 %70
 OpBranchConditional %67 %69 %70
 %69 = OpLabel
 %69 = OpLabel
-%71 = OpLoad %_ptr_PhysicalStorageBufferEXT_blockType %21 Aligned 8
+%71 = OpLoad %_ptr_PhysicalStorageBuffer_blockType %21 Aligned 8
 OpBranch %68
 OpBranch %68
 %70 = OpLabel
 %70 = OpLabel
 %72 = OpUConvert %uint %30
 %72 = OpUConvert %uint %30
@@ -501,8 +501,8 @@ OpBranch %68
 %131 = OpFunctionCall %void %76 %uint_44 %uint_2 %72 %75
 %131 = OpFunctionCall %void %76 %uint_44 %uint_2 %72 %75
 OpBranch %68
 OpBranch %68
 %68 = OpLabel
 %68 = OpLabel
-%133 = OpPhi %_ptr_PhysicalStorageBufferEXT_blockType %71 %69 %132 %70
-%26 = OpAccessChain %_ptr_PhysicalStorageBufferEXT_int %133 %int_0
+%133 = OpPhi %_ptr_PhysicalStorageBuffer_blockType %71 %69 %132 %70
+%26 = OpAccessChain %_ptr_PhysicalStorageBuffer_int %133 %int_0
 %134 = OpConvertPtrToU %ulong %26
 %134 = OpConvertPtrToU %ulong %26
 %135 = OpFunctionCall %bool %32 %134 %uint_4
 %135 = OpFunctionCall %bool %32 %134 %uint_4
 OpSelectionMerge %136 None
 OpSelectionMerge %136 None

+ 2 - 2
3rdparty/spirv-tools/test/opt/legalize_vector_shuffle_test.cpp

@@ -34,9 +34,9 @@ void operator+=(std::vector<const char*>& lhs,
 
 
 std::vector<const char*> header = {
 std::vector<const char*> header = {
     "OpCapability Shader",
     "OpCapability Shader",
-    "OpCapability VulkanMemoryModelKHR",
+    "OpCapability VulkanMemoryModel",
     "OpExtension \"SPV_KHR_vulkan_memory_model\"",
     "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-    "OpMemoryModel Logical VulkanKHR",
+    "OpMemoryModel Logical Vulkan",
     "OpEntryPoint Vertex %1 \"shader\"",
     "OpEntryPoint Vertex %1 \"shader\"",
     "%uint = OpTypeInt 32 0",
     "%uint = OpTypeInt 32 0",
     "%v3uint = OpTypeVector %uint 3"};
     "%v3uint = OpTypeVector %uint 3"};

+ 62 - 27
3rdparty/spirv-tools/test/opt/local_ssa_elim_test.cpp

@@ -138,8 +138,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, NestedForLoop) {
 TEST_F(LocalSSAElimTest, NestedForLoop) {
@@ -280,8 +280,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, ForLoopWithContinue) {
 TEST_F(LocalSSAElimTest, ForLoopWithContinue) {
@@ -426,9 +426,9 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(
-      predefs + names + predefs2 + before, predefs + names + predefs2 + after,
-      true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + names + predefs2 + before,
+                                        predefs + names + predefs2 + after,
+                                        true, true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, ForLoopWithBreak) {
 TEST_F(LocalSSAElimTest, ForLoopWithBreak) {
@@ -567,8 +567,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, SwapProblem) {
 TEST_F(LocalSSAElimTest, SwapProblem) {
@@ -704,8 +704,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, LostCopyProblem) {
 TEST_F(LocalSSAElimTest, LostCopyProblem) {
@@ -848,8 +848,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, IfThenElse) {
 TEST_F(LocalSSAElimTest, IfThenElse) {
@@ -948,8 +948,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, IfThen) {
 TEST_F(LocalSSAElimTest, IfThen) {
@@ -1037,8 +1037,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, Switch) {
 TEST_F(LocalSSAElimTest, Switch) {
@@ -1168,8 +1168,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, SwitchWithFallThrough) {
 TEST_F(LocalSSAElimTest, SwitchWithFallThrough) {
@@ -1300,8 +1300,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(predefs + before,
-                                                 predefs + after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + before, predefs + after, true,
+                                        true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, DontPatchPhiInLoopHeaderThatIsNotAVar) {
 TEST_F(LocalSSAElimTest, DontPatchPhiInLoopHeaderThatIsNotAVar) {
@@ -1331,7 +1331,7 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(before, before, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(before, before, true, true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, OptInitializedVariableLikeStore) {
 TEST_F(LocalSSAElimTest, OptInitializedVariableLikeStore) {
@@ -1428,8 +1428,8 @@ OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
 
 
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(
-      predefs + func_before, predefs + func_after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(predefs + func_before,
+                                        predefs + func_after, true, true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, PointerVariable) {
 TEST_F(LocalSSAElimTest, PointerVariable) {
@@ -1531,7 +1531,7 @@ OpFunctionEnd
   // Relax logical pointers to allow pointer allocations.
   // Relax logical pointers to allow pointer allocations.
   SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
   SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
   ValidatorOptions()->relax_logical_pointer = true;
   ValidatorOptions()->relax_logical_pointer = true;
-  SinglePassRunAndCheck<LocalMultiStoreElimPass>(before, after, true, true);
+  SinglePassRunAndCheck<SSARewritePass>(before, after, true, true);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, VerifyInstToBlockMap) {
 TEST_F(LocalSSAElimTest, VerifyInstToBlockMap) {
@@ -1620,7 +1620,7 @@ OpFunctionEnd
   // Force the instruction to block mapping to get built.
   // Force the instruction to block mapping to get built.
   context->get_instr_block(27u);
   context->get_instr_block(27u);
 
 
-  auto pass = MakeUnique<LocalMultiStoreElimPass>();
+  auto pass = MakeUnique<SSARewritePass>();
   pass->SetMessageConsumer(nullptr);
   pass->SetMessageConsumer(nullptr);
   const auto status = pass->Run(context.get());
   const auto status = pass->Run(context.get());
   EXPECT_TRUE(status == Pass::Status::SuccessWithChange);
   EXPECT_TRUE(status == Pass::Status::SuccessWithChange);
@@ -1927,7 +1927,7 @@ TEST_F(LocalSSAElimTest, VariablePointerTest2) {
                OpReturn
                OpReturn
                OpFunctionEnd
                OpFunctionEnd
   )";
   )";
-  SinglePassRunAndMatch<LocalMultiStoreElimPass>(text, false);
+  SinglePassRunAndMatch<SSARewritePass>(text, false);
 }
 }
 
 
 TEST_F(LocalSSAElimTest, ChainedTrivialPhis) {
 TEST_F(LocalSSAElimTest, ChainedTrivialPhis) {
@@ -1987,6 +1987,41 @@ TEST_F(LocalSSAElimTest, ChainedTrivialPhis) {
   SinglePassRunAndMatch<SSARewritePass>(text, false);
   SinglePassRunAndMatch<SSARewritePass>(text, false);
 }
 }
 
 
+TEST_F(LocalSSAElimTest, Overflowtest1) {
+  // Check that the copy object get the undef value implicitly assigned in the
+  // entry block.
+  const std::string text = R"(
+OpCapability Geometry
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %4 "P2Mai" %12 %17
+OpExecutionMode %4 OriginUpperLeft
+%2 = OpTypeVoid
+%3 = OpTypeFunction %2
+%6 = OpTypeFloat 32
+%7 = OpTypeVector %6 4
+%11 = OpTypePointer Input %7
+%16 = OpTypePointer Output %7
+%23 = OpTypePointer Function %7
+%12 = OpVariable %11 Input
+%17 = OpVariable %16 Output
+%4 = OpFunction %2 None %3
+%2177 = OpLabel
+%4194302 = OpVariable %23 Function
+%4194301 = OpLoad %7 %4194302
+OpStore %17 %4194301
+OpReturn
+OpFunctionEnd
+  )";
+
+  SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+
+  std::vector<Message> messages = {
+      {SPV_MSG_ERROR, "", 0, 0, "ID overflow. Try running compact-ids."}};
+  SetMessageConsumer(GetTestMessageConsumer(messages));
+  auto result = SinglePassRunToBinary<SSARewritePass>(text, true);
+  EXPECT_EQ(Pass::Status::Failure, std::get<1>(result));
+}
+
 // TODO(greg-lunarg): Add tests to verify handling of these cases:
 // TODO(greg-lunarg): Add tests to verify handling of these cases:
 //
 //
 //    No optimization in the presence of
 //    No optimization in the presence of

+ 43 - 42
3rdparty/spirv-tools/test/opt/optimizer_test.cpp

@@ -273,7 +273,8 @@ TEST_P(VulkanToWebGPUPassTest, Ran) {
   std::vector<uint32_t> optimized;
   std::vector<uint32_t> optimized;
   class ValidatorOptions validator_options;
   class ValidatorOptions validator_options;
   ASSERT_TRUE(opt.Run(binary.data(), binary.size(), &optimized,
   ASSERT_TRUE(opt.Run(binary.data(), binary.size(), &optimized,
-                      validator_options, true));
+                      validator_options, true))
+      << GetParam().input << "\n";
   std::string disassembly;
   std::string disassembly;
   {
   {
     SpirvTools tools(SPV_ENV_WEBGPU_0);
     SpirvTools tools(SPV_ENV_WEBGPU_0);
@@ -290,9 +291,9 @@ INSTANTIATE_TEST_SUITE_P(
         // FlattenDecorations
         // FlattenDecorations
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Fragment %main \"main\" %hue %saturation %value\n"
          "OpEntryPoint Fragment %main \"main\" %hue %saturation %value\n"
          "OpExecutionMode %main OriginUpperLeft\n"
          "OpExecutionMode %main OriginUpperLeft\n"
          "OpDecorate %group Flat\n"
          "OpDecorate %group Flat\n"
@@ -311,9 +312,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Fragment %1 \"main\" %2 %3 %4\n"
          "OpEntryPoint Fragment %1 \"main\" %2 %3 %4\n"
          "OpExecutionMode %1 OriginUpperLeft\n"
          "OpExecutionMode %1 OriginUpperLeft\n"
          "%void = OpTypeVoid\n"
          "%void = OpTypeVoid\n"
@@ -332,9 +333,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Strip Debug
         // Strip Debug
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %func \"shader\"\n"
          "OpEntryPoint Vertex %func \"shader\"\n"
          "OpName %main \"main\"\n"
          "OpName %main \"main\"\n"
          "OpName %void_fn \"void_fn\"\n"
          "OpName %void_fn \"void_fn\"\n"
@@ -346,9 +347,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%void = OpTypeVoid\n"
          "%void = OpTypeVoid\n"
          "%3 = OpTypeFunction %void\n"
          "%3 = OpTypeFunction %void\n"
@@ -361,9 +362,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Eliminate Dead Constants
         // Eliminate Dead Constants
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %func \"shader\"\n"
          "OpEntryPoint Vertex %func \"shader\"\n"
          "%u32 = OpTypeInt 32 0\n"
          "%u32 = OpTypeInt 32 0\n"
          "%u32_ptr = OpTypePointer Workgroup %u32\n"
          "%u32_ptr = OpTypePointer Workgroup %u32\n"
@@ -380,9 +381,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint\n"
          "%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint\n"
@@ -397,9 +398,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Strip Atomic Counter Memory
         // Strip Atomic Counter Memory
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %func \"shader\"\n"
          "OpEntryPoint Vertex %func \"shader\"\n"
          "%u32 = OpTypeInt 32 0\n"
          "%u32 = OpTypeInt 32 0\n"
          "%u32_ptr = OpTypePointer Workgroup %u32\n"
          "%u32_ptr = OpTypePointer Workgroup %u32\n"
@@ -412,7 +413,7 @@ INSTANTIATE_TEST_SUITE_P(
          "%void_f = OpTypeFunction %void\n"
          "%void_f = OpTypeFunction %void\n"
          "%func = OpFunction %void None %void_f\n"
          "%func = OpFunction %void None %void_f\n"
          "%label = OpLabel\n"
          "%label = OpLabel\n"
-         "%val0 = OpAtomicStore %u32_var %cross_device "
+         "        OpAtomicStore %u32_var %cross_device "
          "%acquire_release_atomic_counter_workgroup %u32_1\n"
          "%acquire_release_atomic_counter_workgroup %u32_1\n"
          "%val1 = OpAtomicIIncrement %u32 %u32_var %cross_device "
          "%val1 = OpAtomicIIncrement %u32 %u32_var %cross_device "
          "%acquire_release_atomic_counter_workgroup\n"
          "%acquire_release_atomic_counter_workgroup\n"
@@ -423,9 +424,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint\n"
          "%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint\n"
@@ -449,9 +450,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Generate WebGPU Initializers
         // Generate WebGPU Initializers
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %func \"shader\"\n"
          "OpEntryPoint Vertex %func \"shader\"\n"
          "%u32 = OpTypeInt 32 0\n"
          "%u32 = OpTypeInt 32 0\n"
          "%u32_ptr = OpTypePointer Private %u32\n"
          "%u32_ptr = OpTypePointer Private %u32\n"
@@ -466,9 +467,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%_ptr_Private_uint = OpTypePointer Private %uint\n"
          "%_ptr_Private_uint = OpTypePointer Private %uint\n"
@@ -487,9 +488,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Legalize Vector Shuffle
         // Legalize Vector Shuffle
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%v3uint = OpTypeVector %uint 3\n"
          "%v3uint = OpTypeVector %uint 3\n"
@@ -506,9 +507,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%v3uint = OpTypeVector %uint 3\n"
          "%v3uint = OpTypeVector %uint 3\n"
@@ -529,9 +530,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Split Invalid Unreachable
         // Split Invalid Unreachable
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint_1 = OpConstant %uint 1\n"
          "%uint_1 = OpConstant %uint 1\n"
@@ -560,9 +561,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint_1 = OpConstant %uint 1\n"
          "%uint_1 = OpConstant %uint 1\n"
@@ -596,9 +597,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Compact IDs
         // Compact IDs
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1000 \"shader\"\n"
          "OpEntryPoint Vertex %1000 \"shader\"\n"
          "%10 = OpTypeVoid\n"
          "%10 = OpTypeVoid\n"
          "%100 = OpTypeFunction %10\n"
          "%100 = OpTypeFunction %10\n"
@@ -608,9 +609,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%void = OpTypeVoid\n"
          "%void = OpTypeVoid\n"
          "%3 = OpTypeFunction %void\n"
          "%3 = OpTypeFunction %void\n"
@@ -682,9 +683,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Decompose Initialized Variables
         // Decompose Initialized Variables
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%_ptr_Function_uint = OpTypePointer Function %uint\n"
          "%_ptr_Function_uint = OpTypePointer Function %uint\n"
@@ -698,9 +699,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%uint = OpTypeInt 32 0\n"
          "%uint = OpTypeInt 32 0\n"
          "%_ptr_Function_uint = OpTypePointer Function %uint\n"
          "%_ptr_Function_uint = OpTypePointer Function %uint\n"
@@ -718,9 +719,9 @@ INSTANTIATE_TEST_SUITE_P(
         // Compact IDs
         // Compact IDs
         {// input
         {// input
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1000 \"shader\"\n"
          "OpEntryPoint Vertex %1000 \"shader\"\n"
          "%10 = OpTypeVoid\n"
          "%10 = OpTypeVoid\n"
          "%100 = OpTypeFunction %10\n"
          "%100 = OpTypeFunction %10\n"
@@ -730,9 +731,9 @@ INSTANTIATE_TEST_SUITE_P(
          "OpFunctionEnd\n",
          "OpFunctionEnd\n",
          // expected
          // expected
          "OpCapability Shader\n"
          "OpCapability Shader\n"
-         "OpCapability VulkanMemoryModelKHR\n"
+         "OpCapability VulkanMemoryModel\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
          "OpExtension \"SPV_KHR_vulkan_memory_model\"\n"
-         "OpMemoryModel Logical VulkanKHR\n"
+         "OpMemoryModel Logical Vulkan\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "OpEntryPoint Vertex %1 \"shader\"\n"
          "%void = OpTypeVoid\n"
          "%void = OpTypeVoid\n"
          "%3 = OpTypeFunction %void\n"
          "%3 = OpTypeFunction %void\n"

+ 6 - 6
3rdparty/spirv-tools/test/opt/simplification_test.cpp

@@ -206,7 +206,7 @@ TEST_F(SimplificationTest, CopyObjectWithDecorations1) {
   // Don't simplify OpCopyObject if the result id has a decoration that the
   // Don't simplify OpCopyObject if the result id has a decoration that the
   // operand does not.
   // operand does not.
   const std::string text = R"(OpCapability Shader
   const std::string text = R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
+OpCapability ShaderNonUniform
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint Fragment %2 "main"
 OpEntryPoint Fragment %2 "main"
@@ -214,7 +214,7 @@ OpExecutionMode %2 OriginUpperLeft
 OpSource GLSL 430
 OpSource GLSL 430
 OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
 OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
 OpSourceExtension "GL_GOOGLE_include_directive"
 OpSourceExtension "GL_GOOGLE_include_directive"
-OpDecorate %3 NonUniformEXT
+OpDecorate %3 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %5 = OpTypeFunction %void
 %5 = OpTypeFunction %void
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1
@@ -234,7 +234,7 @@ TEST_F(SimplificationTest, CopyObjectWithDecorations2) {
   // Simplify OpCopyObject if the result id is a subset of the decorations of
   // Simplify OpCopyObject if the result id is a subset of the decorations of
   // the operand.
   // the operand.
   const std::string before = R"(OpCapability Shader
   const std::string before = R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
+OpCapability ShaderNonUniform
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint Fragment %2 "main"
 OpEntryPoint Fragment %2 "main"
@@ -242,7 +242,7 @@ OpExecutionMode %2 OriginUpperLeft
 OpSource GLSL 430
 OpSource GLSL 430
 OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
 OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
 OpSourceExtension "GL_GOOGLE_include_directive"
 OpSourceExtension "GL_GOOGLE_include_directive"
-OpDecorate %3 NonUniformEXT
+OpDecorate %3 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %5 = OpTypeFunction %void
 %5 = OpTypeFunction %void
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1
@@ -256,7 +256,7 @@ OpFunctionEnd
 )";
 )";
 
 
   const std::string after = R"(OpCapability Shader
   const std::string after = R"(OpCapability Shader
-OpCapability ShaderNonUniformEXT
+OpCapability ShaderNonUniform
 %1 = OpExtInstImport "GLSL.std.450"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint Fragment %2 "main"
 OpEntryPoint Fragment %2 "main"
@@ -264,7 +264,7 @@ OpExecutionMode %2 OriginUpperLeft
 OpSource GLSL 430
 OpSource GLSL 430
 OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
 OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
 OpSourceExtension "GL_GOOGLE_include_directive"
 OpSourceExtension "GL_GOOGLE_include_directive"
-OpDecorate %3 NonUniformEXT
+OpDecorate %3 NonUniform
 %void = OpTypeVoid
 %void = OpTypeVoid
 %5 = OpTypeFunction %void
 %5 = OpTypeFunction %void
 %int = OpTypeInt 32 1
 %int = OpTypeInt 32 1

+ 2 - 2
3rdparty/spirv-tools/test/opt/split_invalid_unreachable_test.cpp

@@ -24,9 +24,9 @@ namespace {
 using SplitInvalidUnreachableTest = PassTest<::testing::Test>;
 using SplitInvalidUnreachableTest = PassTest<::testing::Test>;
 
 
 std::string spirv_header = R"(OpCapability Shader
 std::string spirv_header = R"(OpCapability Shader
-OpCapability VulkanMemoryModelKHR
+OpCapability VulkanMemoryModel
 OpExtension "SPV_KHR_vulkan_memory_model"
 OpExtension "SPV_KHR_vulkan_memory_model"
-OpMemoryModel Logical VulkanKHR
+OpMemoryModel Logical Vulkan
 OpEntryPoint Vertex %1 "shader"
 OpEntryPoint Vertex %1 "shader"
 %uint = OpTypeInt 32 0
 %uint = OpTypeInt 32 0
 %uint_1 = OpConstant %uint 1
 %uint_1 = OpConstant %uint 1

+ 4 - 4
3rdparty/spirv-tools/test/opt/strip_atomic_counter_memory_test.cpp

@@ -45,9 +45,9 @@ std::string GetUnchangedString(std::string(generate_inst)(std::string),
   std::vector<const char*> result = {
   std::vector<const char*> result = {
       // clang-format off
       // clang-format off
               "OpCapability Shader",
               "OpCapability Shader",
-              "OpCapability VulkanMemoryModelKHR",
+              "OpCapability VulkanMemoryModel",
               "OpExtension \"SPV_KHR_vulkan_memory_model\"",
               "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-              "OpMemoryModel Logical VulkanKHR",
+              "OpMemoryModel Logical Vulkan",
               "OpEntryPoint Vertex %1 \"shader\"",
               "OpEntryPoint Vertex %1 \"shader\"",
       "%uint = OpTypeInt 32 0",
       "%uint = OpTypeInt 32 0",
 "%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint",
 "%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint",
@@ -76,9 +76,9 @@ std::string GetChangedString(std::string(generate_inst)(std::string),
   std::vector<const char*> result = {
   std::vector<const char*> result = {
       // clang-format off
       // clang-format off
               "OpCapability Shader",
               "OpCapability Shader",
-              "OpCapability VulkanMemoryModelKHR",
+              "OpCapability VulkanMemoryModel",
               "OpExtension \"SPV_KHR_vulkan_memory_model\"",
               "OpExtension \"SPV_KHR_vulkan_memory_model\"",
-              "OpMemoryModel Logical VulkanKHR",
+              "OpMemoryModel Logical Vulkan",
               "OpEntryPoint Vertex %1 \"shader\"",
               "OpEntryPoint Vertex %1 \"shader\"",
       "%uint = OpTypeInt 32 0",
       "%uint = OpTypeInt 32 0",
 "%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint",
 "%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint",

+ 86 - 86
3rdparty/spirv-tools/test/opt/upgrade_memory_model_test.cpp

@@ -34,14 +34,14 @@ OpMemoryModel Logical OpenCL
   SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
   SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
 }
 }
 
 
-TEST_F(UpgradeMemoryModelTest, InvalidMemoryModelVulkanKHR) {
+TEST_F(UpgradeMemoryModelTest, InvalidMemoryModelVulkan) {
   const std::string text = R"(
   const std::string text = R"(
-; CHECK: OpMemoryModel Logical VulkanKHR
+; CHECK: OpMemoryModel Logical Vulkan
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
-OpCapability VulkanMemoryModelKHR
+OpCapability VulkanMemoryModel
 OpExtension "SPV_KHR_vulkan_memory_model"
 OpExtension "SPV_KHR_vulkan_memory_model"
-OpMemoryModel Logical VulkanKHR
+OpMemoryModel Logical Vulkan
 )";
 )";
 
 
   SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
   SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
@@ -49,9 +49,9 @@ OpMemoryModel Logical VulkanKHR
 
 
 TEST_F(UpgradeMemoryModelTest, JustMemoryModel) {
 TEST_F(UpgradeMemoryModelTest, JustMemoryModel) {
   const std::string text = R"(
   const std::string text = R"(
-; CHECK: OpCapability VulkanMemoryModelKHR
+; CHECK: OpCapability VulkanMemoryModel
 ; CHECK: OpExtension "SPV_KHR_vulkan_memory_model"
 ; CHECK: OpExtension "SPV_KHR_vulkan_memory_model"
-; CHECK: OpMemoryModel Logical VulkanKHR
+; CHECK: OpMemoryModel Logical Vulkan
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -79,8 +79,8 @@ OpDecorate %var Coherent
 TEST_F(UpgradeMemoryModelTest, WorkgroupVariable) {
 TEST_F(UpgradeMemoryModelTest, WorkgroupVariable) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 2
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 2
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -92,7 +92,7 @@ OpMemoryModel Logical GLSL450
 %func = OpFunction %void None %func_ty
 %func = OpFunction %void None %func_ty
 %1 = OpLabel
 %1 = OpLabel
 %ld = OpLoad %int %var
 %ld = OpLoad %int %var
-%st = OpStore %var %ld
+OpStore %var %ld
 OpReturn
 OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
@@ -103,8 +103,8 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, WorkgroupFunctionParameter) {
 TEST_F(UpgradeMemoryModelTest, WorkgroupFunctionParameter) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 2
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 2
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -116,7 +116,7 @@ OpMemoryModel Logical GLSL450
 %param = OpFunctionParameter %ptr_int_Workgroup
 %param = OpFunctionParameter %ptr_int_Workgroup
 %1 = OpLabel
 %1 = OpLabel
 %ld = OpLoad %int %param
 %ld = OpLoad %int %param
-%st = OpStore %param %ld
+OpStore %param %ld
 OpReturn
 OpReturn
 OpFunctionEnd
 OpFunctionEnd
 )";
 )";
@@ -128,8 +128,8 @@ TEST_F(UpgradeMemoryModelTest, SimpleUniformVariable) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -155,8 +155,8 @@ TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameter) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -208,8 +208,8 @@ TEST_F(UpgradeMemoryModelTest, SimpleUniformVariableCopied) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -236,8 +236,8 @@ TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameterCopied) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -265,8 +265,8 @@ TEST_F(UpgradeMemoryModelTest, SimpleUniformVariableAccessChain) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -297,8 +297,8 @@ TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameterAccessChain) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -330,8 +330,8 @@ TEST_F(UpgradeMemoryModelTest, VariablePointerSelect) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability VariablePointers
 OpCapability VariablePointers
@@ -363,8 +363,8 @@ TEST_F(UpgradeMemoryModelTest, VariablePointerSelectConservative) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability VariablePointers
 OpCapability VariablePointers
@@ -396,8 +396,8 @@ TEST_F(UpgradeMemoryModelTest, VariablePointerIncrement) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate {{%\w+}} Coherent
 ; CHECK-NOT: OpDecorate {{%\w+}} Coherent
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability VariablePointers
 OpCapability VariablePointers
@@ -439,8 +439,8 @@ TEST_F(UpgradeMemoryModelTest, CoherentStructElement) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -470,8 +470,8 @@ TEST_F(UpgradeMemoryModelTest, CoherentElementFullStructAccess) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -497,9 +497,9 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, CoherentElementNotAccessed) {
 TEST_F(UpgradeMemoryModelTest, CoherentElementNotAccessed) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
-; CHECK-NOT: MakePointerAvailableKHR
-; CHECK-NOT: NonPrivatePointerKHR
-; CHECK-NOT: MakePointerVisibleKHR
+; CHECK-NOT: MakePointerAvailable
+; CHECK-NOT: NonPrivatePointer
+; CHECK-NOT: MakePointerVisible
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -529,8 +529,8 @@ TEST_F(UpgradeMemoryModelTest, MultiIndexAccessCoherent) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -563,9 +563,9 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, MultiIndexAccessNonCoherent) {
 TEST_F(UpgradeMemoryModelTest, MultiIndexAccessNonCoherent) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
-; CHECK-NOT: MakePointerAvailableKHR
-; CHECK-NOT: NonPrivatePointerKHR
-; CHECK-NOT: MakePointerVisibleKHR
+; CHECK-NOT: MakePointerAvailable
+; CHECK-NOT: NonPrivatePointer
+; CHECK-NOT: MakePointerVisible
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -599,8 +599,8 @@ TEST_F(UpgradeMemoryModelTest, ConsecutiveAccessChainCoherent) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -639,9 +639,9 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, ConsecutiveAccessChainNonCoherent) {
 TEST_F(UpgradeMemoryModelTest, ConsecutiveAccessChainNonCoherent) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
-; CHECK-NOT: MakePointerAvailableKHR
-; CHECK-NOT: NonPrivatePointerKHR
-; CHECK-NOT: MakePointerVisibleKHR
+; CHECK-NOT: MakePointerAvailable
+; CHECK-NOT: NonPrivatePointer
+; CHECK-NOT: MakePointerVisible
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -681,8 +681,8 @@ TEST_F(UpgradeMemoryModelTest, CoherentStructElementAccess) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -722,8 +722,8 @@ TEST_F(UpgradeMemoryModelTest, NonCoherentLoadCoherentStore) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK-NOT: OpMemberDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK-NOT: MakePointerVisibleKHR
-; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]]
+; CHECK-NOT: MakePointerVisible
+; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -763,7 +763,7 @@ TEST_F(UpgradeMemoryModelTest, CopyMemory) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[queuefamily]]
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[queuefamily]]
 ; CHECK-NOT: [[queuefamily]]
 ; CHECK-NOT: [[queuefamily]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
@@ -791,7 +791,7 @@ TEST_F(UpgradeMemoryModelTest, CopyMemorySized) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpCopyMemorySized {{%\w+}} {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[queuefamily]]
+; CHECK: OpCopyMemorySized {{%\w+}} {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[queuefamily]]
 ; CHECK-NOT: [[queuefamily]]
 ; CHECK-NOT: [[queuefamily]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
@@ -822,7 +822,7 @@ TEST_F(UpgradeMemoryModelTest, CopyMemoryTwoScopes) {
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK-DAG: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK-DAG: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK-DAG: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
 ; CHECK-DAG: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailableKHR|MakePointerVisibleKHR|NonPrivatePointerKHR [[workgroup]] [[queuefamily]]
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailable|MakePointerVisible|NonPrivatePointer [[workgroup]] [[queuefamily]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpExtension "SPV_KHR_storage_buffer_storage_class"
 OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -850,7 +850,7 @@ TEST_F(UpgradeMemoryModelTest, VolatileImageRead) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
 ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
-; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexelKHR
+; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexel
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageReadWithoutFormat
 OpCapability StorageImageReadWithoutFormat
@@ -882,8 +882,8 @@ TEST_F(UpgradeMemoryModelTest, CoherentImageRead) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisibleKHR|NonPrivateTexelKHR [[scope]] 
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisible|NonPrivateTexel [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageReadWithoutFormat
 OpCapability StorageImageReadWithoutFormat
@@ -916,9 +916,9 @@ TEST_F(UpgradeMemoryModelTest, CoherentImageReadExtractedFromSampledImage) {
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[image:%\w+]] = OpTypeImage
 ; CHECK: [[image:%\w+]] = OpTypeImage
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad [[image]] {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK-NOT: NonPrivatePointerKHR
-; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisibleKHR|NonPrivateTexelKHR [[scope]]
+; CHECK: OpLoad [[image]] {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK-NOT: NonPrivatePointer
+; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisible|NonPrivateTexel [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageReadWithoutFormat
 OpCapability StorageImageReadWithoutFormat
@@ -957,7 +957,7 @@ TEST_F(UpgradeMemoryModelTest, VolatileImageWrite) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
 ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
-; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexelKHR
+; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexel
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageWriteWithoutFormat
 OpCapability StorageImageWriteWithoutFormat
@@ -989,8 +989,8 @@ TEST_F(UpgradeMemoryModelTest, CoherentImageWrite) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR
-; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailableKHR|NonPrivateTexelKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer
+; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailable|NonPrivateTexel [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageWriteWithoutFormat
 OpCapability StorageImageWriteWithoutFormat
@@ -1022,9 +1022,9 @@ TEST_F(UpgradeMemoryModelTest, CoherentImageWriteExtractFromSampledImage) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR
-; CHECK-NOT: NonPrivatePointerKHR
-; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailableKHR|NonPrivateTexelKHR [[scope]]
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer
+; CHECK-NOT: NonPrivatePointer
+; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailable|NonPrivateTexel [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageWriteWithoutFormat
 OpCapability StorageImageWriteWithoutFormat
@@ -1063,7 +1063,7 @@ TEST_F(UpgradeMemoryModelTest, VolatileImageSparseRead) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
 ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
-; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexelKHR
+; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexel
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageReadWithoutFormat
 OpCapability StorageImageReadWithoutFormat
@@ -1097,8 +1097,8 @@ TEST_F(UpgradeMemoryModelTest, CoherentImageSparseRead) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisibleKHR|NonPrivateTexelKHR [[scope]] 
+; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisible|NonPrivateTexel [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageReadWithoutFormat
 OpCapability StorageImageReadWithoutFormat
@@ -1134,9 +1134,9 @@ TEST_F(UpgradeMemoryModelTest,
 ; CHECK-NOT: OpDecorate
 ; CHECK-NOT: OpDecorate
 ; CHECK: [[image:%\w+]] = OpTypeImage
 ; CHECK: [[image:%\w+]] = OpTypeImage
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpLoad [[image]] {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
-; CHECK-NOT: NonPrivatePointerKHR
-; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisibleKHR|NonPrivateTexelKHR [[scope]]
+; CHECK: OpLoad [[image]] {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
+; CHECK-NOT: NonPrivatePointer
+; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisible|NonPrivateTexel [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpCapability Linkage
 OpCapability Linkage
 OpCapability StorageImageReadWithoutFormat
 OpCapability StorageImageReadWithoutFormat
@@ -1440,7 +1440,7 @@ TEST_F(UpgradeMemoryModelTest, UpgradeModfNoFlags) {
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
 ; CHECK: OpStore [[var]] [[ex1]]
 ; CHECK: OpStore [[var]] [[ex1]]
-; CHECK-NOT: NonPrivatePointerKHR
+; CHECK-NOT: NonPrivatePointer
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -1474,7 +1474,7 @@ TEST_F(UpgradeMemoryModelTest, UpgradeModfWorkgroupCoherent) {
 ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} ModfStruct [[float_0]]
 ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} ModfStruct [[float_0]]
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
-; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailableKHR|NonPrivatePointerKHR [[wg_scope]]
+; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailable|NonPrivatePointer [[wg_scope]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -1509,7 +1509,7 @@ TEST_F(UpgradeMemoryModelTest, UpgradeModfSSBOCoherent) {
 ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} ModfStruct [[float_0]]
 ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} ModfStruct [[float_0]]
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
-; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailableKHR|NonPrivatePointerKHR [[qf_scope]]
+; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailable|NonPrivatePointer [[qf_scope]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -1579,7 +1579,7 @@ TEST_F(UpgradeMemoryModelTest, UpgradeFrexpNoFlags) {
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
 ; CHECK: OpStore [[var]] [[ex1]]
 ; CHECK: OpStore [[var]] [[ex1]]
-; CHECK-NOT: NonPrivatePointerKHR
+; CHECK-NOT: NonPrivatePointer
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -1615,7 +1615,7 @@ TEST_F(UpgradeMemoryModelTest, UpgradeFrexpWorkgroupCoherent) {
 ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} FrexpStruct [[float_0]]
 ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} FrexpStruct [[float_0]]
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
-; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailableKHR|NonPrivatePointerKHR [[wg_scope]]
+; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailable|NonPrivatePointer [[wg_scope]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -1652,7 +1652,7 @@ TEST_F(UpgradeMemoryModelTest, UpgradeFrexpSSBOCoherent) {
 ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} FrexpStruct [[float_0]]
 ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} FrexpStruct [[float_0]]
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
 ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
-; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailableKHR|NonPrivatePointerKHR [[qf_scope]]
+; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailable|NonPrivatePointer [[qf_scope]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
@@ -1785,7 +1785,7 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherent) {
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherent) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] None
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]] None
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint GLCompute %func "func" %src %dst
 OpEntryPoint GLCompute %func "func" %src %dst
@@ -1810,7 +1810,7 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherentPreviousArgs) {
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherentPreviousArgs) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 4 [[scope]] Aligned 4
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailable|NonPrivatePointer 4 [[scope]] Aligned 4
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint GLCompute %func "func" %src %dst
 OpEntryPoint GLCompute %func "func" %src %dst
@@ -1835,7 +1835,7 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemorySrcCoherent) {
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemorySrcCoherent) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} None MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]]
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} None MakePointerVisible|NonPrivatePointer [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint GLCompute %func "func" %src %dst
 OpEntryPoint GLCompute %func "func" %src %dst
@@ -1860,7 +1860,7 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemorySrcCoherentPreviousArgs) {
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemorySrcCoherentPreviousArgs) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned 4 Aligned|MakePointerVisibleKHR|NonPrivatePointerKHR 4 [[scope]]
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned 4 Aligned|MakePointerVisible|NonPrivatePointer 4 [[scope]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint GLCompute %func "func" %src %dst
 OpEntryPoint GLCompute %func "func" %src %dst
@@ -1886,7 +1886,7 @@ TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryBothCoherent) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-DAG: [[queue:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK-DAG: [[queue:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK-DAG: [[wg:%\w+]] = OpConstant {{%\w+}} 2
 ; CHECK-DAG: [[wg:%\w+]] = OpConstant {{%\w+}} 2
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[wg]] MakePointerVisibleKHR|NonPrivatePointerKHR [[queue]]
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[wg]] MakePointerVisible|NonPrivatePointer [[queue]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint GLCompute %func "func" %src %dst
 OpEntryPoint GLCompute %func "func" %src %dst
@@ -1913,7 +1913,7 @@ TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryBothCoherentPreviousArgs) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK-DAG: [[queue:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK-DAG: [[queue:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK-DAG: [[wg:%\w+]] = OpConstant {{%\w+}} 2
 ; CHECK-DAG: [[wg:%\w+]] = OpConstant {{%\w+}} 2
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 4 [[queue]] Aligned|MakePointerVisibleKHR|NonPrivatePointerKHR 4 [[wg]]
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailable|NonPrivatePointer 4 [[queue]] Aligned|MakePointerVisible|NonPrivatePointer 4 [[wg]]
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint GLCompute %func "func" %src %dst
 OpEntryPoint GLCompute %func "func" %src %dst
@@ -1989,7 +1989,7 @@ OpFunctionEnd
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherentTwoOperands) {
 TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherentTwoOperands) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] None
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]] None
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint GLCompute %func "func" %src %dst
 OpEntryPoint GLCompute %func "func" %src %dst
@@ -2015,7 +2015,7 @@ TEST_F(UpgradeMemoryModelTest,
        SPV14CopyMemoryDstCoherentPreviousArgsTwoOperands) {
        SPV14CopyMemoryDstCoherentPreviousArgsTwoOperands) {
   const std::string text = R"(
   const std::string text = R"(
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
 ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
-; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 4 [[scope]] Aligned 8
+; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailable|NonPrivatePointer 4 [[scope]] Aligned 8
 OpCapability Shader
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpMemoryModel Logical GLSL450
 OpEntryPoint GLCompute %func "func" %src %dst
 OpEntryPoint GLCompute %func "func" %src %dst

+ 24 - 0
3rdparty/spirv-tools/test/opt/wrap_opkill_test.cpp

@@ -262,6 +262,30 @@ OpFunctionEnd
   EXPECT_EQ(Pass::Status::Failure, std::get<1>(result));
   EXPECT_EQ(Pass::Status::Failure, std::get<1>(result));
 }
 }
 
 
+TEST_F(WrapOpKillTest, IdBoundOverflow4) {
+  const std::string text = R"(
+OpCapability DerivativeControl
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %4 "main"
+OpExecutionMode %4 OriginUpperLeft
+OpDecorate %2 Location 539091968
+%2 = OpTypeVoid
+%3 = OpTypeFunction %2
+%4 = OpFunction %2 Inline|Pure|Const %3
+%4194302 = OpLabel
+OpKill
+OpFunctionEnd
+  )";
+
+  SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+
+  std::vector<Message> messages = {
+      {SPV_MSG_ERROR, "", 0, 0, "ID overflow. Try running compact-ids."}};
+  SetMessageConsumer(GetTestMessageConsumer(messages));
+  auto result = SinglePassRunToBinary<WrapOpKill>(text, true);
+  EXPECT_EQ(Pass::Status::Failure, std::get<1>(result));
+}
+
 }  // namespace
 }  // namespace
 }  // namespace opt
 }  // namespace opt
 }  // namespace spvtools
 }  // namespace spvtools

+ 9 - 5
3rdparty/spirv-tools/test/text_to_binary.constant_test.cpp

@@ -328,7 +328,6 @@ INSTANTIATE_TEST_SUITE_P(
 
 
 using OpConstantInvalidTypeTest =
 using OpConstantInvalidTypeTest =
     spvtest::TextToBinaryTestBase<::testing::TestWithParam<std::string>>;
     spvtest::TextToBinaryTestBase<::testing::TestWithParam<std::string>>;
-
 TEST_P(OpConstantInvalidTypeTest, InvalidTypes) {
 TEST_P(OpConstantInvalidTypeTest, InvalidTypes) {
   const std::string input = "%1 = " + GetParam() +
   const std::string input = "%1 = " + GetParam() +
                             "\n"
                             "\n"
@@ -360,8 +359,11 @@ INSTANTIATE_TEST_SUITE_P(
        "OpTypeReserveId",
        "OpTypeReserveId",
        "OpTypeQueue",
        "OpTypeQueue",
        "OpTypePipe ReadOnly",
        "OpTypePipe ReadOnly",
-       "OpTypeForwardPointer %a UniformConstant",
-        // At least one thing that isn't a type at all
+
+       // Skip OpTypeForwardPointer doesn't even produce a result ID.
+       // The assembler errors out if we try to check it in this scenario.
+
+       // Try at least one thing that isn't a type at all
        "OpNot %a %b"
        "OpNot %a %b"
       },
       },
     }));
     }));
@@ -470,8 +472,10 @@ INSTANTIATE_TEST_SUITE_P(
        "OpTypeReserveId",
        "OpTypeReserveId",
        "OpTypeQueue",
        "OpTypeQueue",
        "OpTypePipe ReadOnly",
        "OpTypePipe ReadOnly",
-       "OpTypeForwardPointer %a UniformConstant",
-        // At least one thing that isn't a type at all
+
+       // Skip testing OpTypeForwardPointer because it doesn't even produce a result ID.
+
+       // Try at least one thing that isn't a type at all
        "OpNot %a %b"
        "OpNot %a %b"
       },
       },
     }));
     }));

+ 6 - 3
3rdparty/spirv-tools/test/text_to_binary.control_flow_test.cpp

@@ -342,7 +342,7 @@ TEST_P(OpSwitchInvalidTypeTestCase, InvalidTypes) {
       "%1 = " + GetParam() +
       "%1 = " + GetParam() +
       "\n"
       "\n"
       "%3 = OpCopyObject %1 %2\n"  // We only care the type of the expression
       "%3 = OpCopyObject %1 %2\n"  // We only care the type of the expression
-      "%4 = OpSwitch %3 %default 32 %c\n";
+      "     OpSwitch %3 %default 32 %c\n";
   EXPECT_THAT(CompileFailure(input),
   EXPECT_THAT(CompileFailure(input),
               Eq("The selector operand for OpSwitch must be the result of an "
               Eq("The selector operand for OpSwitch must be the result of an "
                  "instruction that generates an integer scalar"));
                  "instruction that generates an integer scalar"));
@@ -371,8 +371,11 @@ INSTANTIATE_TEST_SUITE_P(
        "OpTypeReserveId",
        "OpTypeReserveId",
        "OpTypeQueue",
        "OpTypeQueue",
        "OpTypePipe ReadOnly",
        "OpTypePipe ReadOnly",
-       "OpTypeForwardPointer %a UniformConstant",
-           // At least one thing that isn't a type at all
+
+       // Skip OpTypeForwardPointer becasuse it doesn't even produce a result
+       // ID.
+
+       // At least one thing that isn't a type at all
        "OpNot %a %b"
        "OpNot %a %b"
       },
       },
     }));
     }));

+ 49 - 49
3rdparty/spirv-tools/test/text_to_binary.extension_test.cpp

@@ -527,54 +527,54 @@ INSTANTIATE_TEST_SUITE_P(
         Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
         Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
                SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1),
                SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1),
         ValuesIn(std::vector<AssemblyCase>{
         ValuesIn(std::vector<AssemblyCase>{
-            {"OpCapability VulkanMemoryModelKHR\n",
+            {"OpCapability VulkanMemoryModel\n",
              MakeInstruction(SpvOpCapability,
              MakeInstruction(SpvOpCapability,
                              {SpvCapabilityVulkanMemoryModelKHR})},
                              {SpvCapabilityVulkanMemoryModelKHR})},
-            {"OpCapability VulkanMemoryModelDeviceScopeKHR\n",
+            {"OpCapability VulkanMemoryModelDeviceScope\n",
              MakeInstruction(SpvOpCapability,
              MakeInstruction(SpvOpCapability,
                              {SpvCapabilityVulkanMemoryModelDeviceScopeKHR})},
                              {SpvCapabilityVulkanMemoryModelDeviceScopeKHR})},
-            {"OpMemoryModel Logical VulkanKHR\n",
+            {"OpMemoryModel Logical Vulkan\n",
              MakeInstruction(SpvOpMemoryModel, {SpvAddressingModelLogical,
              MakeInstruction(SpvOpMemoryModel, {SpvAddressingModelLogical,
                                                 SpvMemoryModelVulkanKHR})},
                                                 SpvMemoryModelVulkanKHR})},
-            {"OpStore %1 %2 MakePointerAvailableKHR %3\n",
+            {"OpStore %1 %2 MakePointerAvailable %3\n",
              MakeInstruction(SpvOpStore,
              MakeInstruction(SpvOpStore,
                              {1, 2, SpvMemoryAccessMakePointerAvailableKHRMask,
                              {1, 2, SpvMemoryAccessMakePointerAvailableKHRMask,
                               3})},
                               3})},
-            {"OpStore %1 %2 Volatile|MakePointerAvailableKHR %3\n",
+            {"OpStore %1 %2 Volatile|MakePointerAvailable %3\n",
              MakeInstruction(SpvOpStore,
              MakeInstruction(SpvOpStore,
                              {1, 2,
                              {1, 2,
                               int(SpvMemoryAccessMakePointerAvailableKHRMask) |
                               int(SpvMemoryAccessMakePointerAvailableKHRMask) |
                                   int(SpvMemoryAccessVolatileMask),
                                   int(SpvMemoryAccessVolatileMask),
                               3})},
                               3})},
-            {"OpStore %1 %2 Aligned|MakePointerAvailableKHR 4 %3\n",
+            {"OpStore %1 %2 Aligned|MakePointerAvailable 4 %3\n",
              MakeInstruction(SpvOpStore,
              MakeInstruction(SpvOpStore,
                              {1, 2,
                              {1, 2,
                               int(SpvMemoryAccessMakePointerAvailableKHRMask) |
                               int(SpvMemoryAccessMakePointerAvailableKHRMask) |
                                   int(SpvMemoryAccessAlignedMask),
                                   int(SpvMemoryAccessAlignedMask),
                               4, 3})},
                               4, 3})},
-            {"OpStore %1 %2 MakePointerAvailableKHR|NonPrivatePointerKHR %3\n",
+            {"OpStore %1 %2 MakePointerAvailable|NonPrivatePointer %3\n",
              MakeInstruction(SpvOpStore,
              MakeInstruction(SpvOpStore,
                              {1, 2,
                              {1, 2,
                               int(SpvMemoryAccessMakePointerAvailableKHRMask) |
                               int(SpvMemoryAccessMakePointerAvailableKHRMask) |
                                   int(SpvMemoryAccessNonPrivatePointerKHRMask),
                                   int(SpvMemoryAccessNonPrivatePointerKHRMask),
                               3})},
                               3})},
-            {"%2 = OpLoad %1 %3 MakePointerVisibleKHR %4\n",
+            {"%2 = OpLoad %1 %3 MakePointerVisible %4\n",
              MakeInstruction(SpvOpLoad,
              MakeInstruction(SpvOpLoad,
                              {1, 2, 3, SpvMemoryAccessMakePointerVisibleKHRMask,
                              {1, 2, 3, SpvMemoryAccessMakePointerVisibleKHRMask,
                               4})},
                               4})},
-            {"%2 = OpLoad %1 %3 Volatile|MakePointerVisibleKHR %4\n",
+            {"%2 = OpLoad %1 %3 Volatile|MakePointerVisible %4\n",
              MakeInstruction(SpvOpLoad,
              MakeInstruction(SpvOpLoad,
                              {1, 2, 3,
                              {1, 2, 3,
                               int(SpvMemoryAccessMakePointerVisibleKHRMask) |
                               int(SpvMemoryAccessMakePointerVisibleKHRMask) |
                                   int(SpvMemoryAccessVolatileMask),
                                   int(SpvMemoryAccessVolatileMask),
                               4})},
                               4})},
-            {"%2 = OpLoad %1 %3 Aligned|MakePointerVisibleKHR 8 %4\n",
+            {"%2 = OpLoad %1 %3 Aligned|MakePointerVisible 8 %4\n",
              MakeInstruction(SpvOpLoad,
              MakeInstruction(SpvOpLoad,
                              {1, 2, 3,
                              {1, 2, 3,
                               int(SpvMemoryAccessMakePointerVisibleKHRMask) |
                               int(SpvMemoryAccessMakePointerVisibleKHRMask) |
                                   int(SpvMemoryAccessAlignedMask),
                                   int(SpvMemoryAccessAlignedMask),
                               8, 4})},
                               8, 4})},
-            {"%2 = OpLoad %1 %3 MakePointerVisibleKHR|NonPrivatePointerKHR "
+            {"%2 = OpLoad %1 %3 MakePointerVisible|NonPrivatePointer "
              "%4\n",
              "%4\n",
              MakeInstruction(SpvOpLoad,
              MakeInstruction(SpvOpLoad,
                              {1, 2, 3,
                              {1, 2, 3,
@@ -582,9 +582,9 @@ INSTANTIATE_TEST_SUITE_P(
                                   int(SpvMemoryAccessNonPrivatePointerKHRMask),
                                   int(SpvMemoryAccessNonPrivatePointerKHRMask),
                               4})},
                               4})},
             {"OpCopyMemory %1 %2 "
             {"OpCopyMemory %1 %2 "
-             "MakePointerAvailableKHR|"
-             "MakePointerVisibleKHR|"
-             "NonPrivatePointerKHR "
+             "MakePointerAvailable|"
+             "MakePointerVisible|"
+             "NonPrivatePointer "
              "%3 %4\n",
              "%3 %4\n",
              MakeInstruction(SpvOpCopyMemory,
              MakeInstruction(SpvOpCopyMemory,
                              {1, 2,
                              {1, 2,
@@ -593,9 +593,9 @@ INSTANTIATE_TEST_SUITE_P(
                                int(SpvMemoryAccessNonPrivatePointerKHRMask)),
                                int(SpvMemoryAccessNonPrivatePointerKHRMask)),
                               3, 4})},
                               3, 4})},
             {"OpCopyMemorySized %1 %2 %3 "
             {"OpCopyMemorySized %1 %2 %3 "
-             "MakePointerAvailableKHR|"
-             "MakePointerVisibleKHR|"
-             "NonPrivatePointerKHR "
+             "MakePointerAvailable|"
+             "MakePointerVisible|"
+             "NonPrivatePointer "
              "%4 %5\n",
              "%4 %5\n",
              MakeInstruction(SpvOpCopyMemorySized,
              MakeInstruction(SpvOpCopyMemorySized,
                              {1, 2, 3,
                              {1, 2, 3,
@@ -604,12 +604,12 @@ INSTANTIATE_TEST_SUITE_P(
                                int(SpvMemoryAccessNonPrivatePointerKHRMask)),
                                int(SpvMemoryAccessNonPrivatePointerKHRMask)),
                               4, 5})},
                               4, 5})},
             // Image operands
             // Image operands
-            {"OpImageWrite %1 %2 %3 MakeTexelAvailableKHR "
+            {"OpImageWrite %1 %2 %3 MakeTexelAvailable "
              "%4\n",
              "%4\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpImageWrite,
                  SpvOpImageWrite,
                  {1, 2, 3, int(SpvImageOperandsMakeTexelAvailableKHRMask), 4})},
                  {1, 2, 3, int(SpvImageOperandsMakeTexelAvailableKHRMask), 4})},
-            {"OpImageWrite %1 %2 %3 MakeTexelAvailableKHR|NonPrivateTexelKHR "
+            {"OpImageWrite %1 %2 %3 MakeTexelAvailable|NonPrivateTexel "
              "%4\n",
              "%4\n",
              MakeInstruction(SpvOpImageWrite,
              MakeInstruction(SpvOpImageWrite,
                              {1, 2, 3,
                              {1, 2, 3,
@@ -617,7 +617,7 @@ INSTANTIATE_TEST_SUITE_P(
                                   int(SpvImageOperandsNonPrivateTexelKHRMask),
                                   int(SpvImageOperandsNonPrivateTexelKHRMask),
                               4})},
                               4})},
             {"OpImageWrite %1 %2 %3 "
             {"OpImageWrite %1 %2 %3 "
-             "MakeTexelAvailableKHR|NonPrivateTexelKHR|VolatileTexelKHR "
+             "MakeTexelAvailable|NonPrivateTexel|VolatileTexel "
              "%4\n",
              "%4\n",
              MakeInstruction(SpvOpImageWrite,
              MakeInstruction(SpvOpImageWrite,
                              {1, 2, 3,
                              {1, 2, 3,
@@ -625,14 +625,14 @@ INSTANTIATE_TEST_SUITE_P(
                                   int(SpvImageOperandsNonPrivateTexelKHRMask) |
                                   int(SpvImageOperandsNonPrivateTexelKHRMask) |
                                   int(SpvImageOperandsVolatileTexelKHRMask),
                                   int(SpvImageOperandsVolatileTexelKHRMask),
                               4})},
                               4})},
-            {"%2 = OpImageRead %1 %3 %4 MakeTexelVisibleKHR "
+            {"%2 = OpImageRead %1 %3 %4 MakeTexelVisible "
              "%5\n",
              "%5\n",
              MakeInstruction(SpvOpImageRead,
              MakeInstruction(SpvOpImageRead,
                              {1, 2, 3, 4,
                              {1, 2, 3, 4,
                               int(SpvImageOperandsMakeTexelVisibleKHRMask),
                               int(SpvImageOperandsMakeTexelVisibleKHRMask),
                               5})},
                               5})},
             {"%2 = OpImageRead %1 %3 %4 "
             {"%2 = OpImageRead %1 %3 %4 "
-             "MakeTexelVisibleKHR|NonPrivateTexelKHR "
+             "MakeTexelVisible|NonPrivateTexel "
              "%5\n",
              "%5\n",
              MakeInstruction(SpvOpImageRead,
              MakeInstruction(SpvOpImageRead,
                              {1, 2, 3, 4,
                              {1, 2, 3, 4,
@@ -640,7 +640,7 @@ INSTANTIATE_TEST_SUITE_P(
                                   int(SpvImageOperandsNonPrivateTexelKHRMask),
                                   int(SpvImageOperandsNonPrivateTexelKHRMask),
                               5})},
                               5})},
             {"%2 = OpImageRead %1 %3 %4 "
             {"%2 = OpImageRead %1 %3 %4 "
-             "MakeTexelVisibleKHR|NonPrivateTexelKHR|VolatileTexelKHR "
+             "MakeTexelVisible|NonPrivateTexel|VolatileTexel "
              "%5\n",
              "%5\n",
              MakeInstruction(SpvOpImageRead,
              MakeInstruction(SpvOpImageRead,
                              {1, 2, 3, 4,
                              {1, 2, 3, 4,
@@ -826,82 +826,82 @@ INSTANTIATE_TEST_SUITE_P(
              MakeInstruction(SpvOpExtension,
              MakeInstruction(SpvOpExtension,
                              MakeVector("SPV_EXT_descriptor_indexing"))},
                              MakeVector("SPV_EXT_descriptor_indexing"))},
             // Check capabilities, by name
             // Check capabilities, by name
-            {"OpCapability ShaderNonUniformEXT\n",
+            {"OpCapability ShaderNonUniform\n",
              MakeInstruction(SpvOpCapability,
              MakeInstruction(SpvOpCapability,
                              {SpvCapabilityShaderNonUniformEXT})},
                              {SpvCapabilityShaderNonUniformEXT})},
-            {"OpCapability RuntimeDescriptorArrayEXT\n",
+            {"OpCapability RuntimeDescriptorArray\n",
              MakeInstruction(SpvOpCapability,
              MakeInstruction(SpvOpCapability,
                              {SpvCapabilityRuntimeDescriptorArrayEXT})},
                              {SpvCapabilityRuntimeDescriptorArrayEXT})},
-            {"OpCapability InputAttachmentArrayDynamicIndexingEXT\n",
+            {"OpCapability InputAttachmentArrayDynamicIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityInputAttachmentArrayDynamicIndexingEXT})},
                  {SpvCapabilityInputAttachmentArrayDynamicIndexingEXT})},
-            {"OpCapability UniformTexelBufferArrayDynamicIndexingEXT\n",
+            {"OpCapability UniformTexelBufferArrayDynamicIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT})},
                  {SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT})},
-            {"OpCapability StorageTexelBufferArrayDynamicIndexingEXT\n",
+            {"OpCapability StorageTexelBufferArrayDynamicIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT})},
                  {SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT})},
-            {"OpCapability UniformBufferArrayNonUniformIndexingEXT\n",
+            {"OpCapability UniformBufferArrayNonUniformIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityUniformBufferArrayNonUniformIndexingEXT})},
                  {SpvCapabilityUniformBufferArrayNonUniformIndexingEXT})},
-            {"OpCapability SampledImageArrayNonUniformIndexingEXT\n",
+            {"OpCapability SampledImageArrayNonUniformIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilitySampledImageArrayNonUniformIndexingEXT})},
                  {SpvCapabilitySampledImageArrayNonUniformIndexingEXT})},
-            {"OpCapability StorageBufferArrayNonUniformIndexingEXT\n",
+            {"OpCapability StorageBufferArrayNonUniformIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityStorageBufferArrayNonUniformIndexingEXT})},
                  {SpvCapabilityStorageBufferArrayNonUniformIndexingEXT})},
-            {"OpCapability StorageImageArrayNonUniformIndexingEXT\n",
+            {"OpCapability StorageImageArrayNonUniformIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityStorageImageArrayNonUniformIndexingEXT})},
                  {SpvCapabilityStorageImageArrayNonUniformIndexingEXT})},
-            {"OpCapability InputAttachmentArrayNonUniformIndexingEXT\n",
+            {"OpCapability InputAttachmentArrayNonUniformIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT})},
                  {SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT})},
-            {"OpCapability UniformTexelBufferArrayNonUniformIndexingEXT\n",
+            {"OpCapability UniformTexelBufferArrayNonUniformIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT})},
                  {SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT})},
-            {"OpCapability StorageTexelBufferArrayNonUniformIndexingEXT\n",
+            {"OpCapability StorageTexelBufferArrayNonUniformIndexing\n",
              MakeInstruction(
              MakeInstruction(
                  SpvOpCapability,
                  SpvOpCapability,
                  {SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT})},
                  {SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT})},
             // Check capabilities, by number
             // Check capabilities, by number
-            {"OpCapability ShaderNonUniformEXT\n",
+            {"OpCapability ShaderNonUniform\n",
              MakeInstruction(SpvOpCapability, {5301})},
              MakeInstruction(SpvOpCapability, {5301})},
-            {"OpCapability RuntimeDescriptorArrayEXT\n",
+            {"OpCapability RuntimeDescriptorArray\n",
              MakeInstruction(SpvOpCapability, {5302})},
              MakeInstruction(SpvOpCapability, {5302})},
-            {"OpCapability InputAttachmentArrayDynamicIndexingEXT\n",
+            {"OpCapability InputAttachmentArrayDynamicIndexing\n",
              MakeInstruction(SpvOpCapability, {5303})},
              MakeInstruction(SpvOpCapability, {5303})},
-            {"OpCapability UniformTexelBufferArrayDynamicIndexingEXT\n",
+            {"OpCapability UniformTexelBufferArrayDynamicIndexing\n",
              MakeInstruction(SpvOpCapability, {5304})},
              MakeInstruction(SpvOpCapability, {5304})},
-            {"OpCapability StorageTexelBufferArrayDynamicIndexingEXT\n",
+            {"OpCapability StorageTexelBufferArrayDynamicIndexing\n",
              MakeInstruction(SpvOpCapability, {5305})},
              MakeInstruction(SpvOpCapability, {5305})},
-            {"OpCapability UniformBufferArrayNonUniformIndexingEXT\n",
+            {"OpCapability UniformBufferArrayNonUniformIndexing\n",
              MakeInstruction(SpvOpCapability, {5306})},
              MakeInstruction(SpvOpCapability, {5306})},
-            {"OpCapability SampledImageArrayNonUniformIndexingEXT\n",
+            {"OpCapability SampledImageArrayNonUniformIndexing\n",
              MakeInstruction(SpvOpCapability, {5307})},
              MakeInstruction(SpvOpCapability, {5307})},
-            {"OpCapability StorageBufferArrayNonUniformIndexingEXT\n",
+            {"OpCapability StorageBufferArrayNonUniformIndexing\n",
              MakeInstruction(SpvOpCapability, {5308})},
              MakeInstruction(SpvOpCapability, {5308})},
-            {"OpCapability StorageImageArrayNonUniformIndexingEXT\n",
+            {"OpCapability StorageImageArrayNonUniformIndexing\n",
              MakeInstruction(SpvOpCapability, {5309})},
              MakeInstruction(SpvOpCapability, {5309})},
-            {"OpCapability InputAttachmentArrayNonUniformIndexingEXT\n",
+            {"OpCapability InputAttachmentArrayNonUniformIndexing\n",
              MakeInstruction(SpvOpCapability, {5310})},
              MakeInstruction(SpvOpCapability, {5310})},
-            {"OpCapability UniformTexelBufferArrayNonUniformIndexingEXT\n",
+            {"OpCapability UniformTexelBufferArrayNonUniformIndexing\n",
              MakeInstruction(SpvOpCapability, {5311})},
              MakeInstruction(SpvOpCapability, {5311})},
-            {"OpCapability StorageTexelBufferArrayNonUniformIndexingEXT\n",
+            {"OpCapability StorageTexelBufferArrayNonUniformIndexing\n",
              MakeInstruction(SpvOpCapability, {5312})},
              MakeInstruction(SpvOpCapability, {5312})},
 
 
             // Check the decoration token
             // Check the decoration token
-            {"OpDecorate %1 NonUniformEXT\n",
+            {"OpDecorate %1 NonUniform\n",
              MakeInstruction(SpvOpDecorate, {1, SpvDecorationNonUniformEXT})},
              MakeInstruction(SpvOpDecorate, {1, SpvDecorationNonUniformEXT})},
-            {"OpDecorate %1 NonUniformEXT\n",
+            {"OpDecorate %1 NonUniform\n",
              MakeInstruction(SpvOpDecorate, {1, 5300})},
              MakeInstruction(SpvOpDecorate, {1, 5300})},
         })));
         })));
 
 

+ 14 - 14
3rdparty/spirv-tools/test/text_to_binary.memory_test.cpp

@@ -212,7 +212,7 @@ TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessNontemporalGood) {
 }
 }
 
 
 TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessAvGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessAvGood) {
-  std::string spirv = "OpCopyMemory %1 %2 MakePointerAvailableKHR %3\n";
+  std::string spirv = "OpCopyMemory %1 %2 MakePointerAvailable %3\n";
   EXPECT_THAT(CompiledInstructions(spirv),
   EXPECT_THAT(CompiledInstructions(spirv),
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 8, 3})));
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 8, 3})));
   std::string disassembly =
   std::string disassembly =
@@ -221,7 +221,7 @@ TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessAvGood) {
 }
 }
 
 
 TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessVisGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessVisGood) {
-  std::string spirv = "OpCopyMemory %1 %2 MakePointerVisibleKHR %3\n";
+  std::string spirv = "OpCopyMemory %1 %2 MakePointerVisible %3\n";
   EXPECT_THAT(CompiledInstructions(spirv),
   EXPECT_THAT(CompiledInstructions(spirv),
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 16, 3})));
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 16, 3})));
   std::string disassembly =
   std::string disassembly =
@@ -230,7 +230,7 @@ TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessVisGood) {
 }
 }
 
 
 TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessNonPrivateGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessNonPrivateGood) {
-  std::string spirv = "OpCopyMemory %1 %2 NonPrivatePointerKHR\n";
+  std::string spirv = "OpCopyMemory %1 %2 NonPrivatePointer\n";
   EXPECT_THAT(CompiledInstructions(spirv),
   EXPECT_THAT(CompiledInstructions(spirv),
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 32})));
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 32})));
   std::string disassembly =
   std::string disassembly =
@@ -241,8 +241,8 @@ TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessNonPrivateGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessMixedGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessMixedGood) {
   std::string spirv =
   std::string spirv =
       "OpCopyMemory %1 %2 "
       "OpCopyMemory %1 %2 "
-      "Volatile|Aligned|Nontemporal|MakePointerAvailableKHR|"
-      "MakePointerVisibleKHR|NonPrivatePointerKHR 16 %3 %4\n";
+      "Volatile|Aligned|Nontemporal|MakePointerAvailable|"
+      "MakePointerVisible|NonPrivatePointer 16 %3 %4\n";
   EXPECT_THAT(CompiledInstructions(spirv),
   EXPECT_THAT(CompiledInstructions(spirv),
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 63, 16, 3, 4})));
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 63, 16, 3, 4})));
   std::string disassembly =
   std::string disassembly =
@@ -272,8 +272,8 @@ TEST_F(MemoryRoundTripTest, OpCopyMemoryTwoAccessV14Good) {
 TEST_F(MemoryRoundTripTest, OpCopyMemoryTwoAccessMixedV14Good) {
 TEST_F(MemoryRoundTripTest, OpCopyMemoryTwoAccessMixedV14Good) {
   std::string spirv =
   std::string spirv =
       "OpCopyMemory %1 %2 Volatile|Nontemporal|"
       "OpCopyMemory %1 %2 Volatile|Nontemporal|"
-      "MakePointerVisibleKHR %3 "
-      "Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 16 %4\n";
+      "MakePointerVisible %3 "
+      "Aligned|MakePointerAvailable|NonPrivatePointer 16 %4\n";
   EXPECT_THAT(CompiledInstructions(spirv),
   EXPECT_THAT(CompiledInstructions(spirv),
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 21, 3, 42, 16, 4})));
               Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 21, 3, 42, 16, 4})));
   std::string disassembly =
   std::string disassembly =
@@ -341,7 +341,7 @@ TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessNontemporalGood) {
 }
 }
 
 
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessAvGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessAvGood) {
-  std::string spirv = "OpCopyMemorySized %1 %2 %3 MakePointerAvailableKHR %4\n";
+  std::string spirv = "OpCopyMemorySized %1 %2 %3 MakePointerAvailable %4\n";
   EXPECT_THAT(CompiledInstructions(spirv),
   EXPECT_THAT(CompiledInstructions(spirv),
               Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 8, 4})));
               Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 8, 4})));
   std::string disassembly =
   std::string disassembly =
@@ -350,7 +350,7 @@ TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessAvGood) {
 }
 }
 
 
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessVisGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessVisGood) {
-  std::string spirv = "OpCopyMemorySized %1 %2 %3 MakePointerVisibleKHR %4\n";
+  std::string spirv = "OpCopyMemorySized %1 %2 %3 MakePointerVisible %4\n";
   EXPECT_THAT(CompiledInstructions(spirv),
   EXPECT_THAT(CompiledInstructions(spirv),
               Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 16, 4})));
               Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 16, 4})));
   std::string disassembly =
   std::string disassembly =
@@ -359,7 +359,7 @@ TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessVisGood) {
 }
 }
 
 
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessNonPrivateGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessNonPrivateGood) {
-  std::string spirv = "OpCopyMemorySized %1 %2 %3 NonPrivatePointerKHR\n";
+  std::string spirv = "OpCopyMemorySized %1 %2 %3 NonPrivatePointer\n";
   EXPECT_THAT(CompiledInstructions(spirv),
   EXPECT_THAT(CompiledInstructions(spirv),
               Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 32})));
               Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 32})));
   std::string disassembly =
   std::string disassembly =
@@ -370,8 +370,8 @@ TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessNonPrivateGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessMixedGood) {
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessMixedGood) {
   std::string spirv =
   std::string spirv =
       "OpCopyMemorySized %1 %2 %3 "
       "OpCopyMemorySized %1 %2 %3 "
-      "Volatile|Aligned|Nontemporal|MakePointerAvailableKHR|"
-      "MakePointerVisibleKHR|NonPrivatePointerKHR 16 %4 %5\n";
+      "Volatile|Aligned|Nontemporal|MakePointerAvailable|"
+      "MakePointerVisible|NonPrivatePointer 16 %4 %5\n";
   EXPECT_THAT(
   EXPECT_THAT(
       CompiledInstructions(spirv),
       CompiledInstructions(spirv),
       Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 63, 16, 4, 5})));
       Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 63, 16, 4, 5})));
@@ -402,8 +402,8 @@ TEST_F(MemoryRoundTripTest, OpCopyMemorySizedTwoAccessV14Good) {
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedTwoAccessMixedV14Good) {
 TEST_F(MemoryRoundTripTest, OpCopyMemorySizedTwoAccessMixedV14Good) {
   std::string spirv =
   std::string spirv =
       "OpCopyMemorySized %1 %2 %3 Volatile|Nontemporal|"
       "OpCopyMemorySized %1 %2 %3 Volatile|Nontemporal|"
-      "MakePointerVisibleKHR %4 "
-      "Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 16 %5\n";
+      "MakePointerVisible %4 "
+      "Aligned|MakePointerAvailable|NonPrivatePointer 16 %5\n";
   EXPECT_THAT(
   EXPECT_THAT(
       CompiledInstructions(spirv),
       CompiledInstructions(spirv),
       Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 21, 4, 42, 16, 5})));
       Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 21, 4, 42, 16, 5})));

+ 3 - 3
3rdparty/spirv-tools/test/tools/expect.py

@@ -270,8 +270,8 @@ class ValidObjectFile1_3(ReturnCodeIsZero, CorrectObjectFilePreamble):
     return True, ''
     return True, ''
 
 
 
 
-class ValidObjectFile1_4(ReturnCodeIsZero, CorrectObjectFilePreamble):
-  """Mixin class for checking that every input file generates a valid SPIR-V 1.4
+class ValidObjectFile1_5(ReturnCodeIsZero, CorrectObjectFilePreamble):
+  """Mixin class for checking that every input file generates a valid SPIR-V 1.5
     object file following the object file naming rule, and there is no output on
     object file following the object file naming rule, and there is no output on
     stdout/stderr."""
     stdout/stderr."""
 
 
@@ -279,7 +279,7 @@ class ValidObjectFile1_4(ReturnCodeIsZero, CorrectObjectFilePreamble):
     for input_filename in status.input_filenames:
     for input_filename in status.input_filenames:
       object_filename = get_object_filename(input_filename)
       object_filename = get_object_filename(input_filename)
       success, message = self.verify_object_file_preamble(
       success, message = self.verify_object_file_preamble(
-          os.path.join(status.directory, object_filename), 0x10400)
+          os.path.join(status.directory, object_filename), 0x10500)
       if not success:
       if not success:
         return False, message
         return False, message
     return True, ''
     return True, ''

+ 9 - 9
3rdparty/spirv-tools/test/tools/opt/flags.py

@@ -34,7 +34,7 @@ def empty_main_assembly():
 
 
 
 
 @inside_spirv_testsuite('SpirvOptBase')
 @inside_spirv_testsuite('SpirvOptBase')
-class TestAssemblyFileAsOnlyParameter(expect.ValidObjectFile1_4):
+class TestAssemblyFileAsOnlyParameter(expect.ValidObjectFile1_5):
   """Tests that spirv-opt accepts a SPIR-V object file."""
   """Tests that spirv-opt accepts a SPIR-V object file."""
 
 
   shader = placeholder.FileSPIRVShader(empty_main_assembly(), '.spvasm')
   shader = placeholder.FileSPIRVShader(empty_main_assembly(), '.spvasm')
@@ -52,7 +52,7 @@ class TestHelpFlag(expect.ReturnCodeIsZero, expect.StdoutMatch):
 
 
 
 
 @inside_spirv_testsuite('SpirvOptFlags')
 @inside_spirv_testsuite('SpirvOptFlags')
-class TestValidPassFlags(expect.ValidObjectFile1_4,
+class TestValidPassFlags(expect.ValidObjectFile1_5,
                          expect.ExecutedListOfPasses):
                          expect.ExecutedListOfPasses):
   """Tests that spirv-opt accepts all valid optimization flags."""
   """Tests that spirv-opt accepts all valid optimization flags."""
 
 
@@ -91,7 +91,7 @@ class TestValidPassFlags(expect.ValidObjectFile1_4,
       'eliminate-dead-variables',
       'eliminate-dead-variables',
       # --eliminate-insert-extract runs the simplify-instructions pass.
       # --eliminate-insert-extract runs the simplify-instructions pass.
       'simplify-instructions',
       'simplify-instructions',
-      'eliminate-local-multi-store',
+      'ssa-rewrite',
       'eliminate-local-single-block',
       'eliminate-local-single-block',
       'eliminate-local-single-store',
       'eliminate-local-single-store',
       'flatten-decorations',
       'flatten-decorations',
@@ -129,7 +129,7 @@ class TestValidPassFlags(expect.ValidObjectFile1_4,
 
 
 
 
 @inside_spirv_testsuite('SpirvOptFlags')
 @inside_spirv_testsuite('SpirvOptFlags')
-class TestPerformanceOptimizationPasses(expect.ValidObjectFile1_4,
+class TestPerformanceOptimizationPasses(expect.ValidObjectFile1_5,
                                         expect.ExecutedListOfPasses):
                                         expect.ExecutedListOfPasses):
   """Tests that spirv-opt schedules all the passes triggered by -O."""
   """Tests that spirv-opt schedules all the passes triggered by -O."""
 
 
@@ -149,7 +149,7 @@ class TestPerformanceOptimizationPasses(expect.ValidObjectFile1_4,
       'eliminate-local-single-block',
       'eliminate-local-single-block',
       'eliminate-local-single-store',
       'eliminate-local-single-store',
       'eliminate-dead-code-aggressive',
       'eliminate-dead-code-aggressive',
-      'eliminate-local-multi-store',
+      'ssa-rewrite',
       'eliminate-dead-code-aggressive',
       'eliminate-dead-code-aggressive',
       'ccp',
       'ccp',
       'eliminate-dead-code-aggressive',
       'eliminate-dead-code-aggressive',
@@ -177,7 +177,7 @@ class TestPerformanceOptimizationPasses(expect.ValidObjectFile1_4,
 
 
 
 
 @inside_spirv_testsuite('SpirvOptFlags')
 @inside_spirv_testsuite('SpirvOptFlags')
-class TestSizeOptimizationPasses(expect.ValidObjectFile1_4,
+class TestSizeOptimizationPasses(expect.ValidObjectFile1_5,
                                  expect.ExecutedListOfPasses):
                                  expect.ExecutedListOfPasses):
   """Tests that spirv-opt schedules all the passes triggered by -Os."""
   """Tests that spirv-opt schedules all the passes triggered by -Os."""
 
 
@@ -196,7 +196,7 @@ class TestSizeOptimizationPasses(expect.ValidObjectFile1_4,
       'eliminate-dead-code-aggressive',
       'eliminate-dead-code-aggressive',
       'simplify-instructions',
       'simplify-instructions',
       'eliminate-dead-inserts',
       'eliminate-dead-inserts',
-      'eliminate-local-multi-store',
+      'ssa-rewrite',
       'eliminate-dead-code-aggressive',
       'eliminate-dead-code-aggressive',
       'ccp',
       'ccp',
       'eliminate-dead-code-aggressive',
       'eliminate-dead-code-aggressive',
@@ -217,7 +217,7 @@ class TestSizeOptimizationPasses(expect.ValidObjectFile1_4,
 
 
 
 
 @inside_spirv_testsuite('SpirvOptFlags')
 @inside_spirv_testsuite('SpirvOptFlags')
-class TestLegalizationPasses(expect.ValidObjectFile1_4,
+class TestLegalizationPasses(expect.ValidObjectFile1_5,
                              expect.ExecutedListOfPasses):
                              expect.ExecutedListOfPasses):
   """Tests that spirv-opt schedules all the passes triggered by --legalize-hlsl.
   """Tests that spirv-opt schedules all the passes triggered by --legalize-hlsl.
   """
   """
@@ -238,7 +238,7 @@ class TestLegalizationPasses(expect.ValidObjectFile1_4,
       'eliminate-local-single-block',
       'eliminate-local-single-block',
       'eliminate-local-single-store',
       'eliminate-local-single-store',
       'eliminate-dead-code-aggressive',
       'eliminate-dead-code-aggressive',
-      'eliminate-local-multi-store',
+      'ssa-rewrite',
       'eliminate-dead-code-aggressive',
       'eliminate-dead-code-aggressive',
       'ccp',
       'ccp',
       'loop-unroll',
       'loop-unroll',

+ 7 - 1
3rdparty/spirv-tools/test/val/CMakeLists.txt

@@ -28,7 +28,6 @@ add_spvtools_unittest(TARGET val_abcde
        val_barriers_test.cpp
        val_barriers_test.cpp
        val_bitwise_test.cpp
        val_bitwise_test.cpp
        val_builtins_test.cpp
        val_builtins_test.cpp
-       val_capability_test.cpp
        val_cfg_test.cpp
        val_cfg_test.cpp
        val_composites_test.cpp
        val_composites_test.cpp
        val_constants_test.cpp
        val_constants_test.cpp
@@ -44,6 +43,13 @@ add_spvtools_unittest(TARGET val_abcde
   PCH_FILE pch_test_val
   PCH_FILE pch_test_val
 )
 )
 
 
+add_spvtools_unittest(TARGET val_capability
+  SRCS
+       val_capability_test.cpp
+  LIBS ${SPIRV_TOOLS}
+  PCH_FILE pch_test_val
+)
+
 add_spvtools_unittest(TARGET val_limits
 add_spvtools_unittest(TARGET val_limits
   SRCS val_limits_test.cpp
   SRCS val_limits_test.cpp
        ${VAL_TEST_COMMON_SRCS}
        ${VAL_TEST_COMMON_SRCS}

+ 2 - 2
3rdparty/spirv-tools/test/val/val_adjacency_test.cpp

@@ -144,7 +144,7 @@ OpBranch %end_label
 %false_label = OpLabel
 %false_label = OpLabel
 OpBranch %end_label
 OpBranch %end_label
 %end_label = OpLabel
 %end_label = OpLabel
-%line = OpLine %string 0 0
+OpLine %string 0 0
 %result = OpPhi %bool %true %true_label %false %false_label
 %result = OpPhi %bool %true %true_label %false %false_label
 )";
 )";
 
 
@@ -178,7 +178,7 @@ OpBranch %end_label
 %false_label = OpLabel
 %false_label = OpLabel
 OpBranch %end_label
 OpBranch %end_label
 %end_label = OpLabel
 %end_label = OpLabel
-%line = OpLine %string 0 0
+OpLine %string 0 0
 %result = OpPhi %bool %true %true_label %false %false_label
 %result = OpPhi %bool %true %true_label %false %false_label
 )";
 )";
 
 

+ 9 - 9
3rdparty/spirv-tools/test/val/val_atomics_test.cpp

@@ -708,7 +708,7 @@ OpAtomicStore %f32_var %device %relaxed %u32_1
 
 
 TEST_F(ValidateAtomics, AtomicExchangeShaderSuccess) {
 TEST_F(ValidateAtomics, AtomicExchangeShaderSuccess) {
   const std::string body = R"(
   const std::string body = R"(
-%val1 = OpAtomicStore %u32_var %device %relaxed %u32_1
+OpAtomicStore %u32_var %device %relaxed %u32_1
 %val2 = OpAtomicExchange %u32 %u32_var %device %relaxed %u32_0
 %val2 = OpAtomicExchange %u32 %u32_var %device %relaxed %u32_0
 )";
 )";
 
 
@@ -720,7 +720,7 @@ TEST_F(ValidateAtomics, AtomicExchangeKernelSuccess) {
   const std::string body = R"(
   const std::string body = R"(
 OpAtomicStore %f32_var %device %relaxed %f32_1
 OpAtomicStore %f32_var %device %relaxed %f32_1
 %val2 = OpAtomicExchange %f32 %f32_var %device %relaxed %f32_0
 %val2 = OpAtomicExchange %f32 %f32_var %device %relaxed %f32_0
-%val3 = OpAtomicStore %u32_var %device %relaxed %u32_1
+OpAtomicStore %u32_var %device %relaxed %u32_1
 %val4 = OpAtomicExchange %u32 %u32_var %device %relaxed %u32_0
 %val4 = OpAtomicExchange %u32 %u32_var %device %relaxed %u32_0
 )";
 )";
 
 
@@ -743,7 +743,7 @@ OpAtomicStore %f32_var %device %relaxed %f32_1
 
 
 TEST_F(ValidateAtomics, AtomicExchangeWrongResultType) {
 TEST_F(ValidateAtomics, AtomicExchangeWrongResultType) {
   const std::string body = R"(
   const std::string body = R"(
-%val1 = OpStore %f32vec4_var %f32vec4_0000
+OpStore %f32vec4_var %f32vec4_0000
 %val2 = OpAtomicExchange %f32vec4 %f32vec4_var %device %relaxed %f32vec4_0000
 %val2 = OpAtomicExchange %f32vec4 %f32vec4_var %device %relaxed %f32vec4_0000
 )";
 )";
 
 
@@ -768,7 +768,7 @@ TEST_F(ValidateAtomics, AtomicExchangeWrongPointerType) {
 
 
 TEST_F(ValidateAtomics, AtomicExchangeWrongPointerDataType) {
 TEST_F(ValidateAtomics, AtomicExchangeWrongPointerDataType) {
   const std::string body = R"(
   const std::string body = R"(
-%val1 = OpStore %f32vec4_var %f32vec4_0000
+OpStore %f32vec4_var %f32vec4_0000
 %val2 = OpAtomicExchange %f32 %f32vec4_var %device %relaxed %f32vec4_0000
 %val2 = OpAtomicExchange %f32 %f32vec4_var %device %relaxed %f32vec4_0000
 )";
 )";
 
 
@@ -822,7 +822,7 @@ OpAtomicStore %f32_var %device %relaxed %f32_1
 
 
 TEST_F(ValidateAtomics, AtomicCompareExchangeShaderSuccess) {
 TEST_F(ValidateAtomics, AtomicCompareExchangeShaderSuccess) {
   const std::string body = R"(
   const std::string body = R"(
-%val1 = OpAtomicStore %u32_var %device %relaxed %u32_1
+OpAtomicStore %u32_var %device %relaxed %u32_1
 %val2 = OpAtomicCompareExchange %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0
 %val2 = OpAtomicCompareExchange %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0
 )";
 )";
 
 
@@ -834,7 +834,7 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeKernelSuccess) {
   const std::string body = R"(
   const std::string body = R"(
 OpAtomicStore %f32_var %device %relaxed %f32_1
 OpAtomicStore %f32_var %device %relaxed %f32_1
 %val2 = OpAtomicCompareExchange %f32 %f32_var %device %relaxed %relaxed %f32_0 %f32_1
 %val2 = OpAtomicCompareExchange %f32 %f32_var %device %relaxed %relaxed %f32_0 %f32_1
-%val3 = OpAtomicStore %u32_var %device %relaxed %u32_1
+OpAtomicStore %u32_var %device %relaxed %u32_1
 %val4 = OpAtomicCompareExchange %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0
 %val4 = OpAtomicCompareExchange %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0
 )";
 )";
 
 
@@ -857,7 +857,7 @@ OpAtomicStore %f32_var %device %relaxed %f32_1
 
 
 TEST_F(ValidateAtomics, AtomicCompareExchangeWrongResultType) {
 TEST_F(ValidateAtomics, AtomicCompareExchangeWrongResultType) {
   const std::string body = R"(
   const std::string body = R"(
-%val1 = OpStore %f32vec4_var %f32vec4_0000
+OpStore %f32vec4_var %f32vec4_0000
 %val2 = OpAtomicCompareExchange %f32vec4 %f32vec4_var %device %relaxed %relaxed %f32vec4_0000 %f32vec4_0000
 %val2 = OpAtomicCompareExchange %f32vec4 %f32vec4_var %device %relaxed %relaxed %f32vec4_0000 %f32vec4_0000
 )";
 )";
 
 
@@ -882,7 +882,7 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongPointerType) {
 
 
 TEST_F(ValidateAtomics, AtomicCompareExchangeWrongPointerDataType) {
 TEST_F(ValidateAtomics, AtomicCompareExchangeWrongPointerDataType) {
   const std::string body = R"(
   const std::string body = R"(
-%val1 = OpStore %f32vec4_var %f32vec4_0000
+OpStore %f32vec4_var %f32vec4_0000
 %val2 = OpAtomicCompareExchange %f32 %f32vec4_var %device %relaxed %relaxed %f32_0 %f32_1
 %val2 = OpAtomicCompareExchange %f32 %f32vec4_var %device %relaxed %relaxed %f32_0 %f32_1
 )";
 )";
 
 
@@ -975,7 +975,7 @@ OpAtomicStore %f32_var %device %relaxed %f32_1
 
 
 TEST_F(ValidateAtomics, AtomicCompareExchangeWeakSuccess) {
 TEST_F(ValidateAtomics, AtomicCompareExchangeWeakSuccess) {
   const std::string body = R"(
   const std::string body = R"(
-%val3 = OpAtomicStore %u32_var %device %relaxed %u32_1
+OpAtomicStore %u32_var %device %relaxed %u32_1
 %val4 = OpAtomicCompareExchangeWeak %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0
 %val4 = OpAtomicCompareExchangeWeak %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0
 )";
 )";
 
 

+ 75 - 3
3rdparty/spirv-tools/test/val/val_builtins_test.cpp

@@ -2330,9 +2330,9 @@ OpDecorate %copy BuiltIn WorkgroupSize
 
 
   CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
   CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
   ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
   ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("Vulkan spec requires BuiltIn WorkgroupSize to be a "
-                        "constant. ID <2> (OpCopyObject) is not a constant"));
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("BuiltIns can only target variables, structs or constants"));
 }
 }
 
 
 CodeGenerator GetWorkgroupSizeNotVectorGenerator(spv_target_env env) {
 CodeGenerator GetWorkgroupSizeNotVectorGenerator(spv_target_env env) {
@@ -3302,6 +3302,78 @@ OpFunctionEnd
       HasSubstr("BuiltIn SubgroupId cannot be used as a member decoration"));
       HasSubstr("BuiltIn SubgroupId cannot be used as a member decoration"));
 }
 }
 
 
+TEST_F(ValidateBuiltIns, TargetIsType) {
+  const std::string text = R"(
+OpCapability Shader
+OpCapability Linkage
+OpMemoryModel Logical GLSL450
+OpDecorate %void BuiltIn Position
+%void = OpTypeVoid
+)";
+
+  CompileSuccessfully(text);
+  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("BuiltIns can only target variables, structs or constants"));
+}
+
+TEST_F(ValidateBuiltIns, TargetIsVariable) {
+  const std::string text = R"(
+OpCapability Shader
+OpCapability Linkage
+OpMemoryModel Logical GLSL450
+OpDecorate %wg_var BuiltIn Position
+%int = OpTypeInt 32 0
+%int_wg_ptr = OpTypePointer Workgroup %int
+%wg_var = OpVariable %int_wg_ptr Workgroup
+)";
+
+  CompileSuccessfully(text);
+  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateBuiltIns, TargetIsStruct) {
+  const std::string text = R"(
+OpCapability Shader
+OpCapability Linkage
+OpMemoryModel Logical GLSL450
+OpDecorate %struct BuiltIn Position
+%struct = OpTypeStruct
+)";
+
+  CompileSuccessfully(text);
+  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateBuiltIns, TargetIsConstant) {
+  const std::string text = R"(
+OpCapability Shader
+OpCapability Linkage
+OpMemoryModel Logical GLSL450
+OpDecorate %int0 BuiltIn Position
+%int = OpTypeInt 32 0
+%int0 = OpConstant %int 0
+)";
+
+  CompileSuccessfully(text);
+  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateBuiltIns, TargetIsSpecConstant) {
+  const std::string text = R"(
+OpCapability Shader
+OpCapability Linkage
+OpMemoryModel Logical GLSL450
+OpDecorate %int0 BuiltIn Position
+%int = OpTypeInt 32 0
+%int0 = OpSpecConstant %int 0
+)";
+
+  CompileSuccessfully(text);
+  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
 }  // namespace
 }  // namespace
 }  // namespace val
 }  // namespace val
 }  // namespace spvtools
 }  // namespace spvtools

+ 318 - 96
3rdparty/spirv-tools/test/val/val_capability_test.cpp

@@ -23,6 +23,7 @@
 #include "gmock/gmock.h"
 #include "gmock/gmock.h"
 #include "source/assembly_grammar.h"
 #include "source/assembly_grammar.h"
 #include "source/spirv_target_env.h"
 #include "source/spirv_target_env.h"
+#include "spirv-tools/libspirv.h"
 #include "test/test_fixture.h"
 #include "test/test_fixture.h"
 #include "test/unit_spirv.h"
 #include "test/unit_spirv.h"
 #include "test/val/val_fixtures.h"
 #include "test/val/val_fixtures.h"
@@ -33,6 +34,7 @@ namespace {
 
 
 using spvtest::ScopedContext;
 using spvtest::ScopedContext;
 using testing::Combine;
 using testing::Combine;
+using testing::Eq;
 using testing::HasSubstr;
 using testing::HasSubstr;
 using testing::Values;
 using testing::Values;
 using testing::ValuesIn;
 using testing::ValuesIn;
@@ -1286,221 +1288,264 @@ INSTANTIATE_TEST_SUITE_P(BuiltIn, ValidateCapability,
                             Values(
                             Values(
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn Position\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn Position\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 // Just mentioning PointSize, ClipDistance, or CullDistance as a BuiltIn does
 // Just mentioning PointSize, ClipDistance, or CullDistance as a BuiltIn does
 // not trigger the requirement for the associated capability.
 // not trigger the requirement for the associated capability.
 // See https://github.com/KhronosGroup/SPIRV-Tools/issues/365
 // See https://github.com/KhronosGroup/SPIRV-Tools/issues/365
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn PointSize\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn PointSize\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn ClipDistance\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn ClipDistance\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn CullDistance\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn CullDistance\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn VertexId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn VertexId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn InstanceId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn InstanceId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn PrimitiveId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn PrimitiveId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           GeometryTessellationDependencies()),
           GeometryTessellationDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn InvocationId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn InvocationId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           GeometryTessellationDependencies()),
           GeometryTessellationDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn Layer\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn Layer\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           GeometryDependencies()),
           GeometryDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn ViewportIndex\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn ViewportIndex\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           std::vector<std::string>{"MultiViewport"}),
           std::vector<std::string>{"MultiViewport"}),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn TessLevelOuter\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn TessLevelOuter\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           TessellationDependencies()),
           TessellationDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn TessLevelInner\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn TessLevelInner\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           TessellationDependencies()),
           TessellationDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn TessCoord\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn TessCoord\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           TessellationDependencies()),
           TessellationDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn PatchVertices\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn PatchVertices\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           TessellationDependencies()),
           TessellationDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn FragCoord\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn FragCoord\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn PointCoord\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn PointCoord\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn FrontFacing\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn FrontFacing\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn SampleId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn SampleId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           std::vector<std::string>{"SampleRateShading"}),
           std::vector<std::string>{"SampleRateShading"}),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn SamplePosition\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn SamplePosition\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           std::vector<std::string>{"SampleRateShading"}),
           std::vector<std::string>{"SampleRateShading"}),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn SampleMask\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn SampleMask\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn FragDepth\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn FragDepth\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn HelperInvocation\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn HelperInvocation\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn VertexIndex\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn VertexIndex\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn InstanceIndex\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn InstanceIndex\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn NumWorkgroups\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn NumWorkgroups\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn WorkgroupSize\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn WorkgroupSize\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn WorkgroupId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn WorkgroupId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn LocalInvocationId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn LocalInvocationId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn GlobalInvocationId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn GlobalInvocationId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn LocalInvocationIndex\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn LocalInvocationIndex\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllCapabilities()),
           AllCapabilities()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn WorkDim\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn WorkDim\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelDependencies()),
           KernelDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn GlobalSize\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn GlobalSize\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelDependencies()),
           KernelDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn EnqueuedWorkgroupSize\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn EnqueuedWorkgroupSize\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelDependencies()),
           KernelDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn GlobalOffset\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn GlobalOffset\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelDependencies()),
           KernelDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn GlobalLinearId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn GlobalLinearId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelDependencies()),
           KernelDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn SubgroupSize\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn SubgroupSize\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelAndGroupNonUniformDependencies()),
           KernelAndGroupNonUniformDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn SubgroupMaxSize\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn SubgroupMaxSize\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelDependencies()),
           KernelDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn NumSubgroups\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn NumSubgroups\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelAndGroupNonUniformDependencies()),
           KernelAndGroupNonUniformDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn NumEnqueuedSubgroups\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn NumEnqueuedSubgroups\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelDependencies()),
           KernelDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn SubgroupId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn SubgroupId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelAndGroupNonUniformDependencies()),
           KernelAndGroupNonUniformDependencies()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn SubgroupLocalInvocationId\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn SubgroupLocalInvocationId\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           KernelAndGroupNonUniformDependencies()),
           KernelAndGroupNonUniformDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn VertexIndex\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn VertexIndex\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies()),
           ShaderDependencies()),
 std::make_pair(std::string(kOpenCLMemoryModel) +
 std::make_pair(std::string(kOpenCLMemoryModel) +
           "OpEntryPoint Kernel %func \"compute\" \n" +
           "OpEntryPoint Kernel %func \"compute\" \n" +
-          "OpDecorate %intt BuiltIn InstanceIndex\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn InstanceIndex\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           ShaderDependencies())
           ShaderDependencies())
 )));
 )));
 
 
@@ -1548,18 +1593,21 @@ INSTANTIATE_TEST_SUITE_P(BuiltIn, ValidateCapabilityOpenGL40,
                             Values(
                             Values(
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn PointSize\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn PointSize\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllSpirV10Capabilities()),
           AllSpirV10Capabilities()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn ClipDistance\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn ClipDistance\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllSpirV10Capabilities()),
           AllSpirV10Capabilities()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn CullDistance\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn CullDistance\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllSpirV10Capabilities())
           AllSpirV10Capabilities())
 )));
 )));
 
 
@@ -1580,13 +1628,15 @@ INSTANTIATE_TEST_SUITE_P(Capabilities, ValidateCapabilityVulkan11,
                             Values(
                             Values(
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn PointSize\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn PointSize\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllVulkan11Capabilities()),
           AllVulkan11Capabilities()),
 std::make_pair(std::string(kGLSL450MemoryModel) +
 std::make_pair(std::string(kGLSL450MemoryModel) +
           "OpEntryPoint Vertex %func \"shader\" \n" +
           "OpEntryPoint Vertex %func \"shader\" \n" +
-          "OpDecorate %intt BuiltIn CullDistance\n"
-          "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid),
+          "OpDecorate %int0 BuiltIn CullDistance\n"
+          "%intt = OpTypeInt 32 0\n"
+          "%int0 = OpConstant %intt 0\n" + std::string(kVoidFVoid),
           AllVulkan11Capabilities())
           AllVulkan11Capabilities())
 )));
 )));
 
 
@@ -2436,6 +2486,178 @@ OpFunctionEnd
       << getDiagnosticString();
       << getDiagnosticString();
 }
 }
 
 
+// Test that extensions incorporated into SPIR-V 1.5 no longer require
+// the associated OpExtension instruction.  Test one capability per extension.
+
+struct CapabilityExtensionVersionCase {
+  std::string capability;
+  std::string capability_new_name;
+  std::string extension;
+  spv_target_env last_version_requiring_extension;
+  spv_target_env first_version_in_core;
+};
+
+using ValidateCapabilityExtensionVersionTest =
+    spvtest::ValidateBase<CapabilityExtensionVersionCase>;
+
+// Returns a minimal shader module with the given capability instruction.
+std::string MinimalShaderModuleWithCapability(std::string cap) {
+  std::string mem_model =
+      (cap.find("VulkanMemory") == 0) ? "VulkanKHR" : "GLSL450";
+  std::string extra_cap = (cap.find("VulkanMemoryModelDeviceScope") == 0)
+                              ? "\nOpCapability VulkanMemoryModelKHR\n"
+                              : "";
+  return std::string("OpCapability ") + cap + extra_cap + R"(
+OpCapability Shader
+OpMemoryModel Logical )" + mem_model + R"(
+OpEntryPoint Vertex %main "main"
+%void = OpTypeVoid
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+OpReturn
+OpFunctionEnd
+)";
+}
+
+TEST_P(ValidateCapabilityExtensionVersionTest, FailsInOlderSpirvVersion) {
+  const auto spirv = MinimalShaderModuleWithCapability(GetParam().capability);
+  CompileSuccessfully(spirv, GetParam().last_version_requiring_extension);
+  EXPECT_EQ(SPV_ERROR_MISSING_EXTENSION,
+            ValidateInstructions(GetParam().last_version_requiring_extension));
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr(std::string("1st operand of Capability: operand ") +
+                        GetParam().capability_new_name))
+      << spirv << "\n";
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr(std::string("requires one of these extensions: ") +
+                        GetParam().extension));
+}
+
+TEST_P(ValidateCapabilityExtensionVersionTest,
+       SucceedsInNewerSpirvVersionWithOldName) {
+  const auto spirv = MinimalShaderModuleWithCapability(GetParam().capability);
+  CompileSuccessfully(spirv, GetParam().first_version_in_core);
+  EXPECT_EQ(SPV_SUCCESS,
+            ValidateInstructions(GetParam().first_version_in_core));
+  EXPECT_THAT(getDiagnosticString(), Eq("")) << spirv << "\n";
+}
+
+TEST_P(ValidateCapabilityExtensionVersionTest,
+       SucceedsInNewerSpirvVersionWithNewName) {
+  const auto spirv =
+      MinimalShaderModuleWithCapability(GetParam().capability_new_name);
+  CompileSuccessfully(spirv, GetParam().first_version_in_core);
+  EXPECT_EQ(SPV_SUCCESS,
+            ValidateInstructions(GetParam().first_version_in_core));
+  EXPECT_THAT(getDiagnosticString(), Eq("")) << spirv << "\n";
+}
+
+std::vector<CapabilityExtensionVersionCase> CapVersionCases1_5() {
+#define IN15NOSUFFIX(C, E) \
+  { C, C, E, SPV_ENV_UNIVERSAL_1_4, SPV_ENV_UNIVERSAL_1_5 }
+#define IN15(C, C_WITHOUT_SUFFIX, E) \
+  { C, C_WITHOUT_SUFFIX, E, SPV_ENV_UNIVERSAL_1_4, SPV_ENV_UNIVERSAL_1_5 }
+  return std::vector<CapabilityExtensionVersionCase>{
+      // SPV_KHR_8bit_storage
+      IN15NOSUFFIX("StorageBuffer8BitAccess", "SPV_KHR_8bit_storage"),
+      IN15NOSUFFIX("UniformAndStorageBuffer8BitAccess", "SPV_KHR_8bit_storage"),
+      IN15NOSUFFIX("StoragePushConstant8", "SPV_KHR_8bit_storage"),
+      // SPV_EXT_descriptor_indexing
+      IN15("ShaderNonUniformEXT", "ShaderNonUniform",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("RuntimeDescriptorArrayEXT", "RuntimeDescriptorArray",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("InputAttachmentArrayDynamicIndexingEXT",
+           "InputAttachmentArrayDynamicIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("UniformTexelBufferArrayDynamicIndexingEXT",
+           "UniformTexelBufferArrayDynamicIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("StorageTexelBufferArrayDynamicIndexingEXT",
+           "StorageTexelBufferArrayDynamicIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("UniformBufferArrayNonUniformIndexingEXT",
+           "UniformBufferArrayNonUniformIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("SampledImageArrayNonUniformIndexingEXT",
+           "SampledImageArrayNonUniformIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("StorageBufferArrayNonUniformIndexingEXT",
+           "StorageBufferArrayNonUniformIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("StorageImageArrayNonUniformIndexingEXT",
+           "StorageImageArrayNonUniformIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("InputAttachmentArrayNonUniformIndexingEXT",
+           "InputAttachmentArrayNonUniformIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("UniformTexelBufferArrayNonUniformIndexingEXT",
+           "UniformTexelBufferArrayNonUniformIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      IN15("StorageTexelBufferArrayNonUniformIndexingEXT",
+           "StorageTexelBufferArrayNonUniformIndexing",
+           "SPV_EXT_descriptor_indexing"),
+      // SPV_EXT_physical_storage_buffer
+      IN15("PhysicalStorageBufferAddressesEXT",
+           "PhysicalStorageBufferAddresses", "SPV_EXT_physical_storage_buffer"),
+      // SPV_KHR_vulkan_memory_model
+      IN15("VulkanMemoryModelKHR", "VulkanMemoryModel",
+           "SPV_KHR_vulkan_memory_model"),
+      IN15("VulkanMemoryModelDeviceScopeKHR", "VulkanMemoryModelDeviceScope",
+           "SPV_KHR_vulkan_memory_model"),
+  };
+#undef IN15
+}
+
+INSTANTIATE_TEST_SUITE_P(NewInSpirv1_5, ValidateCapabilityExtensionVersionTest,
+                         ValuesIn(CapVersionCases1_5()));
+
+TEST_P(ValidateCapability,
+       CapShaderViewportIndexLayerFailsInOlderSpirvVersion) {
+  const auto spirv =
+      MinimalShaderModuleWithCapability("ShaderViewportIndexLayerEXT");
+  CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_4);
+  EXPECT_EQ(SPV_ERROR_MISSING_EXTENSION,
+            ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "1st operand of Capability: operand ShaderViewportIndexLayerEXT"));
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("requires one of these extensions: "
+                        "SPV_EXT_shader_viewport_index_layer"));
+}
+
+TEST_P(ValidateCapability, CapShaderViewportIndexLayerFailsInNewSpirvVersion) {
+  const auto spirv =
+      MinimalShaderModuleWithCapability("ShaderViewportIndexLayerEXT");
+  CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_5);
+  EXPECT_EQ(SPV_ERROR_MISSING_EXTENSION,
+            ValidateInstructions(SPV_ENV_UNIVERSAL_1_5));
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "1st operand of Capability: operand ShaderViewportIndexLayerEXT"));
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("requires one of these extensions: "
+                        "SPV_EXT_shader_viewport_index_layer"));
+}
+
+TEST_F(ValidateCapability, CapShaderViewportIndexSucceedsInNewSpirvVersion) {
+  const auto spirv = MinimalShaderModuleWithCapability("ShaderViewportIndex");
+  CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_5);
+  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_5));
+  EXPECT_THAT(getDiagnosticString(), Eq(""));
+}
+
+TEST_F(ValidateCapability, CapShaderLayerSucceedsInNewSpirvVersion) {
+  const auto spirv = MinimalShaderModuleWithCapability("ShaderLayer");
+  CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_5);
+  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_5));
+  EXPECT_THAT(getDiagnosticString(), Eq(""));
+}
+
 }  // namespace
 }  // namespace
 }  // namespace val
 }  // namespace val
 }  // namespace spvtools
 }  // namespace spvtools

+ 2 - 1
3rdparty/spirv-tools/test/val/val_decoration_test.cpp

@@ -4785,7 +4785,8 @@ TEST_F(ValidateDecorations, UniformIdDecorationWithScopeIdV13Bad) {
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
   EXPECT_THAT(getDiagnosticString(),
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("requires SPIR-V version 1.4 or later\n"
               HasSubstr("requires SPIR-V version 1.4 or later\n"
-                        "  OpDecorateId %int0 UniformId %subgroupscope"));
+                        "  OpDecorateId %int0 UniformId %subgroupscope"))
+      << spirv;
 }
 }
 
 
 TEST_F(ValidateDecorations, UniformIdDecorationWithScopeIdV13BadTargetV14) {
 TEST_F(ValidateDecorations, UniformIdDecorationWithScopeIdV13BadTargetV14) {

+ 2 - 2
3rdparty/spirv-tools/test/val/val_id_test.cpp

@@ -2317,8 +2317,8 @@ TEST_F(ValidateIdWithMessage, OpLoadGood) {
  %6 = OpFunction %1 None %4
  %6 = OpFunction %1 None %4
  %7 = OpLabel
  %7 = OpLabel
  %8 = OpLoad %2 %5
  %8 = OpLoad %2 %5
- %9 = OpReturn
-%10 = OpFunctionEnd
+      OpReturn
+      OpFunctionEnd
 )";
 )";
   CompileSuccessfully(spirv.c_str());
   CompileSuccessfully(spirv.c_str());
   EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
   EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());

+ 23 - 23
3rdparty/spirv-tools/test/val/val_image_test.cpp

@@ -2938,7 +2938,7 @@ TEST_F(ValidateImage, ReadCoordinateSizeTooSmall) {
 TEST_F(ValidateImage, WriteSuccess1) {
 TEST_F(ValidateImage, WriteSuccess1) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123
+OpImageWrite %img %u32vec2_01 %u32vec4_0123
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -2949,7 +2949,7 @@ TEST_F(ValidateImage, WriteSuccess1) {
 TEST_F(ValidateImage, WriteSuccess2) {
 TEST_F(ValidateImage, WriteSuccess2) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_1d_0002_rgba32f %uniform_image_f32_1d_0002_rgba32f
 %img = OpLoad %type_image_f32_1d_0002_rgba32f %uniform_image_f32_1d_0002_rgba32f
-%res1 = OpImageWrite %img %u32_1 %f32vec4_0000
+OpImageWrite %img %u32_1 %f32vec4_0000
 )";
 )";
 
 
   const std::string extra = "\nOpCapability Image1D\n";
   const std::string extra = "\nOpCapability Image1D\n";
@@ -2960,7 +2960,7 @@ TEST_F(ValidateImage, WriteSuccess2) {
 TEST_F(ValidateImage, WriteSuccess3) {
 TEST_F(ValidateImage, WriteSuccess3) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_cube_0102_rgba32f %uniform_image_f32_cube_0102_rgba32f
 %img = OpLoad %type_image_f32_cube_0102_rgba32f %uniform_image_f32_cube_0102_rgba32f
-%res1 = OpImageWrite %img %u32vec3_012 %f32vec4_0000
+OpImageWrite %img %u32vec3_012 %f32vec4_0000
 )";
 )";
 
 
   const std::string extra = "\nOpCapability ImageCubeArray\n";
   const std::string extra = "\nOpCapability ImageCubeArray\n";
@@ -2972,8 +2972,8 @@ TEST_F(ValidateImage, WriteSuccess4) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_2d_0010 %uniform_image_f32_2d_0010
 %img = OpLoad %type_image_f32_2d_0010 %uniform_image_f32_2d_0010
 ;TODO([email protected]) Is it legal to write to MS image without sample index?
 ;TODO([email protected]) Is it legal to write to MS image without sample index?
-%res1 = OpImageWrite %img %u32vec2_01 %f32vec4_0000
-%res2 = OpImageWrite %img %u32vec2_01 %f32vec4_0000 Sample %u32_1
+OpImageWrite %img %u32vec2_01 %f32vec4_0000
+OpImageWrite %img %u32vec2_01 %f32vec4_0000 Sample %u32_1
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -2984,7 +2984,7 @@ TEST_F(ValidateImage, WriteSuccess4) {
 TEST_F(ValidateImage, WriteSubpassData) {
 TEST_F(ValidateImage, WriteSubpassData) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_spd_0002 %uniform_image_f32_spd_0002
 %img = OpLoad %type_image_f32_spd_0002 %uniform_image_f32_spd_0002
-%res1 = OpImageWrite %img %u32vec2_01 %f32vec4_0000
+OpImageWrite %img %u32vec2_01 %f32vec4_0000
 )";
 )";
 
 
   CompileSuccessfully(GenerateShaderCode(body).c_str());
   CompileSuccessfully(GenerateShaderCode(body).c_str());
@@ -2996,7 +2996,7 @@ TEST_F(ValidateImage, WriteSubpassData) {
 TEST_F(ValidateImage, WriteNeedCapabilityStorageImageWriteWithoutFormat) {
 TEST_F(ValidateImage, WriteNeedCapabilityStorageImageWriteWithoutFormat) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123
+OpImageWrite %img %u32vec2_01 %u32vec4_0123
 )";
 )";
 
 
   CompileSuccessfully(GenerateShaderCode(body).c_str());
   CompileSuccessfully(GenerateShaderCode(body).c_str());
@@ -3006,7 +3006,7 @@ TEST_F(ValidateImage, WriteNeedCapabilityStorageImageWriteWithoutFormat) {
 TEST_F(ValidateImage, WriteNeedCapabilityStorageImageWriteWithoutFormatVulkan) {
 TEST_F(ValidateImage, WriteNeedCapabilityStorageImageWriteWithoutFormatVulkan) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123
+OpImageWrite %img %u32vec2_01 %u32vec4_0123
 )";
 )";
 
 
   spv_target_env env = SPV_ENV_VULKAN_1_0;
   spv_target_env env = SPV_ENV_VULKAN_1_0;
@@ -3023,7 +3023,7 @@ TEST_F(ValidateImage, WriteNeedCapabilityStorageImageWriteWithoutFormatVulkan) {
 TEST_F(ValidateImage, WriteNeedCapabilityImage1D) {
 TEST_F(ValidateImage, WriteNeedCapabilityImage1D) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_1d_0002_rgba32f %uniform_image_f32_1d_0002_rgba32f
 %img = OpLoad %type_image_f32_1d_0002_rgba32f %uniform_image_f32_1d_0002_rgba32f
-%res1 = OpImageWrite %img %u32vec2_01 %f32vec4_0000
+OpImageWrite %img %u32vec2_01 %f32vec4_0000
 )";
 )";
 
 
   CompileSuccessfully(GenerateShaderCode(body).c_str());
   CompileSuccessfully(GenerateShaderCode(body).c_str());
@@ -3036,7 +3036,7 @@ TEST_F(ValidateImage, WriteNeedCapabilityImage1D) {
 TEST_F(ValidateImage, WriteNeedCapabilityImageCubeArray) {
 TEST_F(ValidateImage, WriteNeedCapabilityImageCubeArray) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_cube_0102_rgba32f %uniform_image_f32_cube_0102_rgba32f
 %img = OpLoad %type_image_f32_cube_0102_rgba32f %uniform_image_f32_cube_0102_rgba32f
-%res1 = OpImageWrite %img %u32vec3_012 %f32vec4_0000
+OpImageWrite %img %u32vec3_012 %f32vec4_0000
 )";
 )";
 
 
   CompileSuccessfully(GenerateShaderCode(body).c_str());
   CompileSuccessfully(GenerateShaderCode(body).c_str());
@@ -3050,7 +3050,7 @@ TEST_F(ValidateImage, WriteNeedCapabilityImageCubeArray) {
 TEST_F(ValidateImage, WriteNotImage) {
 TEST_F(ValidateImage, WriteNotImage) {
   const std::string body = R"(
   const std::string body = R"(
 %sampler = OpLoad %type_sampler %uniform_sampler
 %sampler = OpLoad %type_sampler %uniform_sampler
-%res1 = OpImageWrite %sampler %u32vec2_01 %f32vec4_0000
+OpImageWrite %sampler %u32vec2_01 %f32vec4_0000
 )";
 )";
 
 
   CompileSuccessfully(GenerateShaderCode(body).c_str());
   CompileSuccessfully(GenerateShaderCode(body).c_str());
@@ -3062,7 +3062,7 @@ TEST_F(ValidateImage, WriteNotImage) {
 TEST_F(ValidateImage, WriteImageSampled) {
 TEST_F(ValidateImage, WriteImageSampled) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001
 %img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001
-%res1 = OpImageWrite %img %u32vec2_01 %f32vec4_0000
+OpImageWrite %img %u32vec2_01 %f32vec4_0000
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -3075,7 +3075,7 @@ TEST_F(ValidateImage, WriteImageSampled) {
 TEST_F(ValidateImage, WriteWrongCoordinateType) {
 TEST_F(ValidateImage, WriteWrongCoordinateType) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %f32vec2_00 %u32vec4_0123
+OpImageWrite %img %f32vec2_00 %u32vec4_0123
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -3088,7 +3088,7 @@ TEST_F(ValidateImage, WriteWrongCoordinateType) {
 TEST_F(ValidateImage, WriteCoordinateSizeTooSmall) {
 TEST_F(ValidateImage, WriteCoordinateSizeTooSmall) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32_1 %u32vec4_0123
+OpImageWrite %img %u32_1 %u32vec4_0123
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -3102,7 +3102,7 @@ TEST_F(ValidateImage, WriteCoordinateSizeTooSmall) {
 TEST_F(ValidateImage, WriteTexelWrongType) {
 TEST_F(ValidateImage, WriteTexelWrongType) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %img
+OpImageWrite %img %u32vec2_01 %img
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -3115,7 +3115,7 @@ TEST_F(ValidateImage, WriteTexelWrongType) {
 TEST_F(ValidateImage, DISABLED_WriteTexelNotVector4) {
 TEST_F(ValidateImage, DISABLED_WriteTexelNotVector4) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %u32vec3_012
+OpImageWrite %img %u32vec2_01 %u32vec3_012
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -3128,7 +3128,7 @@ TEST_F(ValidateImage, DISABLED_WriteTexelNotVector4) {
 TEST_F(ValidateImage, WriteTexelWrongComponentType) {
 TEST_F(ValidateImage, WriteTexelWrongComponentType) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %f32vec4_0000
+OpImageWrite %img %u32vec2_01 %f32vec4_0000
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -3143,7 +3143,7 @@ TEST_F(ValidateImage, WriteTexelWrongComponentType) {
 TEST_F(ValidateImage, WriteSampleNotInteger) {
 TEST_F(ValidateImage, WriteSampleNotInteger) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_2d_0010 %uniform_image_f32_2d_0010
 %img = OpLoad %type_image_f32_2d_0010 %uniform_image_f32_2d_0010
-%res1 = OpImageWrite %img %u32vec2_01 %f32vec4_0000 Sample %f32_1
+OpImageWrite %img %u32vec2_01 %f32vec4_0000 Sample %f32_1
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -3156,7 +3156,7 @@ TEST_F(ValidateImage, WriteSampleNotInteger) {
 TEST_F(ValidateImage, SampleNotMultisampled) {
 TEST_F(ValidateImage, SampleNotMultisampled) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_f32_2d_0002 %uniform_image_f32_2d_0002
 %img = OpLoad %type_image_f32_2d_0002 %uniform_image_f32_2d_0002
-%res2 = OpImageWrite %img %u32vec2_01 %f32vec4_0000 Sample %u32_1
+OpImageWrite %img %u32vec2_01 %f32vec4_0000 Sample %u32_1
 )";
 )";
 
 
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
   const std::string extra = "\nOpCapability StorageImageWriteWithoutFormat\n";
@@ -4527,7 +4527,7 @@ OpExtension "SPV_KHR_vulkan_memory_model"
 TEST_F(ValidateImage, MakeTexelAvailableKHRSuccessImageWrite) {
 TEST_F(ValidateImage, MakeTexelAvailableKHRSuccessImageWrite) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_2
+OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_2
 )";
 )";
 
 
   const std::string extra = R"(
   const std::string extra = R"(
@@ -4567,7 +4567,7 @@ OpExtension "SPV_KHR_vulkan_memory_model"
 TEST_F(ValidateImage, MakeTexelAvailableKHRFailureMissingNonPrivate) {
 TEST_F(ValidateImage, MakeTexelAvailableKHRFailureMissingNonPrivate) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR %u32_1
+OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR %u32_1
 )";
 )";
 
 
   const std::string extra = R"(
   const std::string extra = R"(
@@ -4588,7 +4588,7 @@ OpExtension "SPV_KHR_vulkan_memory_model"
 TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageWriteBad) {
 TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageWriteBad) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1
+OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1
 )";
 )";
 
 
   const std::string extra = R"(
   const std::string extra = R"(
@@ -4610,7 +4610,7 @@ OpExtension "SPV_KHR_vulkan_memory_model"
 TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageWriteGood) {
 TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageWriteGood) {
   const std::string body = R"(
   const std::string body = R"(
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
 %img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
-%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1
+OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1
 )";
 )";
 
 
   const std::string extra = R"(
   const std::string extra = R"(

+ 4 - 4
3rdparty/spirv-tools/test/val/val_limits_test.cpp

@@ -212,7 +212,7 @@ TEST_F(ValidateLimits, SwitchNumBranchesGood) {
 %5 = OpFunction %1 None %2
 %5 = OpFunction %1 None %2
 %7 = OpLabel
 %7 = OpLabel
 %8 = OpIAdd %3 %4 %4
 %8 = OpIAdd %3 %4 %4
-%9 = OpSwitch %4 %10)";
+     OpSwitch %4 %10)";
 
 
   // Now add the (literal, label) pairs
   // Now add the (literal, label) pairs
   for (int i = 0; i < 16383; ++i) {
   for (int i = 0; i < 16383; ++i) {
@@ -240,7 +240,7 @@ TEST_F(ValidateLimits, SwitchNumBranchesBad) {
 %5 = OpFunction %1 None %2
 %5 = OpFunction %1 None %2
 %7 = OpLabel
 %7 = OpLabel
 %8 = OpIAdd %3 %4 %4
 %8 = OpIAdd %3 %4 %4
-%9 = OpSwitch %4 %10)";
+     OpSwitch %4 %10)";
 
 
   // Now add the (literal, label) pairs
   // Now add the (literal, label) pairs
   for (int i = 0; i < 16384; ++i) {
   for (int i = 0; i < 16384; ++i) {
@@ -271,7 +271,7 @@ TEST_F(ValidateLimits, CustomizedSwitchNumBranchesGood) {
 %5 = OpFunction %1 None %2
 %5 = OpFunction %1 None %2
 %7 = OpLabel
 %7 = OpLabel
 %8 = OpIAdd %3 %4 %4
 %8 = OpIAdd %3 %4 %4
-%9 = OpSwitch %4 %10)";
+     OpSwitch %4 %10)";
 
 
   // Now add the (literal, label) pairs
   // Now add the (literal, label) pairs
   for (int i = 0; i < 10; ++i) {
   for (int i = 0; i < 10; ++i) {
@@ -301,7 +301,7 @@ TEST_F(ValidateLimits, CustomizedSwitchNumBranchesBad) {
 %5 = OpFunction %1 None %2
 %5 = OpFunction %1 None %2
 %7 = OpLabel
 %7 = OpLabel
 %8 = OpIAdd %3 %4 %4
 %8 = OpIAdd %3 %4 %4
-%9 = OpSwitch %4 %10)";
+     OpSwitch %4 %10)";
 
 
   // Now add the (literal, label) pairs
   // Now add the (literal, label) pairs
   for (int i = 0; i < 11; ++i) {
   for (int i = 0; i < 11; ++i) {

+ 5 - 6
3rdparty/spirv-tools/test/val/val_memory_test.cpp

@@ -1492,8 +1492,8 @@ OpFunctionEnd
       getDiagnosticString(),
       getDiagnosticString(),
       HasSubstr(
       HasSubstr(
           "Source memory access must not include MakePointerAvailableKHR\n"
           "Source memory access must not include MakePointerAvailableKHR\n"
-          "  OpCopyMemory %5 %6 MakePointerAvailableKHR|NonPrivatePointerKHR"
-          " %uint_1 MakePointerAvailableKHR|NonPrivatePointerKHR %uint_1"));
+          "  OpCopyMemory %5 %6 MakePointerAvailable|NonPrivatePointer"
+          " %uint_1 MakePointerAvailable|NonPrivatePointer %uint_1"));
 }
 }
 
 
 TEST_F(ValidateMemory, VulkanMemoryModelCopyMemoryTwoAccessSecondWithVisBad) {
 TEST_F(ValidateMemory, VulkanMemoryModelCopyMemoryTwoAccessSecondWithVisBad) {
@@ -1525,10 +1525,9 @@ OpFunctionEnd
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
   EXPECT_THAT(
   EXPECT_THAT(
       getDiagnosticString(),
       getDiagnosticString(),
-      HasSubstr(
-          "Target memory access must not include MakePointerVisibleKHR\n"
-          "  OpCopyMemory %5 %6 MakePointerVisibleKHR|NonPrivatePointerKHR"
-          " %uint_1 MakePointerVisibleKHR|NonPrivatePointerKHR %uint_1"));
+      HasSubstr("Target memory access must not include MakePointerVisibleKHR\n"
+                "  OpCopyMemory %5 %6 MakePointerVisible|NonPrivatePointer"
+                " %uint_1 MakePointerVisible|NonPrivatePointer %uint_1"));
 }
 }
 
 
 TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedBad1) {
 TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedBad1) {

+ 1 - 1
3rdparty/spirv-tools/test/val/val_webgpu_test.cpp

@@ -201,7 +201,7 @@ TEST_F(ValidateWebGPU, NonLogicalAddressingModelBad) {
   EXPECT_THAT(getDiagnosticString(),
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("Addressing model must be Logical for WebGPU "
               HasSubstr("Addressing model must be Logical for WebGPU "
                         "environment.\n  OpMemoryModel Physical32 "
                         "environment.\n  OpMemoryModel Physical32 "
-                        "VulkanKHR\n"));
+                        "Vulkan\n"));
 }
 }
 
 
 TEST_F(ValidateWebGPU, NonVulkanKHRMemoryModelBad) {
 TEST_F(ValidateWebGPU, NonVulkanKHRMemoryModelBad) {

+ 1 - 1
3rdparty/spirv-tools/tools/as/as.cpp

@@ -48,7 +48,7 @@ Options:
       argv0, argv0, target_env_list.c_str());
       argv0, argv0, target_env_list.c_str());
 }
 }
 
 
-static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_4;
+static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_5;
 
 
 int main(int argc, char** argv) {
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
   const char* inFile = nullptr;

+ 1 - 1
3rdparty/spirv-tools/tools/cfg/cfg.cpp

@@ -44,7 +44,7 @@ Options:
       argv0, argv0);
       argv0, argv0);
 }
 }
 
 
-static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_4;
+static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_5;
 
 
 int main(int argc, char** argv) {
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
   const char* inFile = nullptr;

+ 1 - 1
3rdparty/spirv-tools/tools/dis/dis.cpp

@@ -60,7 +60,7 @@ Options:
       argv0, argv0);
       argv0, argv0);
 }
 }
 
 
-static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_4;
+static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_5;
 
 
 int main(int argc, char** argv) {
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
   const char* inFile = nullptr;

+ 1 - 1
3rdparty/spirv-tools/tools/opt/opt.cpp

@@ -59,7 +59,7 @@ std::string GetListOfPassesAsString(const spvtools::Optimizer& optimizer) {
   return ss.str();
   return ss.str();
 }
 }
 
 
-const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_4;
+const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_5;
 
 
 std::string GetLegalizationPasses() {
 std::string GetLegalizationPasses() {
   spvtools::Optimizer optimizer(kDefaultEnvironment);
   spvtools::Optimizer optimizer(kDefaultEnvironment);

+ 1 - 1
3rdparty/spirv-tools/tools/reduce/reduce.cpp

@@ -217,7 +217,7 @@ void DumpShader(spvtools::opt::IRContext* context, const char* filename) {
   DumpShader(binary, filename);
   DumpShader(binary, filename);
 }
 }
 
 
-const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_4;
+const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_5;
 
 
 int main(int argc, const char** argv) {
 int main(int argc, const char** argv) {
   const char* in_file = nullptr;
   const char* in_file = nullptr;

+ 3 - 2
3rdparty/spirv-tools/tools/val/val.cpp

@@ -74,7 +74,7 @@ Options:
 
 
 int main(int argc, char** argv) {
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
   const char* inFile = nullptr;
-  spv_target_env target_env = SPV_ENV_UNIVERSAL_1_4;
+  spv_target_env target_env = SPV_ENV_UNIVERSAL_1_5;
   spvtools::ValidatorOptions options;
   spvtools::ValidatorOptions options;
   bool continue_processing = true;
   bool continue_processing = true;
   int return_code = 0;
   int return_code = 0;
@@ -108,12 +108,13 @@ int main(int argc, char** argv) {
         printf("%s\n", spvSoftwareVersionDetailsString());
         printf("%s\n", spvSoftwareVersionDetailsString());
         printf(
         printf(
             "Targets:\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n  "
             "Targets:\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n  "
-            "%s\n",
+            "%s\n  %s\n",
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_0),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_0),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_1),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_1),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_2),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_2),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_3),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_3),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_4),
             spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_4),
+            spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_5),
             spvTargetEnvDescription(SPV_ENV_OPENCL_2_2),
             spvTargetEnvDescription(SPV_ENV_OPENCL_2_2),
             spvTargetEnvDescription(SPV_ENV_VULKAN_1_0),
             spvTargetEnvDescription(SPV_ENV_VULKAN_1_0),
             spvTargetEnvDescription(SPV_ENV_VULKAN_1_1),
             spvTargetEnvDescription(SPV_ENV_VULKAN_1_1),

+ 24 - 0
3rdparty/spirv-tools/utils/generate_grammar_tables.py

@@ -653,6 +653,30 @@ def generate_all_string_enum_mappings(extensions, operand_kinds):
 def precondition_operand_kinds(operand_kinds):
 def precondition_operand_kinds(operand_kinds):
     """For operand kinds that have the same number, make sure they all have the
     """For operand kinds that have the same number, make sure they all have the
     same extension list."""
     same extension list."""
+
+    # Map operand kind and value to list of the union of extensions
+    # for same-valued enumerants.
+    exts = {}
+    for kind_entry in operand_kinds:
+        kind = kind_entry.get('kind')
+        for enum_entry in kind_entry.get('enumerants', []):
+            value = enum_entry.get('value')
+            key = kind + '.' + str(value)
+            if key in exts:
+                exts[key].extend(enum_entry.get('extensions', []))
+            else:
+                exts[key] = enum_entry.get('extensions', [])
+            exts[key] = sorted(set(exts[key]))
+
+    # Now make each entry the same list.
+    for kind_entry in operand_kinds:
+        kind = kind_entry.get('kind')
+        for enum_entry in kind_entry.get('enumerants', []):
+            value = enum_entry.get('value')
+            key = kind + '.' + str(value)
+            if len(exts[key]) > 0:
+                enum_entry['extensions'] = exts[key]
+
     return operand_kinds
     return operand_kinds