Merge master 1.0.36 into Metal-3.0 branch.
diff --git a/Common/MVKOSExtensions.mm b/Common/MVKOSExtensions.mm
index 7759e48..39ef03b 100644
--- a/Common/MVKOSExtensions.mm
+++ b/Common/MVKOSExtensions.mm
@@ -76,10 +76,12 @@
 #pragma mark Process environment
 
 string mvkGetEnvVar(string varName, bool* pWasFound) {
-	NSDictionary* env = [[NSProcessInfo processInfo] environment];
-	NSString* envStr = env[@(varName.c_str())];
-	if (pWasFound) { *pWasFound = envStr != nil; }
-	return envStr ? envStr.UTF8String : "";
+	@autoreleasepool {
+		NSDictionary*nsEnv = [[NSProcessInfo processInfo] environment];
+		NSString* envStr = nsEnv[@(varName.c_str())];
+		if (pWasFound) { *pWasFound = envStr != nil; }
+		return envStr ? envStr.UTF8String : "";
+	}
 }
 
 int64_t mvkGetEnvVarInt64(string varName, bool* pWasFound) {
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.mm b/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.mm
index e922cf4..cb00c5c 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.mm
+++ b/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.mm
@@ -32,7 +32,7 @@
  * Initialize sample from view, and resize view in accordance with the sample. 
  */
 void init_window(struct sample_info &info) {
-	info.window = sampleView;
+	info.caMetalLayer = sampleView.layer;
 	sampleView.bounds = CGRectMake(0, 0, info.width, info.height);
 }
 
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.mm b/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.mm
index 7b1bb64..aecb779 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.mm
+++ b/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.mm
@@ -33,7 +33,7 @@
  * Initialize sample from view, and resize view in accordance with the sample.
  */
 void init_window(struct sample_info &info) {
-	info.window = sampleView;
+	info.caMetalLayer = sampleView.layer;
 	sampleView.bounds = CGRectMake(0, 0, info.width, info.height);
 }
 
diff --git a/Demos/LunarG-VulkanSamples/Cube/iOS/DemoViewController.m b/Demos/LunarG-VulkanSamples/Cube/iOS/DemoViewController.m
index 9706ebc..e0cce29 100644
--- a/Demos/LunarG-VulkanSamples/Cube/iOS/DemoViewController.m
+++ b/Demos/LunarG-VulkanSamples/Cube/iOS/DemoViewController.m
@@ -43,7 +43,7 @@
 	self.view.contentScaleFactor = UIScreen.mainScreen.nativeScale;
 
 	const char* arg = "cube";
-	demo_main(&demo, self.view, 1, &arg);
+	demo_main(&demo, self.view.layer, 1, &arg);
 	demo_draw(&demo);
 
 	uint32_t fps = 60;
diff --git a/Demos/LunarG-VulkanSamples/Cube/macOS/DemoViewController.m b/Demos/LunarG-VulkanSamples/Cube/macOS/DemoViewController.m
index 5c6fa42..1629f76 100644
--- a/Demos/LunarG-VulkanSamples/Cube/macOS/DemoViewController.m
+++ b/Demos/LunarG-VulkanSamples/Cube/macOS/DemoViewController.m
@@ -42,8 +42,9 @@
 	[super viewDidLoad];
 
 	self.view.wantsLayer = YES;		// Back the view with a layer created by the makeBackingLayer method.
+
 	const char* arg = "cube";
-	demo_main(&demo, self.view, 1, &arg);
+	demo_main(&demo, self.view.layer, 1, &arg);
 
 	CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink);
 	CVDisplayLinkSetOutputCallback(_displayLink, &DisplayLinkCallback, &demo);
diff --git a/Demos/LunarG-VulkanSamples/Hologram/ShellMVK.cpp b/Demos/LunarG-VulkanSamples/Hologram/ShellMVK.cpp
index 263f004..32e3ae9 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/ShellMVK.cpp
+++ b/Demos/LunarG-VulkanSamples/Hologram/ShellMVK.cpp
@@ -48,12 +48,7 @@
     _profile_start_time = _current_time;
     _profile_present_count = 0;
 
-#ifdef VK_USE_PLATFORM_IOS_MVK
-    instance_extensions_.push_back(VK_MVK_IOS_SURFACE_EXTENSION_NAME);
-#endif
-#ifdef VK_USE_PLATFORM_MACOS_MVK
-    instance_extensions_.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME);
-#endif
+    instance_extensions_.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME);
 
     init_vk();
 }
@@ -78,22 +73,12 @@
     VkSurfaceKHR surface;
 
     VkResult err;
-#ifdef VK_USE_PLATFORM_IOS_MVK
-    VkIOSSurfaceCreateInfoMVK surface_info;
-    surface_info.sType = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK;
+    VkMetalSurfaceCreateInfoEXT surface_info;
+    surface_info.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
     surface_info.pNext = NULL;
     surface_info.flags = 0;
-    surface_info.pView = _view;
-    err = vkCreateIOSSurfaceMVK(instance, &surface_info, NULL, &surface);
-#endif
-#ifdef VK_USE_PLATFORM_MACOS_MVK
-    VkMacOSSurfaceCreateInfoMVK surface_info;
-    surface_info.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
-    surface_info.pNext = NULL;
-    surface_info.flags = 0;
-    surface_info.pView = _view;
-    err = vkCreateMacOSSurfaceMVK(instance, &surface_info, NULL, &surface);
-#endif
+    surface_info.pLayer = _caMetalLayer;
+    err = vkCreateMetalSurfaceEXT(instance, &surface_info, NULL, &surface);
     assert(!err);
 
     return surface;
@@ -124,8 +109,8 @@
     }
 }
 
-void ShellMVK::run(void* view) {
-    _view = view;       // not retained
+void ShellMVK::run(void* caMetalLayer) {
+    _caMetalLayer = caMetalLayer;       // not retained
     create_context();
     resize_swapchain(settings_.initial_width, settings_.initial_height);
 }
diff --git a/Demos/LunarG-VulkanSamples/Hologram/ShellMVK.h b/Demos/LunarG-VulkanSamples/Hologram/ShellMVK.h
index 5948b06..4309920 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/ShellMVK.h
+++ b/Demos/LunarG-VulkanSamples/Hologram/ShellMVK.h
@@ -49,7 +49,7 @@
     void quit() { }
 
 protected:
-    void* _view;
+    void* _caMetalLayer;
     PosixTimer _timer;
     double _current_time;
     double _profile_start_time;
diff --git a/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.mm b/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.mm
index 7d0945a..bbfe4c1 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.mm
+++ b/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.mm
@@ -45,12 +45,12 @@
 	self.view.contentScaleFactor = UIScreen.mainScreen.nativeScale;
 
     std::vector<std::string> args;
-  args.push_back("-p");           // Use push constants
+    args.push_back("-p");           // Use push constants
 //  args.push_back("-s");           // Use a single thread
     _game = new Hologram(args);
 
     _shell = new ShellMVK(*_game);
-    _shell->run(self.view);
+    _shell->run(self.view.layer);
 
 	uint32_t fps = 60;
 	_displayLink = [CADisplayLink displayLinkWithTarget: self selector: @selector(renderLoop)];
diff --git a/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.mm b/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.mm
index e30ee21..6e169f0 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.mm
+++ b/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.mm
@@ -46,12 +46,12 @@
 	self.view.wantsLayer = YES;		// Back the view with a layer created by the makeBackingLayer method.
 
     std::vector<std::string> args;
-//  args.push_back("-p");           // Uncomment to use push constants
+    args.push_back("-p");           // Uncomment to use push constants
 //  args.push_back("-s");           // Uncomment to use a single thread
     _game = new Hologram(args);
 
     _shell = new ShellMVK(*_game);
-    _shell->run(self.view);
+    _shell->run(self.view.layer);
 
 	CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink);
 	CVDisplayLinkSetOutputCallback(_displayLink, &DisplayLinkCallback, _shell);
diff --git a/Docs/MoltenVK_Runtime_UserGuide.md b/Docs/MoltenVK_Runtime_UserGuide.md
index 8310e03..e4cf172 100644
--- a/Docs/MoltenVK_Runtime_UserGuide.md
+++ b/Docs/MoltenVK_Runtime_UserGuide.md
@@ -240,47 +240,45 @@
 - `VK_KHR_maintenance3`
 - `VK_KHR_push_descriptor`
 - `VK_KHR_relaxed_block_layout`
-- `VK_KHR_sampler_mirror_clamp_to_edge`
+- `VK_KHR_sampler_mirror_clamp_to_edge` *(macOS)*
 - `VK_KHR_shader_draw_parameters`
 - `VK_KHR_shader_float16_int8`
 - `VK_KHR_storage_buffer_storage_class`
 - `VK_KHR_surface`
 - `VK_KHR_swapchain`
 - `VK_KHR_swapchain_mutable_format`
+- `VK_KHR_uniform_buffer_standard_layout`
 - `VK_KHR_variable_pointers`
+- `VK_EXT_debug_marker`
 - `VK_EXT_debug_report`
+- `VK_EXT_debug_utils`
 - `VK_EXT_host_query_reset`
-- `VK_EXT_memory_budget`
+- `VK_EXT_memory_budget` *(requires Metal 2.0)*
+- `VK_EXT_metal_surface`
+- `VK_EXT_post_depth_coverage` *(iOS, requires GPU family 4)*
+- `VK_EXT_scalar_block_layout`
+- `VK_EXT_shader_stencil_export` *(requires Mac GPU family 2 or iOS GPU family 5)*
 - `VK_EXT_shader_viewport_index_layer`
+- `VK_EXT_swapchain_colorspace` *(macOS)*
 - `VK_EXT_vertex_attribute_divisor`
+- `VK_EXT_texel_buffer_alignment` *(requires Metal 2.0)*
 - `VK_EXTX_portability_subset`
-- `VK_MVK_ios_surface` (iOS)
-- `VK_MVK_macos_surface` (macOS)
+- `VK_MVK_ios_surface` *(iOS) (Obsolete. Use `VK_EXT_metal_surface` instead.)*
+- `VK_MVK_macos_surface` *(macOS) (Obsolete. Use `VK_EXT_metal_surface` instead.)*
 - `VK_MVK_moltenvk`
 - `VK_AMD_gpu_shader_half_float`
 - `VK_AMD_negative_viewport_height`
-- `VK_IMG_format_pvrtc` (iOS)
+- `VK_AMD_shader_image_load_store_lod` *(iOS)*
+- `VK_AMD_shader_trinary_minmax` *(requires Metal 2.1)*
+- `VK_IMG_format_pvrtc` *(iOS)*
+- `VK_INTEL_shader_integer_functions2`
 - `VK_NV_glsl_shader`
 
-In order to visibly display your content on *iOS* or *macOS*, you must enable the `VK_MVK_ios_surface` 
-or `VK_MVK_macos_surface` extension, respectively, and use the functions defined for that extension
-to create a *Vulkan* rendering surface.
-
-You can enable each of these extensions by defining the `VK_USE_PLATFORM_IOS_MVK` or 
-`VK_USE_PLATFORM_MACOS_MVK` guard macro in your compiler build settings. See the description
-of the `mvk_vulkan.h` file below for a convenient way to enable these extensions automatically.
-
-When using the `VK_MVK_macos_surface ` extension, the `pView` member of the `VkMacOSSurfaceCreateInfoMVK` 
-structure passed in the `vkCreateMacOSSurfaceMVK` function can be either an `NSView` whose layer is a 
-`CAMetalLayer`, or the `CAMetalLayer` itself. Passing the `CAMetalLayer` itself is recommended when 
-calling the `vkCreateMacOSSurfaceMVK` function from outside the main application thread, as `NSView` 
-should only be accessed from the main application thread.
-
-When using the `VK_MVK_ios_surface ` extension, the `pView` member of the `VkIOSSurfaceCreateInfoMVK` 
-structure passed in the `vkCreateIOSSurfaceMVK` function can be either a `UIView` whose layer is a 
-`CAMetalLayer`, or the `CAMetalLayer` itself. Passing the `CAMetalLayer` itself is recommended when 
-calling the `vkCreateIOSSurfaceMVK ` function from outside the main application thread, as `UIView` 
-should only be accessed from the main application thread.
+In order to visibly display your content on *iOS* or *macOS*, you must enable the `VK_EXT_metal_surface` 
+extension, and use the function defined in that extension to create a *Vulkan* rendering surface.
+You can enable the `VK_EXT_metal_surface` extension by defining the `VK_USE_PLATFORM_METAL_EXT` 
+guard macro in your compiler build settings. See the description of the `mvk_vulkan.h` file below for 
+a convenient way to enable this extension automatically.
 
 
 <a name="moltenvk_extension"></a>
@@ -306,10 +304,8 @@
    enabled for *iOS* or *macOS*. Use this header file in place of the `vulkan.h` header file, 
    where access to a **MoltenVK** platform surface extension is required.
    
-   - When building for *iOS*, the `mvk_vulkan.h` header file automatically enables the 
-    `VK_USE_PLATFORM_IOS_MVK` build setting and `VK_MVK_ios_surface` *Vulkan* extension.
-   - When building for *macOS*, the `mvk_vulkan.h` header file automatically enables the
-    `VK_USE_PLATFORM_MACOS_MVK` build setting and `VK_MVK_macos_surface` *Vulkan* extension.
+   The `mvk_vulkan.h` header file automatically enables the `VK_USE_PLATFORM_METAL_EXT` 
+   build setting and `VK_EXT_metal_surface` *Vulkan* extension.
   
 - `mvk_datatypes.h` - Contains helpful functions for converting between *Vulkan* and *Metal* data types.
   You do not need to use this functionality to use **MoltenVK**, as **MoltenVK** converts between 
@@ -317,6 +313,13 @@
   These functions are exposed in this header for your own purposes such as interacting with *Metal* 
   directly, or simply logging data values.
 
+>***Note:*** The functions in `vk_mvk_moltenvk.h` are not supported by the *Vulkan SDK Loader and Layers*
+ framework. The opaque Vulkan objects used by the functions in `vk_mvk_moltenvk.h` (`VkInstance`, 
+ `VkPhysicalDevice`, `VkShaderModule`, `VKImage`, ...), must have been retrieved directly from **MoltenVK**, 
+ and not through the *Vulkan SDK Loader and Layers* framework. The *Vulkan SDK Loader and Layers* framework 
+ often changes these opaque objects, and passing them from a higher layer directly to **MoltenVK** will 
+ result in undefined behaviour.
+
 
 <a name="moltenvk_config"></a>
 ### Configuring MoltenVK
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index fbca82f..50c5b0b 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -13,14 +13,107 @@
 
 
 
-MoltenVK 1.0.36
+MoltenVK 1.0.37
 ---------------
 
 Released TBD
 
+- Revert to supporting host-coherent memory for linear images on macOS.
+- Ensure Vulkan loader magic number is set every time before returning any dispatchable Vulkan handle.
+
+
+
+MoltenVK 1.0.36
+---------------
+
+Released 2019/07/25
+
+- Add support for extensions:
+	- `VK_KHR_device_group_creation`
+	- `VK_KHR_swapchain_mutable_format`
+	- `VK_KHR_uniform_buffer_standard_layout`
+	- `VK_EXT_metal_surface`
+	- `VK_EXT_post_depth_coverage`
+	- `VK_EXT_scalar_block_layout`
+	- `VK_EXT_shader_stencil_export`
+	- `VK_EXT_swapchain_colorspace`
+	- `VK_EXT_texel_buffer_alignment`
+	- `VK_AMD_shader_image_load_store_lod`
+	- `VK_AMD_shader_trinary_minmax`
+	- `VK_INTEL_shader_integer_functions2`
+- Support `VK_FORMAT_A2R10G10B10_UNORM_PACK32` as a surface format and view format.
+- For shaders created directly from MSL, set function name from 
+  `VkPipelineShaderStageCreateInfo::pName`.
 - On iOS GPU family 2 and earlier, support immutable depth-compare samplers 
-  as constexpr samplers hardcoded in MSL.
-- Skip SPIRV-Tools build in Travis.
+  as `constexpr` samplers hardcoded in MSL.
+- `vkCmdCopyImage()` support copying between compressed and uncompressed formats
+  and validate that formats are compatible for copying.
+- `vkCmdBufferImageCopy()` fix crash when setting bytes per image in non-arrayed images.
+- `vkCmdBlitImage()` supports blit between different texture formats, and multisampled images.
+- `vkCmdResolveImage()` supports textures of different sizes.
+- `vkCmdClearImage()` returns error if texture is not renderable.
+- Move push constant binding to `vkCmdBindPipeline()` from `vkCmdBindDescriptorSet()`.
+- `MVKDeviceMemory` keep `MTLResourceOptions` aligned with `MTLStorageMode` & `MTLCPUCacheMode`.
+- Texture memory requirements don't use shared storage on macOS.
+- Add `MTLCommandBuffer` completion timing performance tracking option.
+- Expand `MVK_CONFIG_TRACE_VULKAN_CALLS` to optionally log Vulkan call timings.
+- Skip `SPIRV-Tools` build in Travis because Travis does not support the required Python 3.
+- Separate `SPIRVToMSLConverterContext` into input config and output results.
+- Use native Metal texture buffers when available.
+- Fix issue with push constants used across multiple draw calls not being applied.
+- Fix memory leak in debug marker and debug utils labelling.
+- Reduce memory leaks when autorelease pools are not available.
+- Fix pipeline cache lookups.
+- Fix race condition between swapchain image destruction and presentation completion callback.
+- Set Metal texture usage to allow texture copy via view.
+- Fix memory leak in debug marker and debug utils labelling.
+- Fix issue with push constants used across multiple draw calls not being applied.
+- Fix crash when binding descriptor set to layout that has been destroyed and recreated.
+- Return error when `MVKImage` created as 1D attachment.
+- Reduce use of autoreleased Obj-C objects, and ensure those remaining are 
+  covered by deliberate autorelease pools. 
+- Document that the functions in `vk_mvk_moltenvk.h` cannot be used with objects 
+  retrieved through the *Vulkan SDK Loader and Layers* framework.
+- Update `VK_MVK_MOLTENVK_SPEC_VERSION` to 21.
+- Update dependency libraries to match Vulkan SDK 1.1.114.
+- Update to latest SPIRV-Cross version:
+	- MSL: Support `SPV_KHR_multiview` extension.
+	- MSL: Support the `SPV_KHR_post_depth_coverage` extension.
+	- MSL: Support the `SPV_AMD_shader_trinary_minmax` extension.
+	- MSL: Support the `SPV_KHR_device_group` extension.
+	- MSL: Support the `SPV_INTEL_shader_integer_functions2` extension.
+	- MSL: Support `SubgroupSize` / `SubgroupInvocationID` in fragment.
+	- MSL: Support `OpImageQueryLod`.
+	- MSL: Support `MinLod` operand.
+	- MSL: Support `PrimitiveID` in fragment and barycentrics.
+	- MSL: Support 64-bit integers.
+	- MSL: Support `OpOuterProduct`.
+	- MSL: Support `SubgroupLocalInvocationId` and `SubgroupSize` in all stages.
+	- MSL: Support scalar reflect and refract.
+	- MSL: Support scalar block layout.
+	- MSL: Use the `select()` function for `OpSelect`.
+	- MSL: Handle `coherent`, `volatile`, and `restrict`.
+	- MSL: Refactor buffer packing logic from ground up.
+	- MSL: Fix alignment of packed types.
+	- MSL: Handle packed matrices.
+	- MSL: Conditionally validate MSL 2.2 shaders.
+	- MSL: Rewrite how resource indices are fallback-assigned.
+	- MSL: Support custom bindings for argument buffers.
+	- MSL: Fix sampling with `FP16` coordinates.
+	- MSL: Deal with scalar input values for distance/length/normalize.
+	- MSL: Error out on `int64_t/uint64_t` buffer members as unsupported by Metal.
+	- MSL: Deal with scalar input values for distance/length/normalize.
+	- MSL: Re-roll array expressions in initializers.
+	- MSL: New SDK errors out on cull distance.
+	- Rewrite how switch block case labels are emitted.
+	- Fixes to handling of `OpPhi` and case fallthrough.
+	- Fix declaration of loop variables with a `OpPhi` helper copy.
+	- Handle more cases with FP16 and texture sampling.
+	- Fix variable scope when an `if` or `else` block dominates a variable.
+	- Fall back to complex loop if non-trivial continue block is found.
+	- Remove unreasonable assertion for `OpTypeImage Sampled` parameter.
+	- Propagate NonUniformEXT to dependent expressions.
+	- Deal correctly with return sign of bitscan operations.
 
 
 
@@ -44,7 +137,7 @@
 	- Fix tessellated indirect draws using wrong kernels to map parameters.
 	- Work around potential Metal bug with stage-in indirect buffers.
 	- Fix zero local threadgroup size in indirect tessellated rendering.
-	- Fix [[attribute]] assignment for tessellation evaluation shaders.
+	- Fix `[[attribute]]` assignment for tessellation evaluation shaders.
 - `VkSemaphore` optionally uses `MTLEvent`, if available and 
   `MVK_ALLOW_METAL_EVENTS` environment variable is enabled.
 - Add `vkSetWorkgroupSizeMVK()` to set compute kernel workgroup size 
@@ -69,7 +162,7 @@
 - Fix unused attachments terminating loop early.
 - Fix offset of buffer view relative to buffer offset within device memory.
 - Guard against missing Metal pipeline states when pipeline compilation fails.
-- MVKBuffer: Force managed storage for linear textures on shared buffers.
+- `MVKBuffer`: Force managed storage for linear textures on shared buffers.
 - Use device address space when decompressing DXT image data.
 - Added missing `texelBufferTextureWidth` setting in `MVKComputePipeline::getMTLFunction()`.
 - Fixes and consolidation of external library header references.
@@ -97,7 +190,7 @@
 	- MSL: Support Invariant qualifier on position.
 	- MSL: Support stencil export.
 	- Deal with case where a block is somehow emitted in a duplicated fashion.
-	- Fix infinite loop when OpAtomic* temporaries are used in other blocks.
+	- Fix infinite loop when `OpAtomic*` temporaries are used in other blocks.
 	- Fix tests for device->constant address space change in MSL tessellation control shader generation.
 	- Accept SPIR-V 1.4 version.
 
@@ -241,7 +334,7 @@
 - Allow default GPU Capture scope to be assigned to any queue in any queue family.
 - VkPhysicalDevice: Correct some features and limits.
 - Stop advertising atomic image support.
-- vkSetMTLTextureMVK() function retains texture object.
+- `vkSetMTLTextureMVK()` function retains texture object.
 - Log to stderr instead of stdout.
 - `fetchDependencies`: build `spirv-tools` when attached via symlink.
 - Enhancements to `MVKVector`, and set appropriate inline sizing usages.
@@ -568,7 +661,7 @@
 Released 2018/07/31
 
 - Disable rasterization and return void from vertex shaders that write to resources.
-- Add SPIRVToMSLConverterOptions::isRasterizationDisabled to allow pipeline and 
+- Add SPIRVToMSLConversionOptions::isRasterizationDisabled to allow pipeline and 
   vertex shader to communicate rasterization status.
 - Track layered rendering capability.    
 - Add MVKPhysicalDeviceMetalFeatures::layeredRendering.
diff --git a/ExternalDependencies.xcodeproj/project.pbxproj b/ExternalDependencies.xcodeproj/project.pbxproj
index d77a01a..80dc513 100644
--- a/ExternalDependencies.xcodeproj/project.pbxproj
+++ b/ExternalDependencies.xcodeproj/project.pbxproj
@@ -54,756 +54,6 @@
 		450A4F66221C5A95007203D7 /* spirv_reflect.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 450A4F63221C5A95007203D7 /* spirv_reflect.hpp */; };
 		450A4F67221C5A95007203D7 /* spirv_reflect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 450A4F64221C5A95007203D7 /* spirv_reflect.cpp */; };
 		450A4F68221C5A95007203D7 /* spirv_reflect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 450A4F64221C5A95007203D7 /* spirv_reflect.cpp */; };
-		A94A68EE22B17BBB00C661C6 /* spirv_target_env.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A673E22B17BBB00C661C6 /* spirv_target_env.cpp */; };
-		A94A68EF22B17BBB00C661C6 /* spirv_target_env.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A673E22B17BBB00C661C6 /* spirv_target_env.cpp */; };
-		A94A68F022B17BBB00C661C6 /* spirv_fuzzer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674022B17BBB00C661C6 /* spirv_fuzzer_options.h */; };
-		A94A68F122B17BBB00C661C6 /* spirv_fuzzer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674022B17BBB00C661C6 /* spirv_fuzzer_options.h */; };
-		A94A68F222B17BBB00C661C6 /* assembly_grammar.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674122B17BBB00C661C6 /* assembly_grammar.h */; };
-		A94A68F322B17BBB00C661C6 /* assembly_grammar.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674122B17BBB00C661C6 /* assembly_grammar.h */; };
-		A94A68F422B17BBB00C661C6 /* enum_set.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674222B17BBB00C661C6 /* enum_set.h */; };
-		A94A68F522B17BBB00C661C6 /* enum_set.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674222B17BBB00C661C6 /* enum_set.h */; };
-		A94A68F622B17BBB00C661C6 /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A674522B17BBB00C661C6 /* text.cpp */; };
-		A94A68F722B17BBB00C661C6 /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A674522B17BBB00C661C6 /* text.cpp */; };
-		A94A68F822B17BBB00C661C6 /* assembly_grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A674622B17BBB00C661C6 /* assembly_grammar.cpp */; };
-		A94A68F922B17BBB00C661C6 /* assembly_grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A674622B17BBB00C661C6 /* assembly_grammar.cpp */; };
-		A94A68FA22B17BBB00C661C6 /* text.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674722B17BBB00C661C6 /* text.h */; };
-		A94A68FB22B17BBB00C661C6 /* text.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674722B17BBB00C661C6 /* text.h */; };
-		A94A68FC22B17BBB00C661C6 /* extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A674822B17BBB00C661C6 /* extensions.cpp */; };
-		A94A68FD22B17BBB00C661C6 /* extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A674822B17BBB00C661C6 /* extensions.cpp */; };
-		A94A68FE22B17BBB00C661C6 /* pch_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A674922B17BBB00C661C6 /* pch_source.cpp */; };
-		A94A68FF22B17BBB00C661C6 /* pch_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A674922B17BBB00C661C6 /* pch_source.cpp */; };
-		A94A690022B17BBB00C661C6 /* parse_number.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674B22B17BBB00C661C6 /* parse_number.h */; };
-		A94A690122B17BBB00C661C6 /* parse_number.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674B22B17BBB00C661C6 /* parse_number.h */; };
-		A94A690222B17BBB00C661C6 /* ilist_node.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674C22B17BBB00C661C6 /* ilist_node.h */; };
-		A94A690322B17BBB00C661C6 /* ilist_node.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674C22B17BBB00C661C6 /* ilist_node.h */; };
-		A94A690422B17BBB00C661C6 /* make_unique.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674D22B17BBB00C661C6 /* make_unique.h */; };
-		A94A690522B17BBB00C661C6 /* make_unique.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674D22B17BBB00C661C6 /* make_unique.h */; };
-		A94A690622B17BBB00C661C6 /* string_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674E22B17BBB00C661C6 /* string_utils.h */; };
-		A94A690722B17BBB00C661C6 /* string_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674E22B17BBB00C661C6 /* string_utils.h */; };
-		A94A690822B17BBB00C661C6 /* small_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674F22B17BBB00C661C6 /* small_vector.h */; };
-		A94A690922B17BBB00C661C6 /* small_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A674F22B17BBB00C661C6 /* small_vector.h */; };
-		A94A690A22B17BBB00C661C6 /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675022B17BBB00C661C6 /* timer.cpp */; };
-		A94A690B22B17BBB00C661C6 /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675022B17BBB00C661C6 /* timer.cpp */; };
-		A94A690C22B17BBB00C661C6 /* timer.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675122B17BBB00C661C6 /* timer.h */; };
-		A94A690D22B17BBB00C661C6 /* timer.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675122B17BBB00C661C6 /* timer.h */; };
-		A94A690E22B17BBB00C661C6 /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675222B17BBB00C661C6 /* string_utils.cpp */; };
-		A94A690F22B17BBB00C661C6 /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675222B17BBB00C661C6 /* string_utils.cpp */; };
-		A94A691022B17BBB00C661C6 /* bit_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675322B17BBB00C661C6 /* bit_vector.h */; };
-		A94A691122B17BBB00C661C6 /* bit_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675322B17BBB00C661C6 /* bit_vector.h */; };
-		A94A691222B17BBB00C661C6 /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675422B17BBB00C661C6 /* bitutils.h */; };
-		A94A691322B17BBB00C661C6 /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675422B17BBB00C661C6 /* bitutils.h */; };
-		A94A691422B17BBB00C661C6 /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675522B17BBB00C661C6 /* hex_float.h */; };
-		A94A691522B17BBB00C661C6 /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675522B17BBB00C661C6 /* hex_float.h */; };
-		A94A691622B17BBB00C661C6 /* parse_number.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675622B17BBB00C661C6 /* parse_number.cpp */; };
-		A94A691722B17BBB00C661C6 /* parse_number.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675622B17BBB00C661C6 /* parse_number.cpp */; };
-		A94A691822B17BBB00C661C6 /* bit_vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675722B17BBB00C661C6 /* bit_vector.cpp */; };
-		A94A691922B17BBB00C661C6 /* bit_vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675722B17BBB00C661C6 /* bit_vector.cpp */; };
-		A94A691A22B17BBB00C661C6 /* ilist.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675822B17BBB00C661C6 /* ilist.h */; };
-		A94A691B22B17BBB00C661C6 /* ilist.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675822B17BBB00C661C6 /* ilist.h */; };
-		A94A691C22B17BBB00C661C6 /* spirv_target_env.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675922B17BBB00C661C6 /* spirv_target_env.h */; };
-		A94A691D22B17BBB00C661C6 /* spirv_target_env.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675922B17BBB00C661C6 /* spirv_target_env.h */; };
-		A94A691E22B17BBB00C661C6 /* table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675A22B17BBB00C661C6 /* table.cpp */; };
-		A94A691F22B17BBB00C661C6 /* table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675A22B17BBB00C661C6 /* table.cpp */; };
-		A94A692022B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675C22B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.h */; };
-		A94A692122B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675C22B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.h */; };
-		A94A692222B17BBB00C661C6 /* remove_selection_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675D22B17BBB00C661C6 /* remove_selection_reduction_opportunity.cpp */; };
-		A94A692322B17BBB00C661C6 /* remove_selection_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A675D22B17BBB00C661C6 /* remove_selection_reduction_opportunity.cpp */; };
-		A94A692422B17BBB00C661C6 /* remove_block_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675E22B17BBB00C661C6 /* remove_block_reduction_opportunity.h */; };
-		A94A692522B17BBB00C661C6 /* remove_block_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675E22B17BBB00C661C6 /* remove_block_reduction_opportunity.h */; };
-		A94A692622B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675F22B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.h */; };
-		A94A692722B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A675F22B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.h */; };
-		A94A692822B17BBB00C661C6 /* reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676022B17BBB00C661C6 /* reduction_pass.cpp */; };
-		A94A692922B17BBB00C661C6 /* reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676022B17BBB00C661C6 /* reduction_pass.cpp */; };
-		A94A692A22B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676122B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.cpp */; };
-		A94A692B22B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676122B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.cpp */; };
-		A94A692C22B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676222B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.h */; };
-		A94A692D22B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676222B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.h */; };
-		A94A692E22B17BBB00C661C6 /* reduction_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676422B17BBB00C661C6 /* reduction_util.cpp */; };
-		A94A692F22B17BBB00C661C6 /* reduction_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676422B17BBB00C661C6 /* reduction_util.cpp */; };
-		A94A693022B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676522B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.cpp */; };
-		A94A693122B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676522B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.cpp */; };
-		A94A693222B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676622B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.h */; };
-		A94A693322B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676622B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.h */; };
-		A94A693422B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676722B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.cpp */; };
-		A94A693522B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676722B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.cpp */; };
-		A94A693622B17BBB00C661C6 /* remove_instruction_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676822B17BBB00C661C6 /* remove_instruction_reduction_opportunity.h */; };
-		A94A693722B17BBB00C661C6 /* remove_instruction_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676822B17BBB00C661C6 /* remove_instruction_reduction_opportunity.h */; };
-		A94A693822B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676922B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h */; };
-		A94A693922B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676922B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h */; };
-		A94A693A22B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676A22B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.cpp */; };
-		A94A693B22B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676A22B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.cpp */; };
-		A94A693C22B17BBB00C661C6 /* remove_function_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676B22B17BBB00C661C6 /* remove_function_reduction_opportunity.cpp */; };
-		A94A693D22B17BBB00C661C6 /* remove_function_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676B22B17BBB00C661C6 /* remove_function_reduction_opportunity.cpp */; };
-		A94A693E22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676C22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.h */; };
-		A94A693F22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A676C22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.h */; };
-		A94A694022B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676D22B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.cpp */; };
-		A94A694122B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676D22B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.cpp */; };
-		A94A694222B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676E22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.cpp */; };
-		A94A694322B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676E22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.cpp */; };
-		A94A694422B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676F22B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp */; };
-		A94A694522B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A676F22B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp */; };
-		A94A694622B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677022B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.h */; };
-		A94A694722B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677022B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.h */; };
-		A94A694822B17BBB00C661C6 /* merge_blocks_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677122B17BBB00C661C6 /* merge_blocks_reduction_opportunity.cpp */; };
-		A94A694922B17BBB00C661C6 /* merge_blocks_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677122B17BBB00C661C6 /* merge_blocks_reduction_opportunity.cpp */; };
-		A94A694A22B17BBB00C661C6 /* change_operand_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677222B17BBB00C661C6 /* change_operand_reduction_opportunity.cpp */; };
-		A94A694B22B17BBB00C661C6 /* change_operand_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677222B17BBB00C661C6 /* change_operand_reduction_opportunity.cpp */; };
-		A94A694C22B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677322B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.h */; };
-		A94A694D22B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677322B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.h */; };
-		A94A694E22B17BBB00C661C6 /* remove_function_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677422B17BBB00C661C6 /* remove_function_reduction_opportunity.h */; };
-		A94A694F22B17BBB00C661C6 /* remove_function_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677422B17BBB00C661C6 /* remove_function_reduction_opportunity.h */; };
-		A94A695022B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677522B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.h */; };
-		A94A695122B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677522B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.h */; };
-		A94A695222B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677622B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp */; };
-		A94A695322B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677622B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp */; };
-		A94A695422B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677722B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.h */; };
-		A94A695522B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677722B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.h */; };
-		A94A695622B17BBB00C661C6 /* remove_selection_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677822B17BBB00C661C6 /* remove_selection_reduction_opportunity.h */; };
-		A94A695722B17BBB00C661C6 /* remove_selection_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677822B17BBB00C661C6 /* remove_selection_reduction_opportunity.h */; };
-		A94A695822B17BBB00C661C6 /* remove_instruction_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677922B17BBB00C661C6 /* remove_instruction_reduction_opportunity.cpp */; };
-		A94A695922B17BBB00C661C6 /* remove_instruction_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677922B17BBB00C661C6 /* remove_instruction_reduction_opportunity.cpp */; };
-		A94A695A22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677A22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.h */; };
-		A94A695B22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677A22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.h */; };
-		A94A695C22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677B22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.h */; };
-		A94A695D22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A677B22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.h */; };
-		A94A695E22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677C22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.cpp */; };
-		A94A695F22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677C22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.cpp */; };
-		A94A696022B17BBB00C661C6 /* pch_source_reduce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677D22B17BBB00C661C6 /* pch_source_reduce.cpp */; };
-		A94A696122B17BBB00C661C6 /* pch_source_reduce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677D22B17BBB00C661C6 /* pch_source_reduce.cpp */; };
-		A94A696222B17BBB00C661C6 /* reducer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677E22B17BBB00C661C6 /* reducer.cpp */; };
-		A94A696322B17BBB00C661C6 /* reducer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677E22B17BBB00C661C6 /* reducer.cpp */; };
-		A94A696422B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677F22B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.cpp */; };
-		A94A696522B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A677F22B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.cpp */; };
-		A94A696622B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678022B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.h */; };
-		A94A696722B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678022B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.h */; };
-		A94A696822B17BBB00C661C6 /* pch_source_reduce.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678122B17BBB00C661C6 /* pch_source_reduce.h */; };
-		A94A696922B17BBB00C661C6 /* pch_source_reduce.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678122B17BBB00C661C6 /* pch_source_reduce.h */; };
-		A94A696A22B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678222B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.h */; };
-		A94A696B22B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678222B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.h */; };
-		A94A696C22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678322B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.cpp */; };
-		A94A696D22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678322B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.cpp */; };
-		A94A696E22B17BBB00C661C6 /* reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678422B17BBB00C661C6 /* reduction_opportunity.cpp */; };
-		A94A696F22B17BBB00C661C6 /* reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678422B17BBB00C661C6 /* reduction_opportunity.cpp */; };
-		A94A697022B17BBB00C661C6 /* reducer.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678522B17BBB00C661C6 /* reducer.h */; };
-		A94A697122B17BBB00C661C6 /* reducer.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678522B17BBB00C661C6 /* reducer.h */; };
-		A94A697222B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678622B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.cpp */; };
-		A94A697322B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678622B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.cpp */; };
-		A94A697422B17BBB00C661C6 /* reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678722B17BBB00C661C6 /* reduction_opportunity.h */; };
-		A94A697522B17BBB00C661C6 /* reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678722B17BBB00C661C6 /* reduction_opportunity.h */; };
-		A94A697622B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678822B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h */; };
-		A94A697722B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678822B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h */; };
-		A94A697822B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678922B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.cpp */; };
-		A94A697922B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678922B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.cpp */; };
-		A94A697A22B17BBB00C661C6 /* reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678A22B17BBB00C661C6 /* reduction_opportunity_finder.h */; };
-		A94A697B22B17BBB00C661C6 /* reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678A22B17BBB00C661C6 /* reduction_opportunity_finder.h */; };
-		A94A697C22B17BBB00C661C6 /* change_operand_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678B22B17BBB00C661C6 /* change_operand_reduction_opportunity.h */; };
-		A94A697D22B17BBB00C661C6 /* change_operand_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678B22B17BBB00C661C6 /* change_operand_reduction_opportunity.h */; };
-		A94A697E22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678C22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.h */; };
-		A94A697F22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678C22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.h */; };
-		A94A698022B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678D22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.cpp */; };
-		A94A698122B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A678D22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.cpp */; };
-		A94A698222B17BBB00C661C6 /* reduction_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678E22B17BBB00C661C6 /* reduction_util.h */; };
-		A94A698322B17BBB00C661C6 /* reduction_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678E22B17BBB00C661C6 /* reduction_util.h */; };
-		A94A698422B17BBB00C661C6 /* merge_blocks_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678F22B17BBB00C661C6 /* merge_blocks_reduction_opportunity.h */; };
-		A94A698522B17BBB00C661C6 /* merge_blocks_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A678F22B17BBB00C661C6 /* merge_blocks_reduction_opportunity.h */; };
-		A94A698622B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679022B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp */; };
-		A94A698722B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679022B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp */; };
-		A94A698822B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679122B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.cpp */; };
-		A94A698922B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679122B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.cpp */; };
-		A94A698A22B17BBB00C661C6 /* remove_block_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679222B17BBB00C661C6 /* remove_block_reduction_opportunity.cpp */; };
-		A94A698B22B17BBB00C661C6 /* remove_block_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679222B17BBB00C661C6 /* remove_block_reduction_opportunity.cpp */; };
-		A94A698C22B17BBB00C661C6 /* reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679322B17BBB00C661C6 /* reduction_pass.h */; };
-		A94A698D22B17BBB00C661C6 /* reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679322B17BBB00C661C6 /* reduction_pass.h */; };
-		A94A698E22B17BBB00C661C6 /* latest_version_opencl_std_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679422B17BBB00C661C6 /* latest_version_opencl_std_header.h */; };
-		A94A698F22B17BBB00C661C6 /* latest_version_opencl_std_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679422B17BBB00C661C6 /* latest_version_opencl_std_header.h */; };
-		A94A699022B17BBB00C661C6 /* spirv_optimizer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679522B17BBB00C661C6 /* spirv_optimizer_options.cpp */; };
-		A94A699122B17BBB00C661C6 /* spirv_optimizer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679522B17BBB00C661C6 /* spirv_optimizer_options.cpp */; };
-		A94A699222B17BBB00C661C6 /* cfa.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679622B17BBB00C661C6 /* cfa.h */; };
-		A94A699322B17BBB00C661C6 /* cfa.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679622B17BBB00C661C6 /* cfa.h */; };
-		A94A699422B17BBB00C661C6 /* pch_source.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679722B17BBB00C661C6 /* pch_source.h */; };
-		A94A699522B17BBB00C661C6 /* pch_source.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679722B17BBB00C661C6 /* pch_source.h */; };
-		A94A699622B17BBB00C661C6 /* enum_string_mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679822B17BBB00C661C6 /* enum_string_mapping.h */; };
-		A94A699722B17BBB00C661C6 /* enum_string_mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679822B17BBB00C661C6 /* enum_string_mapping.h */; };
-		A94A699822B17BBB00C661C6 /* spirv_fuzzer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679922B17BBB00C661C6 /* spirv_fuzzer_options.cpp */; };
-		A94A699922B17BBB00C661C6 /* spirv_fuzzer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679922B17BBB00C661C6 /* spirv_fuzzer_options.cpp */; };
-		A94A699A22B17BBB00C661C6 /* spirv_reducer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679A22B17BBB00C661C6 /* spirv_reducer_options.h */; };
-		A94A699B22B17BBB00C661C6 /* spirv_reducer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679A22B17BBB00C661C6 /* spirv_reducer_options.h */; };
-		A94A699C22B17BBB00C661C6 /* spirv_validator_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679B22B17BBB00C661C6 /* spirv_validator_options.cpp */; };
-		A94A699D22B17BBB00C661C6 /* spirv_validator_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679B22B17BBB00C661C6 /* spirv_validator_options.cpp */; };
-		A94A699E22B17BBB00C661C6 /* print.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679D22B17BBB00C661C6 /* print.cpp */; };
-		A94A699F22B17BBB00C661C6 /* print.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A679D22B17BBB00C661C6 /* print.cpp */; };
-		A94A69A022B17BBB00C661C6 /* spirv_definition.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679E22B17BBB00C661C6 /* spirv_definition.h */; };
-		A94A69A122B17BBB00C661C6 /* spirv_definition.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679E22B17BBB00C661C6 /* spirv_definition.h */; };
-		A94A69A222B17BBB00C661C6 /* operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679F22B17BBB00C661C6 /* operand.h */; };
-		A94A69A322B17BBB00C661C6 /* operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A679F22B17BBB00C661C6 /* operand.h */; };
-		A94A69A422B17BBB00C661C6 /* spirv_endian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67A022B17BBB00C661C6 /* spirv_endian.cpp */; };
-		A94A69A522B17BBB00C661C6 /* spirv_endian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67A022B17BBB00C661C6 /* spirv_endian.cpp */; };
-		A94A69A622B17BBB00C661C6 /* macro.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A122B17BBB00C661C6 /* macro.h */; };
-		A94A69A722B17BBB00C661C6 /* macro.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A122B17BBB00C661C6 /* macro.h */; };
-		A94A69A822B17BBB00C661C6 /* spirv_constant.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A222B17BBB00C661C6 /* spirv_constant.h */; };
-		A94A69A922B17BBB00C661C6 /* spirv_constant.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A222B17BBB00C661C6 /* spirv_constant.h */; };
-		A94A69AA22B17BBB00C661C6 /* binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67A422B17BBB00C661C6 /* binary.cpp */; };
-		A94A69AB22B17BBB00C661C6 /* binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67A422B17BBB00C661C6 /* binary.cpp */; };
-		A94A69AC22B17BBB00C661C6 /* spirv_validator_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A522B17BBB00C661C6 /* spirv_validator_options.h */; };
-		A94A69AD22B17BBB00C661C6 /* spirv_validator_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A522B17BBB00C661C6 /* spirv_validator_options.h */; };
-		A94A69AE22B17BBB00C661C6 /* enum_string_mapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67A622B17BBB00C661C6 /* enum_string_mapping.cpp */; };
-		A94A69AF22B17BBB00C661C6 /* enum_string_mapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67A622B17BBB00C661C6 /* enum_string_mapping.cpp */; };
-		A94A69B022B17BBB00C661C6 /* text_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A722B17BBB00C661C6 /* text_handler.h */; };
-		A94A69B122B17BBB00C661C6 /* text_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A722B17BBB00C661C6 /* text_handler.h */; };
-		A94A69B222B17BBB00C661C6 /* parsed_operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A822B17BBB00C661C6 /* parsed_operand.h */; };
-		A94A69B322B17BBB00C661C6 /* parsed_operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A822B17BBB00C661C6 /* parsed_operand.h */; };
-		A94A69B422B17BBB00C661C6 /* name_mapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A922B17BBB00C661C6 /* name_mapper.h */; };
-		A94A69B522B17BBB00C661C6 /* name_mapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67A922B17BBB00C661C6 /* name_mapper.h */; };
-		A94A69B622B17BBB00C661C6 /* spirv_reducer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67AA22B17BBB00C661C6 /* spirv_reducer_options.cpp */; };
-		A94A69B722B17BBB00C661C6 /* spirv_reducer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67AA22B17BBB00C661C6 /* spirv_reducer_options.cpp */; };
-		A94A69B822B17BBB00C661C6 /* parsed_operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67AB22B17BBB00C661C6 /* parsed_operand.cpp */; };
-		A94A69B922B17BBB00C661C6 /* parsed_operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67AB22B17BBB00C661C6 /* parsed_operand.cpp */; };
-		A94A69BA22B17BBB00C661C6 /* diagnostic.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67AC22B17BBB00C661C6 /* diagnostic.h */; };
-		A94A69BB22B17BBB00C661C6 /* diagnostic.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67AC22B17BBB00C661C6 /* diagnostic.h */; };
-		A94A69BC22B17BBB00C661C6 /* spirv_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67AD22B17BBB00C661C6 /* spirv_endian.h */; };
-		A94A69BD22B17BBB00C661C6 /* spirv_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67AD22B17BBB00C661C6 /* spirv_endian.h */; };
-		A94A69BE22B17BBB00C661C6 /* name_mapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67AE22B17BBB00C661C6 /* name_mapper.cpp */; };
-		A94A69BF22B17BBB00C661C6 /* name_mapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67AE22B17BBB00C661C6 /* name_mapper.cpp */; };
-		A94A69C022B17BBB00C661C6 /* linker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B222B17BBB00C661C6 /* linker.cpp */; };
-		A94A69C122B17BBB00C661C6 /* linker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B222B17BBB00C661C6 /* linker.cpp */; };
-		A94A69C222B17BBC00C661C6 /* software_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B322B17BBB00C661C6 /* software_version.cpp */; };
-		A94A69C322B17BBC00C661C6 /* software_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B322B17BBB00C661C6 /* software_version.cpp */; };
-		A94A69C422B17BBC00C661C6 /* opcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B422B17BBB00C661C6 /* opcode.cpp */; };
-		A94A69C522B17BBC00C661C6 /* opcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B422B17BBB00C661C6 /* opcode.cpp */; };
-		A94A69C622B17BBC00C661C6 /* print.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67B522B17BBB00C661C6 /* print.h */; };
-		A94A69C722B17BBC00C661C6 /* print.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67B522B17BBB00C661C6 /* print.h */; };
-		A94A69C822B17BBC00C661C6 /* ext_inst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B622B17BBB00C661C6 /* ext_inst.cpp */; };
-		A94A69C922B17BBC00C661C6 /* ext_inst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B622B17BBB00C661C6 /* ext_inst.cpp */; };
-		A94A69CA22B17BBC00C661C6 /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67B722B17BBB00C661C6 /* disassemble.h */; };
-		A94A69CB22B17BBC00C661C6 /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67B722B17BBB00C661C6 /* disassemble.h */; };
-		A94A69CC22B17BBC00C661C6 /* optimizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B922B17BBB00C661C6 /* optimizer.cpp */; };
-		A94A69CD22B17BBC00C661C6 /* optimizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67B922B17BBB00C661C6 /* optimizer.cpp */; };
-		A94A69CE22B17BBC00C661C6 /* if_conversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67BA22B17BBB00C661C6 /* if_conversion.h */; };
-		A94A69CF22B17BBC00C661C6 /* if_conversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67BA22B17BBB00C661C6 /* if_conversion.h */; };
-		A94A69D022B17BBC00C661C6 /* register_pressure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67BB22B17BBB00C661C6 /* register_pressure.cpp */; };
-		A94A69D122B17BBC00C661C6 /* register_pressure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67BB22B17BBB00C661C6 /* register_pressure.cpp */; };
-		A94A69D222B17BBC00C661C6 /* loop_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67BC22B17BBB00C661C6 /* loop_utils.cpp */; };
-		A94A69D322B17BBC00C661C6 /* loop_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67BC22B17BBB00C661C6 /* loop_utils.cpp */; };
-		A94A69D422B17BBC00C661C6 /* merge_return_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67BD22B17BBB00C661C6 /* merge_return_pass.h */; };
-		A94A69D522B17BBC00C661C6 /* merge_return_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67BD22B17BBB00C661C6 /* merge_return_pass.h */; };
-		A94A69D622B17BBC00C661C6 /* inline_opaque_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67BE22B17BBB00C661C6 /* inline_opaque_pass.h */; };
-		A94A69D722B17BBC00C661C6 /* inline_opaque_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67BE22B17BBB00C661C6 /* inline_opaque_pass.h */; };
-		A94A69D822B17BBC00C661C6 /* loop_fusion.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67BF22B17BBB00C661C6 /* loop_fusion.h */; };
-		A94A69D922B17BBC00C661C6 /* loop_fusion.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67BF22B17BBB00C661C6 /* loop_fusion.h */; };
-		A94A69DA22B17BBC00C661C6 /* combine_access_chains.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67C022B17BBB00C661C6 /* combine_access_chains.cpp */; };
-		A94A69DB22B17BBC00C661C6 /* combine_access_chains.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67C022B17BBB00C661C6 /* combine_access_chains.cpp */; };
-		A94A69DC22B17BBC00C661C6 /* build_module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67C122B17BBB00C661C6 /* build_module.cpp */; };
-		A94A69DD22B17BBC00C661C6 /* build_module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67C122B17BBB00C661C6 /* build_module.cpp */; };
-		A94A69DE22B17BBC00C661C6 /* composite.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C222B17BBB00C661C6 /* composite.h */; };
-		A94A69DF22B17BBC00C661C6 /* composite.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C222B17BBB00C661C6 /* composite.h */; };
-		A94A69E022B17BBC00C661C6 /* compact_ids_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C322B17BBB00C661C6 /* compact_ids_pass.h */; };
-		A94A69E122B17BBC00C661C6 /* compact_ids_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C322B17BBB00C661C6 /* compact_ids_pass.h */; };
-		A94A69E222B17BBC00C661C6 /* register_pressure.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C422B17BBB00C661C6 /* register_pressure.h */; };
-		A94A69E322B17BBC00C661C6 /* register_pressure.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C422B17BBB00C661C6 /* register_pressure.h */; };
-		A94A69E422B17BBC00C661C6 /* tree_iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C522B17BBB00C661C6 /* tree_iterator.h */; };
-		A94A69E522B17BBC00C661C6 /* tree_iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C522B17BBB00C661C6 /* tree_iterator.h */; };
-		A94A69E622B17BBC00C661C6 /* strip_atomic_counter_memory_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C622B17BBB00C661C6 /* strip_atomic_counter_memory_pass.h */; };
-		A94A69E722B17BBC00C661C6 /* strip_atomic_counter_memory_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C622B17BBB00C661C6 /* strip_atomic_counter_memory_pass.h */; };
-		A94A69E822B17BBC00C661C6 /* legalize_vector_shuffle_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C722B17BBB00C661C6 /* legalize_vector_shuffle_pass.h */; };
-		A94A69E922B17BBC00C661C6 /* legalize_vector_shuffle_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C722B17BBB00C661C6 /* legalize_vector_shuffle_pass.h */; };
-		A94A69EA22B17BBC00C661C6 /* local_single_store_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C822B17BBB00C661C6 /* local_single_store_elim_pass.h */; };
-		A94A69EB22B17BBC00C661C6 /* local_single_store_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C822B17BBB00C661C6 /* local_single_store_elim_pass.h */; };
-		A94A69EC22B17BBC00C661C6 /* reduce_load_size.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C922B17BBB00C661C6 /* reduce_load_size.h */; };
-		A94A69ED22B17BBC00C661C6 /* reduce_load_size.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67C922B17BBB00C661C6 /* reduce_load_size.h */; };
-		A94A69EE22B17BBC00C661C6 /* code_sink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67CA22B17BBB00C661C6 /* code_sink.cpp */; };
-		A94A69EF22B17BBC00C661C6 /* code_sink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67CA22B17BBB00C661C6 /* code_sink.cpp */; };
-		A94A69F022B17BBC00C661C6 /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67CB22B17BBB00C661C6 /* types.cpp */; };
-		A94A69F122B17BBC00C661C6 /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67CB22B17BBB00C661C6 /* types.cpp */; };
-		A94A69F222B17BBC00C661C6 /* scalar_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67CC22B17BBB00C661C6 /* scalar_analysis.h */; };
-		A94A69F322B17BBC00C661C6 /* scalar_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67CC22B17BBB00C661C6 /* scalar_analysis.h */; };
-		A94A69F422B17BBC00C661C6 /* strip_debug_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67CD22B17BBB00C661C6 /* strip_debug_info_pass.h */; };
-		A94A69F522B17BBC00C661C6 /* strip_debug_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67CD22B17BBB00C661C6 /* strip_debug_info_pass.h */; };
-		A94A69F622B17BBC00C661C6 /* cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67CE22B17BBB00C661C6 /* cfg.cpp */; };
-		A94A69F722B17BBC00C661C6 /* cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67CE22B17BBB00C661C6 /* cfg.cpp */; };
-		A94A69F822B17BBC00C661C6 /* strip_atomic_counter_memory_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67CF22B17BBB00C661C6 /* strip_atomic_counter_memory_pass.cpp */; };
-		A94A69F922B17BBC00C661C6 /* strip_atomic_counter_memory_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67CF22B17BBB00C661C6 /* strip_atomic_counter_memory_pass.cpp */; };
-		A94A69FA22B17BBC00C661C6 /* decoration_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D022B17BBB00C661C6 /* decoration_manager.cpp */; };
-		A94A69FB22B17BBC00C661C6 /* decoration_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D022B17BBB00C661C6 /* decoration_manager.cpp */; };
-		A94A69FC22B17BBC00C661C6 /* local_single_block_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D122B17BBB00C661C6 /* local_single_block_elim_pass.cpp */; };
-		A94A69FD22B17BBC00C661C6 /* local_single_block_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D122B17BBB00C661C6 /* local_single_block_elim_pass.cpp */; };
-		A94A69FE22B17BBC00C661C6 /* freeze_spec_constant_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D222B17BBB00C661C6 /* freeze_spec_constant_value_pass.cpp */; };
-		A94A69FF22B17BBC00C661C6 /* freeze_spec_constant_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D222B17BBB00C661C6 /* freeze_spec_constant_value_pass.cpp */; };
-		A94A6A0022B17BBC00C661C6 /* replace_invalid_opc.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67D322B17BBB00C661C6 /* replace_invalid_opc.h */; };
-		A94A6A0122B17BBC00C661C6 /* replace_invalid_opc.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67D322B17BBB00C661C6 /* replace_invalid_opc.h */; };
-		A94A6A0222B17BBC00C661C6 /* local_access_chain_convert_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67D422B17BBB00C661C6 /* local_access_chain_convert_pass.h */; };
-		A94A6A0322B17BBC00C661C6 /* local_access_chain_convert_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67D422B17BBB00C661C6 /* local_access_chain_convert_pass.h */; };
-		A94A6A0422B17BBC00C661C6 /* inst_bindless_check_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D522B17BBB00C661C6 /* inst_bindless_check_pass.cpp */; };
-		A94A6A0522B17BBC00C661C6 /* inst_bindless_check_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D522B17BBB00C661C6 /* inst_bindless_check_pass.cpp */; };
-		A94A6A0622B17BBC00C661C6 /* local_redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D622B17BBB00C661C6 /* local_redundancy_elimination.cpp */; };
-		A94A6A0722B17BBC00C661C6 /* local_redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D622B17BBB00C661C6 /* local_redundancy_elimination.cpp */; };
-		A94A6A0822B17BBC00C661C6 /* instrument_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D822B17BBB00C661C6 /* instrument_pass.cpp */; };
-		A94A6A0922B17BBC00C661C6 /* instrument_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67D822B17BBB00C661C6 /* instrument_pass.cpp */; };
-		A94A6A0A22B17BBC00C661C6 /* propagator.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67D922B17BBB00C661C6 /* propagator.h */; };
-		A94A6A0B22B17BBC00C661C6 /* propagator.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67D922B17BBB00C661C6 /* propagator.h */; };
-		A94A6A0C22B17BBC00C661C6 /* instruction_list.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67DA22B17BBB00C661C6 /* instruction_list.h */; };
-		A94A6A0D22B17BBC00C661C6 /* instruction_list.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67DA22B17BBB00C661C6 /* instruction_list.h */; };
-		A94A6A0E22B17BBC00C661C6 /* feature_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DB22B17BBB00C661C6 /* feature_manager.cpp */; };
-		A94A6A0F22B17BBC00C661C6 /* feature_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DB22B17BBB00C661C6 /* feature_manager.cpp */; };
-		A94A6A1022B17BBC00C661C6 /* pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DC22B17BBB00C661C6 /* pass.cpp */; };
-		A94A6A1122B17BBC00C661C6 /* pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DC22B17BBB00C661C6 /* pass.cpp */; };
-		A94A6A1222B17BBC00C661C6 /* loop_fission.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DD22B17BBB00C661C6 /* loop_fission.cpp */; };
-		A94A6A1322B17BBC00C661C6 /* loop_fission.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DD22B17BBB00C661C6 /* loop_fission.cpp */; };
-		A94A6A1422B17BBC00C661C6 /* dominator_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DE22B17BBB00C661C6 /* dominator_tree.cpp */; };
-		A94A6A1522B17BBC00C661C6 /* dominator_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DE22B17BBB00C661C6 /* dominator_tree.cpp */; };
-		A94A6A1622B17BBC00C661C6 /* merge_return_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DF22B17BBB00C661C6 /* merge_return_pass.cpp */; };
-		A94A6A1722B17BBC00C661C6 /* merge_return_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67DF22B17BBB00C661C6 /* merge_return_pass.cpp */; };
-		A94A6A1822B17BBC00C661C6 /* ir_context.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67E022B17BBB00C661C6 /* ir_context.h */; };
-		A94A6A1922B17BBC00C661C6 /* ir_context.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67E022B17BBB00C661C6 /* ir_context.h */; };
-		A94A6A1A22B17BBC00C661C6 /* eliminate_dead_constant_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E122B17BBB00C661C6 /* eliminate_dead_constant_pass.cpp */; };
-		A94A6A1B22B17BBC00C661C6 /* eliminate_dead_constant_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E122B17BBB00C661C6 /* eliminate_dead_constant_pass.cpp */; };
-		A94A6A1C22B17BBC00C661C6 /* cfg_cleanup_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E222B17BBB00C661C6 /* cfg_cleanup_pass.cpp */; };
-		A94A6A1D22B17BBC00C661C6 /* cfg_cleanup_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E222B17BBB00C661C6 /* cfg_cleanup_pass.cpp */; };
-		A94A6A1E22B17BBC00C661C6 /* const_folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E322B17BBB00C661C6 /* const_folding_rules.cpp */; };
-		A94A6A1F22B17BBC00C661C6 /* const_folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E322B17BBB00C661C6 /* const_folding_rules.cpp */; };
-		A94A6A2022B17BBC00C661C6 /* loop_unroller.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67E422B17BBB00C661C6 /* loop_unroller.h */; };
-		A94A6A2122B17BBC00C661C6 /* loop_unroller.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67E422B17BBB00C661C6 /* loop_unroller.h */; };
-		A94A6A2222B17BBC00C661C6 /* strip_debug_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E522B17BBB00C661C6 /* strip_debug_info_pass.cpp */; };
-		A94A6A2322B17BBC00C661C6 /* strip_debug_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E522B17BBB00C661C6 /* strip_debug_info_pass.cpp */; };
-		A94A6A2422B17BBC00C661C6 /* ssa_rewrite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E622B17BBB00C661C6 /* ssa_rewrite_pass.cpp */; };
-		A94A6A2522B17BBC00C661C6 /* ssa_rewrite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E622B17BBB00C661C6 /* ssa_rewrite_pass.cpp */; };
-		A94A6A2622B17BBC00C661C6 /* loop_dependence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E722B17BBB00C661C6 /* loop_dependence.cpp */; };
-		A94A6A2722B17BBC00C661C6 /* loop_dependence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67E722B17BBB00C661C6 /* loop_dependence.cpp */; };
-		A94A6A2822B17BBC00C661C6 /* unify_const_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67E822B17BBB00C661C6 /* unify_const_pass.h */; };
-		A94A6A2922B17BBC00C661C6 /* unify_const_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67E822B17BBB00C661C6 /* unify_const_pass.h */; };
-		A94A6A2A22B17BBC00C661C6 /* ir_loader.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67E922B17BBB00C661C6 /* ir_loader.h */; };
-		A94A6A2B22B17BBC00C661C6 /* ir_loader.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67E922B17BBB00C661C6 /* ir_loader.h */; };
-		A94A6A2C22B17BBC00C661C6 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67EA22B17BBB00C661C6 /* types.h */; };
-		A94A6A2D22B17BBC00C661C6 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67EA22B17BBB00C661C6 /* types.h */; };
-		A94A6A2E22B17BBC00C661C6 /* fold_spec_constant_op_and_composite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67EB22B17BBB00C661C6 /* fold_spec_constant_op_and_composite_pass.h */; };
-		A94A6A2F22B17BBC00C661C6 /* fold_spec_constant_op_and_composite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67EB22B17BBB00C661C6 /* fold_spec_constant_op_and_composite_pass.h */; };
-		A94A6A3022B17BBC00C661C6 /* mem_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67EC22B17BBB00C661C6 /* mem_pass.cpp */; };
-		A94A6A3122B17BBC00C661C6 /* mem_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67EC22B17BBB00C661C6 /* mem_pass.cpp */; };
-		A94A6A3222B17BBC00C661C6 /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67ED22B17BBB00C661C6 /* basic_block.h */; };
-		A94A6A3322B17BBC00C661C6 /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67ED22B17BBB00C661C6 /* basic_block.h */; };
-		A94A6A3422B17BBC00C661C6 /* remove_duplicates_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67EE22B17BBB00C661C6 /* remove_duplicates_pass.cpp */; };
-		A94A6A3522B17BBC00C661C6 /* remove_duplicates_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67EE22B17BBB00C661C6 /* remove_duplicates_pass.cpp */; };
-		A94A6A3622B17BBC00C661C6 /* dead_variable_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67EF22B17BBB00C661C6 /* dead_variable_elimination.cpp */; };
-		A94A6A3722B17BBC00C661C6 /* dead_variable_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67EF22B17BBB00C661C6 /* dead_variable_elimination.cpp */; };
-		A94A6A3822B17BBC00C661C6 /* block_merge_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67F022B17BBB00C661C6 /* block_merge_pass.h */; };
-		A94A6A3922B17BBC00C661C6 /* block_merge_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67F022B17BBB00C661C6 /* block_merge_pass.h */; };
-		A94A6A3A22B17BBC00C661C6 /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F122B17BBB00C661C6 /* module.cpp */; };
-		A94A6A3B22B17BBC00C661C6 /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F122B17BBB00C661C6 /* module.cpp */; };
-		A94A6A3C22B17BBC00C661C6 /* fold_spec_constant_op_and_composite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F222B17BBB00C661C6 /* fold_spec_constant_op_and_composite_pass.cpp */; };
-		A94A6A3D22B17BBC00C661C6 /* fold_spec_constant_op_and_composite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F222B17BBB00C661C6 /* fold_spec_constant_op_and_composite_pass.cpp */; };
-		A94A6A3E22B17BBC00C661C6 /* loop_unswitch_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F322B17BBB00C661C6 /* loop_unswitch_pass.cpp */; };
-		A94A6A3F22B17BBC00C661C6 /* loop_unswitch_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F322B17BBB00C661C6 /* loop_unswitch_pass.cpp */; };
-		A94A6A4022B17BBC00C661C6 /* unify_const_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F422B17BBB00C661C6 /* unify_const_pass.cpp */; };
-		A94A6A4122B17BBC00C661C6 /* unify_const_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F422B17BBB00C661C6 /* unify_const_pass.cpp */; };
-		A94A6A4222B17BBC00C661C6 /* type_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F522B17BBB00C661C6 /* type_manager.cpp */; };
-		A94A6A4322B17BBC00C661C6 /* type_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F522B17BBB00C661C6 /* type_manager.cpp */; };
-		A94A6A4422B17BBC00C661C6 /* generate_webgpu_initializers_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F622B17BBB00C661C6 /* generate_webgpu_initializers_pass.cpp */; };
-		A94A6A4522B17BBC00C661C6 /* generate_webgpu_initializers_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F622B17BBB00C661C6 /* generate_webgpu_initializers_pass.cpp */; };
-		A94A6A4622B17BBC00C661C6 /* private_to_local_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67F722B17BBB00C661C6 /* private_to_local_pass.h */; };
-		A94A6A4722B17BBC00C661C6 /* private_to_local_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67F722B17BBB00C661C6 /* private_to_local_pass.h */; };
-		A94A6A4822B17BBC00C661C6 /* inline_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F822B17BBB00C661C6 /* inline_pass.cpp */; };
-		A94A6A4922B17BBC00C661C6 /* inline_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67F822B17BBB00C661C6 /* inline_pass.cpp */; };
-		A94A6A4A22B17BBC00C661C6 /* def_use_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67F922B17BBB00C661C6 /* def_use_manager.h */; };
-		A94A6A4B22B17BBC00C661C6 /* def_use_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67F922B17BBB00C661C6 /* def_use_manager.h */; };
-		A94A6A4C22B17BBC00C661C6 /* ir_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67FA22B17BBB00C661C6 /* ir_loader.cpp */; };
-		A94A6A4D22B17BBC00C661C6 /* ir_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67FA22B17BBB00C661C6 /* ir_loader.cpp */; };
-		A94A6A4E22B17BBC00C661C6 /* cfg_cleanup_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67FB22B17BBB00C661C6 /* cfg_cleanup_pass.h */; };
-		A94A6A4F22B17BBC00C661C6 /* cfg_cleanup_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67FB22B17BBB00C661C6 /* cfg_cleanup_pass.h */; };
-		A94A6A5022B17BBC00C661C6 /* licm_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67FC22B17BBB00C661C6 /* licm_pass.cpp */; };
-		A94A6A5122B17BBC00C661C6 /* licm_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67FC22B17BBB00C661C6 /* licm_pass.cpp */; };
-		A94A6A5222B17BBC00C661C6 /* eliminate_dead_functions_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67FD22B17BBB00C661C6 /* eliminate_dead_functions_pass.cpp */; };
-		A94A6A5322B17BBC00C661C6 /* eliminate_dead_functions_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67FD22B17BBB00C661C6 /* eliminate_dead_functions_pass.cpp */; };
-		A94A6A5422B17BBC00C661C6 /* local_redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67FE22B17BBB00C661C6 /* local_redundancy_elimination.h */; };
-		A94A6A5522B17BBC00C661C6 /* local_redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A67FE22B17BBB00C661C6 /* local_redundancy_elimination.h */; };
-		A94A6A5622B17BBC00C661C6 /* split_invalid_unreachable_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67FF22B17BBB00C661C6 /* split_invalid_unreachable_pass.cpp */; };
-		A94A6A5722B17BBC00C661C6 /* split_invalid_unreachable_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A67FF22B17BBB00C661C6 /* split_invalid_unreachable_pass.cpp */; };
-		A94A6A5822B17BBC00C661C6 /* loop_peeling.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680022B17BBB00C661C6 /* loop_peeling.h */; };
-		A94A6A5922B17BBC00C661C6 /* loop_peeling.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680022B17BBB00C661C6 /* loop_peeling.h */; };
-		A94A6A5A22B17BBC00C661C6 /* vector_dce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680122B17BBB00C661C6 /* vector_dce.cpp */; };
-		A94A6A5B22B17BBC00C661C6 /* vector_dce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680122B17BBB00C661C6 /* vector_dce.cpp */; };
-		A94A6A5C22B17BBC00C661C6 /* block_merge_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680222B17BBB00C661C6 /* block_merge_util.h */; };
-		A94A6A5D22B17BBC00C661C6 /* block_merge_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680222B17BBB00C661C6 /* block_merge_util.h */; };
-		A94A6A5E22B17BBC00C661C6 /* loop_unroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680322B17BBB00C661C6 /* loop_unroller.cpp */; };
-		A94A6A5F22B17BBC00C661C6 /* loop_unroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680322B17BBB00C661C6 /* loop_unroller.cpp */; };
-		A94A6A6022B17BBC00C661C6 /* constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680422B17BBB00C661C6 /* constants.cpp */; };
-		A94A6A6122B17BBC00C661C6 /* constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680422B17BBB00C661C6 /* constants.cpp */; };
-		A94A6A6222B17BBC00C661C6 /* loop_fusion_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680522B17BBB00C661C6 /* loop_fusion_pass.h */; };
-		A94A6A6322B17BBC00C661C6 /* loop_fusion_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680522B17BBB00C661C6 /* loop_fusion_pass.h */; };
-		A94A6A6422B17BBC00C661C6 /* struct_cfg_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680622B17BBB00C661C6 /* struct_cfg_analysis.h */; };
-		A94A6A6522B17BBC00C661C6 /* struct_cfg_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680622B17BBB00C661C6 /* struct_cfg_analysis.h */; };
-		A94A6A6622B17BBC00C661C6 /* common_uniform_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680722B17BBB00C661C6 /* common_uniform_elim_pass.cpp */; };
-		A94A6A6722B17BBC00C661C6 /* common_uniform_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680722B17BBB00C661C6 /* common_uniform_elim_pass.cpp */; };
-		A94A6A6822B17BBC00C661C6 /* def_use_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680822B17BBB00C661C6 /* def_use_manager.cpp */; };
-		A94A6A6922B17BBC00C661C6 /* def_use_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680822B17BBB00C661C6 /* def_use_manager.cpp */; };
-		A94A6A6A22B17BBC00C661C6 /* strip_reflect_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680922B17BBB00C661C6 /* strip_reflect_info_pass.cpp */; };
-		A94A6A6B22B17BBC00C661C6 /* strip_reflect_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680922B17BBB00C661C6 /* strip_reflect_info_pass.cpp */; };
-		A94A6A6C22B17BBC00C661C6 /* decoration_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680A22B17BBB00C661C6 /* decoration_manager.h */; };
-		A94A6A6D22B17BBC00C661C6 /* decoration_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680A22B17BBB00C661C6 /* decoration_manager.h */; };
-		A94A6A6E22B17BBC00C661C6 /* ccp_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680B22B17BBB00C661C6 /* ccp_pass.cpp */; };
-		A94A6A6F22B17BBC00C661C6 /* ccp_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680B22B17BBB00C661C6 /* ccp_pass.cpp */; };
-		A94A6A7022B17BBC00C661C6 /* process_lines_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680C22B17BBB00C661C6 /* process_lines_pass.h */; };
-		A94A6A7122B17BBC00C661C6 /* process_lines_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680C22B17BBB00C661C6 /* process_lines_pass.h */; };
-		A94A6A7222B17BBC00C661C6 /* local_single_block_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680D22B17BBB00C661C6 /* local_single_block_elim_pass.h */; };
-		A94A6A7322B17BBC00C661C6 /* local_single_block_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680D22B17BBB00C661C6 /* local_single_block_elim_pass.h */; };
-		A94A6A7422B17BBC00C661C6 /* pch_source_opt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680E22B17BBB00C661C6 /* pch_source_opt.cpp */; };
-		A94A6A7522B17BBC00C661C6 /* pch_source_opt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A680E22B17BBB00C661C6 /* pch_source_opt.cpp */; };
-		A94A6A7622B17BBC00C661C6 /* strength_reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680F22B17BBB00C661C6 /* strength_reduction_pass.h */; };
-		A94A6A7722B17BBC00C661C6 /* strength_reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A680F22B17BBB00C661C6 /* strength_reduction_pass.h */; };
-		A94A6A7822B17BBC00C661C6 /* aggressive_dead_code_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681022B17BBB00C661C6 /* aggressive_dead_code_elim_pass.cpp */; };
-		A94A6A7922B17BBC00C661C6 /* aggressive_dead_code_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681022B17BBB00C661C6 /* aggressive_dead_code_elim_pass.cpp */; };
-		A94A6A7A22B17BBC00C661C6 /* eliminate_dead_functions_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681122B17BBB00C661C6 /* eliminate_dead_functions_util.cpp */; };
-		A94A6A7B22B17BBC00C661C6 /* eliminate_dead_functions_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681122B17BBB00C661C6 /* eliminate_dead_functions_util.cpp */; };
-		A94A6A7C22B17BBC00C661C6 /* simplification_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681222B17BBB00C661C6 /* simplification_pass.cpp */; };
-		A94A6A7D22B17BBC00C661C6 /* simplification_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681222B17BBB00C661C6 /* simplification_pass.cpp */; };
-		A94A6A7E22B17BBC00C661C6 /* dead_branch_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681322B17BBB00C661C6 /* dead_branch_elim_pass.cpp */; };
-		A94A6A7F22B17BBC00C661C6 /* dead_branch_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681322B17BBB00C661C6 /* dead_branch_elim_pass.cpp */; };
-		A94A6A8022B17BBC00C661C6 /* flatten_decoration_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681422B17BBB00C661C6 /* flatten_decoration_pass.cpp */; };
-		A94A6A8122B17BBC00C661C6 /* flatten_decoration_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681422B17BBB00C661C6 /* flatten_decoration_pass.cpp */; };
-		A94A6A8222B17BBC00C661C6 /* dead_insert_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681522B17BBB00C661C6 /* dead_insert_elim_pass.h */; };
-		A94A6A8322B17BBC00C661C6 /* dead_insert_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681522B17BBB00C661C6 /* dead_insert_elim_pass.h */; };
-		A94A6A8422B17BBC00C661C6 /* folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681622B17BBB00C661C6 /* folding_rules.cpp */; };
-		A94A6A8522B17BBC00C661C6 /* folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681622B17BBB00C661C6 /* folding_rules.cpp */; };
-		A94A6A8622B17BBC00C661C6 /* freeze_spec_constant_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681722B17BBB00C661C6 /* freeze_spec_constant_value_pass.h */; };
-		A94A6A8722B17BBC00C661C6 /* freeze_spec_constant_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681722B17BBB00C661C6 /* freeze_spec_constant_value_pass.h */; };
-		A94A6A8822B17BBC00C661C6 /* ir_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681822B17BBB00C661C6 /* ir_context.cpp */; };
-		A94A6A8922B17BBC00C661C6 /* ir_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681822B17BBB00C661C6 /* ir_context.cpp */; };
-		A94A6A8A22B17BBC00C661C6 /* instrument_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681922B17BBB00C661C6 /* instrument_pass.h */; };
-		A94A6A8B22B17BBC00C661C6 /* instrument_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681922B17BBB00C661C6 /* instrument_pass.h */; };
-		A94A6A8C22B17BBC00C661C6 /* mem_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681A22B17BBB00C661C6 /* mem_pass.h */; };
-		A94A6A8D22B17BBC00C661C6 /* mem_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681A22B17BBB00C661C6 /* mem_pass.h */; };
-		A94A6A8E22B17BBC00C661C6 /* loop_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681B22B17BBB00C661C6 /* loop_descriptor.cpp */; };
-		A94A6A8F22B17BBC00C661C6 /* loop_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681B22B17BBB00C661C6 /* loop_descriptor.cpp */; };
-		A94A6A9022B17BBC00C661C6 /* local_ssa_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681C22B17BBB00C661C6 /* local_ssa_elim_pass.cpp */; };
-		A94A6A9122B17BBC00C661C6 /* local_ssa_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681C22B17BBB00C661C6 /* local_ssa_elim_pass.cpp */; };
-		A94A6A9222B17BBC00C661C6 /* eliminate_dead_members_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681D22B17BBB00C661C6 /* eliminate_dead_members_pass.h */; };
-		A94A6A9322B17BBC00C661C6 /* eliminate_dead_members_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A681D22B17BBB00C661C6 /* eliminate_dead_members_pass.h */; };
-		A94A6A9422B17BBC00C661C6 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681E22B17BBB00C661C6 /* function.cpp */; };
-		A94A6A9522B17BBC00C661C6 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681E22B17BBB00C661C6 /* function.cpp */; };
-		A94A6A9622B17BBC00C661C6 /* instruction_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681F22B17BBB00C661C6 /* instruction_list.cpp */; };
-		A94A6A9722B17BBC00C661C6 /* instruction_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A681F22B17BBB00C661C6 /* instruction_list.cpp */; };
-		A94A6A9822B17BBC00C661C6 /* composite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682022B17BBB00C661C6 /* composite.cpp */; };
-		A94A6A9922B17BBC00C661C6 /* composite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682022B17BBB00C661C6 /* composite.cpp */; };
-		A94A6A9A22B17BBC00C661C6 /* process_lines_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682122B17BBB00C661C6 /* process_lines_pass.cpp */; };
-		A94A6A9B22B17BBC00C661C6 /* process_lines_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682122B17BBB00C661C6 /* process_lines_pass.cpp */; };
-		A94A6A9C22B17BBC00C661C6 /* inline_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682222B17BBB00C661C6 /* inline_pass.h */; };
-		A94A6A9D22B17BBC00C661C6 /* inline_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682222B17BBB00C661C6 /* inline_pass.h */; };
-		A94A6A9E22B17BBC00C661C6 /* loop_dependence.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682322B17BBB00C661C6 /* loop_dependence.h */; };
-		A94A6A9F22B17BBC00C661C6 /* loop_dependence.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682322B17BBB00C661C6 /* loop_dependence.h */; };
-		A94A6AA022B17BBC00C661C6 /* value_number_table.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682422B17BBB00C661C6 /* value_number_table.h */; };
-		A94A6AA122B17BBC00C661C6 /* value_number_table.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682422B17BBB00C661C6 /* value_number_table.h */; };
-		A94A6AA222B17BBC00C661C6 /* flatten_decoration_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682522B17BBB00C661C6 /* flatten_decoration_pass.h */; };
-		A94A6AA322B17BBC00C661C6 /* flatten_decoration_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682522B17BBB00C661C6 /* flatten_decoration_pass.h */; };
-		A94A6AA422B17BBC00C661C6 /* if_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682622B17BBB00C661C6 /* if_conversion.cpp */; };
-		A94A6AA522B17BBC00C661C6 /* if_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682622B17BBB00C661C6 /* if_conversion.cpp */; };
-		A94A6AA622B17BBC00C661C6 /* inline_exhaustive_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682722B17BBB00C661C6 /* inline_exhaustive_pass.h */; };
-		A94A6AA722B17BBC00C661C6 /* inline_exhaustive_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682722B17BBB00C661C6 /* inline_exhaustive_pass.h */; };
-		A94A6AA822B17BBC00C661C6 /* constants.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682822B17BBB00C661C6 /* constants.h */; };
-		A94A6AA922B17BBC00C661C6 /* constants.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682822B17BBB00C661C6 /* constants.h */; };
-		A94A6AAA22B17BBC00C661C6 /* eliminate_dead_members_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682922B17BBB00C661C6 /* eliminate_dead_members_pass.cpp */; };
-		A94A6AAB22B17BBC00C661C6 /* eliminate_dead_members_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682922B17BBB00C661C6 /* eliminate_dead_members_pass.cpp */; };
-		A94A6AAC22B17BBC00C661C6 /* strength_reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682A22B17BBB00C661C6 /* strength_reduction_pass.cpp */; };
-		A94A6AAD22B17BBC00C661C6 /* strength_reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682A22B17BBB00C661C6 /* strength_reduction_pass.cpp */; };
-		A94A6AAE22B17BBC00C661C6 /* block_merge_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682B22B17BBB00C661C6 /* block_merge_util.cpp */; };
-		A94A6AAF22B17BBC00C661C6 /* block_merge_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682B22B17BBB00C661C6 /* block_merge_util.cpp */; };
-		A94A6AB022B17BBC00C661C6 /* upgrade_memory_model.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682C22B17BBB00C661C6 /* upgrade_memory_model.h */; };
-		A94A6AB122B17BBC00C661C6 /* upgrade_memory_model.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A682C22B17BBB00C661C6 /* upgrade_memory_model.h */; };
-		A94A6AB222B17BBC00C661C6 /* copy_prop_arrays.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682D22B17BBB00C661C6 /* copy_prop_arrays.cpp */; };
-		A94A6AB322B17BBC00C661C6 /* copy_prop_arrays.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682D22B17BBB00C661C6 /* copy_prop_arrays.cpp */; };
-		A94A6AB422B17BBC00C661C6 /* pass_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682E22B17BBB00C661C6 /* pass_manager.cpp */; };
-		A94A6AB522B17BBC00C661C6 /* pass_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682E22B17BBB00C661C6 /* pass_manager.cpp */; };
-		A94A6AB622B17BBC00C661C6 /* inline_exhaustive_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682F22B17BBB00C661C6 /* inline_exhaustive_pass.cpp */; };
-		A94A6AB722B17BBC00C661C6 /* inline_exhaustive_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A682F22B17BBB00C661C6 /* inline_exhaustive_pass.cpp */; };
-		A94A6AB822B17BBC00C661C6 /* loop_fission.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683022B17BBB00C661C6 /* loop_fission.h */; };
-		A94A6AB922B17BBC00C661C6 /* loop_fission.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683022B17BBB00C661C6 /* loop_fission.h */; };
-		A94A6ABA22B17BBC00C661C6 /* workaround1209.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683122B17BBB00C661C6 /* workaround1209.h */; };
-		A94A6ABB22B17BBC00C661C6 /* workaround1209.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683122B17BBB00C661C6 /* workaround1209.h */; };
-		A94A6ABC22B17BBC00C661C6 /* loop_fusion_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A683222B17BBB00C661C6 /* loop_fusion_pass.cpp */; };
-		A94A6ABD22B17BBC00C661C6 /* loop_fusion_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A683222B17BBB00C661C6 /* loop_fusion_pass.cpp */; };
-		A94A6ABE22B17BBC00C661C6 /* log.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683322B17BBB00C661C6 /* log.h */; };
-		A94A6ABF22B17BBC00C661C6 /* log.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683322B17BBB00C661C6 /* log.h */; };
-		A94A6AC022B17BBC00C661C6 /* split_invalid_unreachable_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683422B17BBB00C661C6 /* split_invalid_unreachable_pass.h */; };
-		A94A6AC122B17BBC00C661C6 /* split_invalid_unreachable_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683422B17BBB00C661C6 /* split_invalid_unreachable_pass.h */; };
-		A94A6AC222B17BBC00C661C6 /* copy_prop_arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683522B17BBB00C661C6 /* copy_prop_arrays.h */; };
-		A94A6AC322B17BBC00C661C6 /* copy_prop_arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683522B17BBB00C661C6 /* copy_prop_arrays.h */; };
-		A94A6AC422B17BBC00C661C6 /* eliminate_dead_constant_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683622B17BBB00C661C6 /* eliminate_dead_constant_pass.h */; };
-		A94A6AC522B17BBC00C661C6 /* eliminate_dead_constant_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683622B17BBB00C661C6 /* eliminate_dead_constant_pass.h */; };
-		A94A6AC622B17BBC00C661C6 /* dead_insert_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A683722B17BBB00C661C6 /* dead_insert_elim_pass.cpp */; };
-		A94A6AC722B17BBC00C661C6 /* dead_insert_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A683722B17BBB00C661C6 /* dead_insert_elim_pass.cpp */; };
-		A94A6AC822B17BBC00C661C6 /* ssa_rewrite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683822B17BBB00C661C6 /* ssa_rewrite_pass.h */; };
-		A94A6AC922B17BBC00C661C6 /* ssa_rewrite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683822B17BBB00C661C6 /* ssa_rewrite_pass.h */; };
-		A94A6ACA22B17BBC00C661C6 /* scalar_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A683922B17BBB00C661C6 /* scalar_analysis.cpp */; };
-		A94A6ACB22B17BBC00C661C6 /* scalar_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A683922B17BBB00C661C6 /* scalar_analysis.cpp */; };
-		A94A6ACC22B17BBC00C661C6 /* dead_variable_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683A22B17BBB00C661C6 /* dead_variable_elimination.h */; };
-		A94A6ACD22B17BBC00C661C6 /* dead_variable_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683A22B17BBB00C661C6 /* dead_variable_elimination.h */; };
-		A94A6ACE22B17BBC00C661C6 /* block_merge_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A683B22B17BBB00C661C6 /* block_merge_pass.cpp */; };
-		A94A6ACF22B17BBC00C661C6 /* block_merge_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A683B22B17BBB00C661C6 /* block_merge_pass.cpp */; };
-		A94A6AD022B17BBC00C661C6 /* dominator_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683C22B17BBB00C661C6 /* dominator_analysis.h */; };
-		A94A6AD122B17BBC00C661C6 /* dominator_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683C22B17BBB00C661C6 /* dominator_analysis.h */; };
-		A94A6AD222B17BBC00C661C6 /* pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683D22B17BBB00C661C6 /* pass.h */; };
-		A94A6AD322B17BBC00C661C6 /* pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683D22B17BBB00C661C6 /* pass.h */; };
-		A94A6AD422B17BBC00C661C6 /* folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683E22B17BBB00C661C6 /* folding_rules.h */; };
-		A94A6AD522B17BBC00C661C6 /* folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683E22B17BBB00C661C6 /* folding_rules.h */; };
-		A94A6AD622B17BBC00C661C6 /* eliminate_dead_functions_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683F22B17BBB00C661C6 /* eliminate_dead_functions_pass.h */; };
-		A94A6AD722B17BBC00C661C6 /* eliminate_dead_functions_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A683F22B17BBB00C661C6 /* eliminate_dead_functions_pass.h */; };
-		A94A6AD822B17BBC00C661C6 /* common_uniform_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684022B17BBB00C661C6 /* common_uniform_elim_pass.h */; };
-		A94A6AD922B17BBC00C661C6 /* common_uniform_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684022B17BBB00C661C6 /* common_uniform_elim_pass.h */; };
-		A94A6ADA22B17BBC00C661C6 /* eliminate_dead_functions_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684122B17BBB00C661C6 /* eliminate_dead_functions_util.h */; };
-		A94A6ADB22B17BBC00C661C6 /* eliminate_dead_functions_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684122B17BBB00C661C6 /* eliminate_dead_functions_util.h */; };
-		A94A6ADC22B17BBC00C661C6 /* fold.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684222B17BBB00C661C6 /* fold.h */; };
-		A94A6ADD22B17BBC00C661C6 /* fold.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684222B17BBB00C661C6 /* fold.h */; };
-		A94A6ADE22B17BBC00C661C6 /* local_single_store_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684322B17BBB00C661C6 /* local_single_store_elim_pass.cpp */; };
-		A94A6ADF22B17BBC00C661C6 /* local_single_store_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684322B17BBB00C661C6 /* local_single_store_elim_pass.cpp */; };
-		A94A6AE022B17BBC00C661C6 /* dead_branch_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684422B17BBB00C661C6 /* dead_branch_elim_pass.h */; };
-		A94A6AE122B17BBC00C661C6 /* dead_branch_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684422B17BBB00C661C6 /* dead_branch_elim_pass.h */; };
-		A94A6AE222B17BBC00C661C6 /* private_to_local_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684522B17BBB00C661C6 /* private_to_local_pass.cpp */; };
-		A94A6AE322B17BBC00C661C6 /* private_to_local_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684522B17BBB00C661C6 /* private_to_local_pass.cpp */; };
-		A94A6AE422B17BBC00C661C6 /* scalar_analysis_nodes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684622B17BBB00C661C6 /* scalar_analysis_nodes.h */; };
-		A94A6AE522B17BBC00C661C6 /* scalar_analysis_nodes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684622B17BBB00C661C6 /* scalar_analysis_nodes.h */; };
-		A94A6AE622B17BBC00C661C6 /* propagator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684722B17BBB00C661C6 /* propagator.cpp */; };
-		A94A6AE722B17BBC00C661C6 /* propagator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684722B17BBB00C661C6 /* propagator.cpp */; };
-		A94A6AE822B17BBC00C661C6 /* fix_storage_class.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684822B17BBB00C661C6 /* fix_storage_class.h */; };
-		A94A6AE922B17BBC00C661C6 /* fix_storage_class.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684822B17BBB00C661C6 /* fix_storage_class.h */; };
-		A94A6AEA22B17BBC00C661C6 /* loop_dependence_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684922B17BBB00C661C6 /* loop_dependence_helpers.cpp */; };
-		A94A6AEB22B17BBC00C661C6 /* loop_dependence_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684922B17BBB00C661C6 /* loop_dependence_helpers.cpp */; };
-		A94A6AEC22B17BBC00C661C6 /* set_spec_constant_default_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684A22B17BBB00C661C6 /* set_spec_constant_default_value_pass.cpp */; };
-		A94A6AED22B17BBC00C661C6 /* set_spec_constant_default_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684A22B17BBB00C661C6 /* set_spec_constant_default_value_pass.cpp */; };
-		A94A6AEE22B17BBC00C661C6 /* passes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684B22B17BBB00C661C6 /* passes.h */; };
-		A94A6AEF22B17BBC00C661C6 /* passes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684B22B17BBB00C661C6 /* passes.h */; };
-		A94A6AF022B17BBC00C661C6 /* fold.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684C22B17BBB00C661C6 /* fold.cpp */; };
-		A94A6AF122B17BBC00C661C6 /* fold.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684C22B17BBB00C661C6 /* fold.cpp */; };
-		A94A6AF222B17BBC00C661C6 /* strip_reflect_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684D22B17BBB00C661C6 /* strip_reflect_info_pass.h */; };
-		A94A6AF322B17BBC00C661C6 /* strip_reflect_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684D22B17BBB00C661C6 /* strip_reflect_info_pass.h */; };
-		A94A6AF422B17BBC00C661C6 /* scalar_replacement_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684E22B17BBB00C661C6 /* scalar_replacement_pass.cpp */; };
-		A94A6AF522B17BBC00C661C6 /* scalar_replacement_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A684E22B17BBB00C661C6 /* scalar_replacement_pass.cpp */; };
-		A94A6AF622B17BBC00C661C6 /* simplification_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684F22B17BBB00C661C6 /* simplification_pass.h */; };
-		A94A6AF722B17BBC00C661C6 /* simplification_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A684F22B17BBB00C661C6 /* simplification_pass.h */; };
-		A94A6AF822B17BBC00C661C6 /* remove_duplicates_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685022B17BBB00C661C6 /* remove_duplicates_pass.h */; };
-		A94A6AF922B17BBC00C661C6 /* remove_duplicates_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685022B17BBB00C661C6 /* remove_duplicates_pass.h */; };
-		A94A6AFA22B17BBC00C661C6 /* redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685122B17BBB00C661C6 /* redundancy_elimination.cpp */; };
-		A94A6AFB22B17BBC00C661C6 /* redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685122B17BBB00C661C6 /* redundancy_elimination.cpp */; };
-		A94A6AFC22B17BBC00C661C6 /* reflect.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685222B17BBB00C661C6 /* reflect.h */; };
-		A94A6AFD22B17BBC00C661C6 /* reflect.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685222B17BBB00C661C6 /* reflect.h */; };
-		A94A6AFE22B17BBC00C661C6 /* workaround1209.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685322B17BBB00C661C6 /* workaround1209.cpp */; };
-		A94A6AFF22B17BBC00C661C6 /* workaround1209.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685322B17BBB00C661C6 /* workaround1209.cpp */; };
-		A94A6B0022B17BBC00C661C6 /* null_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685422B17BBB00C661C6 /* null_pass.h */; };
-		A94A6B0122B17BBC00C661C6 /* null_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685422B17BBB00C661C6 /* null_pass.h */; };
-		A94A6B0222B17BBC00C661C6 /* const_folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685522B17BBB00C661C6 /* const_folding_rules.h */; };
-		A94A6B0322B17BBC00C661C6 /* const_folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685522B17BBB00C661C6 /* const_folding_rules.h */; };
-		A94A6B0422B17BBC00C661C6 /* scalar_replacement_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685622B17BBB00C661C6 /* scalar_replacement_pass.h */; };
-		A94A6B0522B17BBC00C661C6 /* scalar_replacement_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685622B17BBB00C661C6 /* scalar_replacement_pass.h */; };
-		A94A6B0622B17BBC00C661C6 /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685722B17BBB00C661C6 /* instruction.cpp */; };
-		A94A6B0722B17BBC00C661C6 /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685722B17BBB00C661C6 /* instruction.cpp */; };
-		A94A6B0822B17BBC00C661C6 /* pch_source_opt.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685822B17BBB00C661C6 /* pch_source_opt.h */; };
-		A94A6B0922B17BBC00C661C6 /* pch_source_opt.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685822B17BBB00C661C6 /* pch_source_opt.h */; };
-		A94A6B0A22B17BBC00C661C6 /* reduce_load_size.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685922B17BBB00C661C6 /* reduce_load_size.cpp */; };
-		A94A6B0B22B17BBC00C661C6 /* reduce_load_size.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685922B17BBB00C661C6 /* reduce_load_size.cpp */; };
-		A94A6B0C22B17BBC00C661C6 /* redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685A22B17BBB00C661C6 /* redundancy_elimination.h */; };
-		A94A6B0D22B17BBC00C661C6 /* redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685A22B17BBB00C661C6 /* redundancy_elimination.h */; };
-		A94A6B0E22B17BBC00C661C6 /* fix_storage_class.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685B22B17BBB00C661C6 /* fix_storage_class.cpp */; };
-		A94A6B0F22B17BBC00C661C6 /* fix_storage_class.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685B22B17BBB00C661C6 /* fix_storage_class.cpp */; };
-		A94A6B1022B17BBC00C661C6 /* value_number_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685C22B17BBB00C661C6 /* value_number_table.cpp */; };
-		A94A6B1122B17BBC00C661C6 /* value_number_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685C22B17BBB00C661C6 /* value_number_table.cpp */; };
-		A94A6B1222B17BBC00C661C6 /* local_ssa_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685D22B17BBB00C661C6 /* local_ssa_elim_pass.h */; };
-		A94A6B1322B17BBC00C661C6 /* local_ssa_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A685D22B17BBB00C661C6 /* local_ssa_elim_pass.h */; };
-		A94A6B1422B17BBC00C661C6 /* inline_opaque_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685E22B17BBB00C661C6 /* inline_opaque_pass.cpp */; };
-		A94A6B1522B17BBC00C661C6 /* inline_opaque_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685E22B17BBB00C661C6 /* inline_opaque_pass.cpp */; };
-		A94A6B1622B17BBC00C661C6 /* replace_invalid_opc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685F22B17BBB00C661C6 /* replace_invalid_opc.cpp */; };
-		A94A6B1722B17BBC00C661C6 /* replace_invalid_opc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A685F22B17BBB00C661C6 /* replace_invalid_opc.cpp */; };
-		A94A6B1822B17BBC00C661C6 /* loop_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686022B17BBB00C661C6 /* loop_utils.h */; };
-		A94A6B1922B17BBC00C661C6 /* loop_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686022B17BBB00C661C6 /* loop_utils.h */; };
-		A94A6B1A22B17BBC00C661C6 /* module.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686122B17BBB00C661C6 /* module.h */; };
-		A94A6B1B22B17BBC00C661C6 /* module.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686122B17BBB00C661C6 /* module.h */; };
-		A94A6B1C22B17BBC00C661C6 /* dominator_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A686222B17BBB00C661C6 /* dominator_analysis.cpp */; };
-		A94A6B1D22B17BBC00C661C6 /* dominator_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A686222B17BBB00C661C6 /* dominator_analysis.cpp */; };
-		A94A6B1E22B17BBC00C661C6 /* decompose_initialized_variables_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A686322B17BBB00C661C6 /* decompose_initialized_variables_pass.cpp */; };
-		A94A6B1F22B17BBC00C661C6 /* decompose_initialized_variables_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A686322B17BBB00C661C6 /* decompose_initialized_variables_pass.cpp */; };
-		A94A6B2022B17BBC00C661C6 /* ir_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686422B17BBB00C661C6 /* ir_builder.h */; };
-		A94A6B2122B17BBC00C661C6 /* ir_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686422B17BBB00C661C6 /* ir_builder.h */; };
-		A94A6B2222B17BBC00C661C6 /* loop_unswitch_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686522B17BBB00C661C6 /* loop_unswitch_pass.h */; };
-		A94A6B2322B17BBC00C661C6 /* loop_unswitch_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686522B17BBB00C661C6 /* loop_unswitch_pass.h */; };
-		A94A6B2422B17BBC00C661C6 /* cfg.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686622B17BBB00C661C6 /* cfg.h */; };
-		A94A6B2522B17BBC00C661C6 /* cfg.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686622B17BBB00C661C6 /* cfg.h */; };
-		A94A6B2622B17BBC00C661C6 /* code_sink.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686722B17BBB00C661C6 /* code_sink.h */; };
-		A94A6B2722B17BBC00C661C6 /* code_sink.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686722B17BBB00C661C6 /* code_sink.h */; };
-		A94A6B2822B17BBC00C661C6 /* loop_descriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686822B17BBB00C661C6 /* loop_descriptor.h */; };
-		A94A6B2922B17BBC00C661C6 /* loop_descriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686822B17BBB00C661C6 /* loop_descriptor.h */; };
-		A94A6B2A22B17BBC00C661C6 /* generate_webgpu_initializers_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686922B17BBB00C661C6 /* generate_webgpu_initializers_pass.h */; };
-		A94A6B2B22B17BBC00C661C6 /* generate_webgpu_initializers_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686922B17BBB00C661C6 /* generate_webgpu_initializers_pass.h */; };
-		A94A6B2C22B17BBC00C661C6 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686A22B17BBB00C661C6 /* instruction.h */; };
-		A94A6B2D22B17BBC00C661C6 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686A22B17BBB00C661C6 /* instruction.h */; };
-		A94A6B2E22B17BBC00C661C6 /* aggressive_dead_code_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686B22B17BBB00C661C6 /* aggressive_dead_code_elim_pass.h */; };
-		A94A6B2F22B17BBC00C661C6 /* aggressive_dead_code_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686B22B17BBB00C661C6 /* aggressive_dead_code_elim_pass.h */; };
-		A94A6B3022B17BBC00C661C6 /* struct_cfg_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A686C22B17BBB00C661C6 /* struct_cfg_analysis.cpp */; };
-		A94A6B3122B17BBC00C661C6 /* struct_cfg_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A686C22B17BBB00C661C6 /* struct_cfg_analysis.cpp */; };
-		A94A6B3222B17BBC00C661C6 /* vector_dce.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686D22B17BBB00C661C6 /* vector_dce.h */; };
-		A94A6B3322B17BBC00C661C6 /* vector_dce.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686D22B17BBB00C661C6 /* vector_dce.h */; };
-		A94A6B3422B17BBC00C661C6 /* combine_access_chains.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686E22B17BBB00C661C6 /* combine_access_chains.h */; };
-		A94A6B3522B17BBC00C661C6 /* combine_access_chains.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686E22B17BBB00C661C6 /* combine_access_chains.h */; };
-		A94A6B3622B17BBC00C661C6 /* pass_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686F22B17BBB00C661C6 /* pass_manager.h */; };
-		A94A6B3722B17BBC00C661C6 /* pass_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A686F22B17BBB00C661C6 /* pass_manager.h */; };
-		A94A6B3822B17BBC00C661C6 /* local_access_chain_convert_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687022B17BBB00C661C6 /* local_access_chain_convert_pass.cpp */; };
-		A94A6B3922B17BBC00C661C6 /* local_access_chain_convert_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687022B17BBB00C661C6 /* local_access_chain_convert_pass.cpp */; };
-		A94A6B3A22B17BBC00C661C6 /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687122B17BBB00C661C6 /* basic_block.cpp */; };
-		A94A6B3B22B17BBC00C661C6 /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687122B17BBB00C661C6 /* basic_block.cpp */; };
-		A94A6B3C22B17BBC00C661C6 /* iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687222B17BBB00C661C6 /* iterator.h */; };
-		A94A6B3D22B17BBC00C661C6 /* iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687222B17BBB00C661C6 /* iterator.h */; };
-		A94A6B3E22B17BBC00C661C6 /* licm_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687322B17BBB00C661C6 /* licm_pass.h */; };
-		A94A6B3F22B17BBC00C661C6 /* licm_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687322B17BBB00C661C6 /* licm_pass.h */; };
-		A94A6B4022B17BBC00C661C6 /* build_module.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687422B17BBB00C661C6 /* build_module.h */; };
-		A94A6B4122B17BBC00C661C6 /* build_module.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687422B17BBB00C661C6 /* build_module.h */; };
-		A94A6B4222B17BBC00C661C6 /* ccp_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687522B17BBB00C661C6 /* ccp_pass.h */; };
-		A94A6B4322B17BBC00C661C6 /* ccp_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687522B17BBB00C661C6 /* ccp_pass.h */; };
-		A94A6B4422B17BBC00C661C6 /* decompose_initialized_variables_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687622B17BBB00C661C6 /* decompose_initialized_variables_pass.h */; };
-		A94A6B4522B17BBC00C661C6 /* decompose_initialized_variables_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687622B17BBB00C661C6 /* decompose_initialized_variables_pass.h */; };
-		A94A6B4622B17BBC00C661C6 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687722B17BBB00C661C6 /* function.h */; };
-		A94A6B4722B17BBC00C661C6 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687722B17BBB00C661C6 /* function.h */; };
-		A94A6B4822B17BBC00C661C6 /* loop_fusion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687822B17BBB00C661C6 /* loop_fusion.cpp */; };
-		A94A6B4922B17BBC00C661C6 /* loop_fusion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687822B17BBB00C661C6 /* loop_fusion.cpp */; };
-		A94A6B4A22B17BBC00C661C6 /* upgrade_memory_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687922B17BBB00C661C6 /* upgrade_memory_model.cpp */; };
-		A94A6B4B22B17BBC00C661C6 /* upgrade_memory_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687922B17BBB00C661C6 /* upgrade_memory_model.cpp */; };
-		A94A6B4C22B17BBC00C661C6 /* feature_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687A22B17BBB00C661C6 /* feature_manager.h */; };
-		A94A6B4D22B17BBC00C661C6 /* feature_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687A22B17BBB00C661C6 /* feature_manager.h */; };
-		A94A6B4E22B17BBC00C661C6 /* inst_bindless_check_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687B22B17BBB00C661C6 /* inst_bindless_check_pass.h */; };
-		A94A6B4F22B17BBC00C661C6 /* inst_bindless_check_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687B22B17BBB00C661C6 /* inst_bindless_check_pass.h */; };
-		A94A6B5022B17BBC00C661C6 /* scalar_analysis_simplification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687C22B17BBB00C661C6 /* scalar_analysis_simplification.cpp */; };
-		A94A6B5122B17BBC00C661C6 /* scalar_analysis_simplification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687C22B17BBB00C661C6 /* scalar_analysis_simplification.cpp */; };
-		A94A6B5222B17BBC00C661C6 /* set_spec_constant_default_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687D22B17BBB00C661C6 /* set_spec_constant_default_value_pass.h */; };
-		A94A6B5322B17BBC00C661C6 /* set_spec_constant_default_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687D22B17BBB00C661C6 /* set_spec_constant_default_value_pass.h */; };
-		A94A6B5422B17BBC00C661C6 /* dominator_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687E22B17BBB00C661C6 /* dominator_tree.h */; };
-		A94A6B5522B17BBC00C661C6 /* dominator_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A687E22B17BBB00C661C6 /* dominator_tree.h */; };
-		A94A6B5622B17BBC00C661C6 /* legalize_vector_shuffle_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687F22B17BBB00C661C6 /* legalize_vector_shuffle_pass.cpp */; };
-		A94A6B5722B17BBC00C661C6 /* legalize_vector_shuffle_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A687F22B17BBB00C661C6 /* legalize_vector_shuffle_pass.cpp */; };
-		A94A6B5822B17BBC00C661C6 /* type_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A688022B17BBB00C661C6 /* type_manager.h */; };
-		A94A6B5922B17BBC00C661C6 /* type_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A688022B17BBB00C661C6 /* type_manager.h */; };
-		A94A6B5A22B17BBC00C661C6 /* compact_ids_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A688122B17BBB00C661C6 /* compact_ids_pass.cpp */; };
-		A94A6B5B22B17BBC00C661C6 /* compact_ids_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A688122B17BBB00C661C6 /* compact_ids_pass.cpp */; };
-		A94A6B5C22B17BBC00C661C6 /* loop_peeling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A688222B17BBB00C661C6 /* loop_peeling.cpp */; };
-		A94A6B5D22B17BBC00C661C6 /* loop_peeling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A688222B17BBB00C661C6 /* loop_peeling.cpp */; };
-		A94A6B5E22B17BBC00C661C6 /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A688322B17BBB00C661C6 /* table.h */; };
-		A94A6B5F22B17BBC00C661C6 /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A688322B17BBB00C661C6 /* table.h */; };
-		A94A6BB022B17BBC00C661C6 /* ext_inst.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68AF22B17BBB00C661C6 /* ext_inst.h */; };
-		A94A6BB122B17BBC00C661C6 /* ext_inst.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68AF22B17BBB00C661C6 /* ext_inst.h */; };
-		A94A6BB222B17BBC00C661C6 /* diagnostic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68B022B17BBB00C661C6 /* diagnostic.cpp */; };
-		A94A6BB322B17BBC00C661C6 /* diagnostic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68B022B17BBB00C661C6 /* diagnostic.cpp */; };
-		A94A6BB422B17BBC00C661C6 /* latest_version_spirv_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B122B17BBB00C661C6 /* latest_version_spirv_header.h */; };
-		A94A6BB522B17BBC00C661C6 /* latest_version_spirv_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B122B17BBB00C661C6 /* latest_version_spirv_header.h */; };
-		A94A6BB622B17BBC00C661C6 /* libspirv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68B222B17BBB00C661C6 /* libspirv.cpp */; };
-		A94A6BB722B17BBC00C661C6 /* libspirv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68B222B17BBB00C661C6 /* libspirv.cpp */; };
-		A94A6BB822B17BBC00C661C6 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B322B17BBB00C661C6 /* instruction.h */; };
-		A94A6BB922B17BBC00C661C6 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B322B17BBB00C661C6 /* instruction.h */; };
-		A94A6BBA22B17BBC00C661C6 /* spirv_optimizer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B422B17BBB00C661C6 /* spirv_optimizer_options.h */; };
-		A94A6BBB22B17BBC00C661C6 /* spirv_optimizer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B422B17BBB00C661C6 /* spirv_optimizer_options.h */; };
-		A94A6BBC22B17BBC00C661C6 /* opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B522B17BBB00C661C6 /* opcode.h */; };
-		A94A6BBD22B17BBC00C661C6 /* opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B522B17BBB00C661C6 /* opcode.h */; };
-		A94A6BBE22B17BBC00C661C6 /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68B622B17BBB00C661C6 /* operand.cpp */; };
-		A94A6BBF22B17BBC00C661C6 /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68B622B17BBB00C661C6 /* operand.cpp */; };
-		A94A6BC022B17BBC00C661C6 /* latest_version_glsl_std_450_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B722B17BBB00C661C6 /* latest_version_glsl_std_450_header.h */; };
-		A94A6BC122B17BBC00C661C6 /* latest_version_glsl_std_450_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B722B17BBB00C661C6 /* latest_version_glsl_std_450_header.h */; };
-		A94A6BC222B17BBC00C661C6 /* extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B822B17BBB00C661C6 /* extensions.h */; };
-		A94A6BC322B17BBC00C661C6 /* extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68B822B17BBB00C661C6 /* extensions.h */; };
-		A94A6BC422B17BBC00C661C6 /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68B922B17BBB00C661C6 /* disassemble.cpp */; };
-		A94A6BC522B17BBC00C661C6 /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68B922B17BBB00C661C6 /* disassemble.cpp */; };
-		A94A6BC622B17BBC00C661C6 /* binary.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68BA22B17BBB00C661C6 /* binary.h */; };
-		A94A6BC722B17BBC00C661C6 /* binary.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68BA22B17BBB00C661C6 /* binary.h */; };
-		A94A6BC822B17BBC00C661C6 /* text_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68BB22B17BBB00C661C6 /* text_handler.cpp */; };
-		A94A6BC922B17BBC00C661C6 /* text_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68BB22B17BBB00C661C6 /* text_handler.cpp */; };
-		A94A6BCA22B17BBC00C661C6 /* validate_annotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68BD22B17BBB00C661C6 /* validate_annotation.cpp */; };
-		A94A6BCB22B17BBC00C661C6 /* validate_annotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68BD22B17BBB00C661C6 /* validate_annotation.cpp */; };
-		A94A6BCC22B17BBC00C661C6 /* validate_misc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68BE22B17BBB00C661C6 /* validate_misc.cpp */; };
-		A94A6BCD22B17BBC00C661C6 /* validate_misc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68BE22B17BBB00C661C6 /* validate_misc.cpp */; };
-		A94A6BCE22B17BBC00C661C6 /* validate_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68BF22B17BBB00C661C6 /* validate_cfg.cpp */; };
-		A94A6BCF22B17BBC00C661C6 /* validate_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68BF22B17BBB00C661C6 /* validate_cfg.cpp */; };
-		A94A6BD022B17BBC00C661C6 /* validate_capability.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C022B17BBB00C661C6 /* validate_capability.cpp */; };
-		A94A6BD122B17BBC00C661C6 /* validate_capability.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C022B17BBB00C661C6 /* validate_capability.cpp */; };
-		A94A6BD222B17BBC00C661C6 /* construct.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68C122B17BBB00C661C6 /* construct.h */; };
-		A94A6BD322B17BBC00C661C6 /* construct.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68C122B17BBB00C661C6 /* construct.h */; };
-		A94A6BD422B17BBC00C661C6 /* validate_barriers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C222B17BBB00C661C6 /* validate_barriers.cpp */; };
-		A94A6BD522B17BBC00C661C6 /* validate_barriers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C222B17BBB00C661C6 /* validate_barriers.cpp */; };
-		A94A6BD622B17BBC00C661C6 /* validate_non_uniform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C322B17BBB00C661C6 /* validate_non_uniform.cpp */; };
-		A94A6BD722B17BBC00C661C6 /* validate_non_uniform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C322B17BBB00C661C6 /* validate_non_uniform.cpp */; };
-		A94A6BD822B17BBC00C661C6 /* validate_scopes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C422B17BBB00C661C6 /* validate_scopes.cpp */; };
-		A94A6BD922B17BBC00C661C6 /* validate_scopes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C422B17BBB00C661C6 /* validate_scopes.cpp */; };
-		A94A6BDA22B17BBC00C661C6 /* validate_atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C522B17BBB00C661C6 /* validate_atomics.cpp */; };
-		A94A6BDB22B17BBC00C661C6 /* validate_atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C522B17BBB00C661C6 /* validate_atomics.cpp */; };
-		A94A6BDC22B17BBC00C661C6 /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68C622B17BBB00C661C6 /* basic_block.h */; };
-		A94A6BDD22B17BBC00C661C6 /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68C622B17BBB00C661C6 /* basic_block.h */; };
-		A94A6BDE22B17BBC00C661C6 /* validate_instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C722B17BBB00C661C6 /* validate_instruction.cpp */; };
-		A94A6BDF22B17BBC00C661C6 /* validate_instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C722B17BBB00C661C6 /* validate_instruction.cpp */; };
-		A94A6BE022B17BBC00C661C6 /* validate_decorations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C822B17BBB00C661C6 /* validate_decorations.cpp */; };
-		A94A6BE122B17BBC00C661C6 /* validate_decorations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C822B17BBB00C661C6 /* validate_decorations.cpp */; };
-		A94A6BE222B17BBC00C661C6 /* validate_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C922B17BBB00C661C6 /* validate_debug.cpp */; };
-		A94A6BE322B17BBC00C661C6 /* validate_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68C922B17BBB00C661C6 /* validate_debug.cpp */; };
-		A94A6BE422B17BBC00C661C6 /* validate_builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CA22B17BBB00C661C6 /* validate_builtins.cpp */; };
-		A94A6BE522B17BBC00C661C6 /* validate_builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CA22B17BBB00C661C6 /* validate_builtins.cpp */; };
-		A94A6BE622B17BBC00C661C6 /* validate_interfaces.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CB22B17BBB00C661C6 /* validate_interfaces.cpp */; };
-		A94A6BE722B17BBC00C661C6 /* validate_interfaces.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CB22B17BBB00C661C6 /* validate_interfaces.cpp */; };
-		A94A6BE822B17BBC00C661C6 /* validate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CC22B17BBB00C661C6 /* validate.cpp */; };
-		A94A6BE922B17BBC00C661C6 /* validate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CC22B17BBB00C661C6 /* validate.cpp */; };
-		A94A6BEA22B17BBC00C661C6 /* validation_state.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68CD22B17BBB00C661C6 /* validation_state.h */; };
-		A94A6BEB22B17BBC00C661C6 /* validation_state.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68CD22B17BBB00C661C6 /* validation_state.h */; };
-		A94A6BEC22B17BBD00C661C6 /* validate_constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CE22B17BBB00C661C6 /* validate_constants.cpp */; };
-		A94A6BED22B17BBD00C661C6 /* validate_constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CE22B17BBB00C661C6 /* validate_constants.cpp */; };
-		A94A6BEE22B17BBD00C661C6 /* validate_bitwise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CF22B17BBB00C661C6 /* validate_bitwise.cpp */; };
-		A94A6BEF22B17BBD00C661C6 /* validate_bitwise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68CF22B17BBB00C661C6 /* validate_bitwise.cpp */; };
-		A94A6BF022B17BBD00C661C6 /* validate_extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D022B17BBB00C661C6 /* validate_extensions.cpp */; };
-		A94A6BF122B17BBD00C661C6 /* validate_extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D022B17BBB00C661C6 /* validate_extensions.cpp */; };
-		A94A6BF222B17BBD00C661C6 /* construct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D122B17BBB00C661C6 /* construct.cpp */; };
-		A94A6BF322B17BBD00C661C6 /* construct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D122B17BBB00C661C6 /* construct.cpp */; };
-		A94A6BF422B17BBD00C661C6 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D222B17BBB00C661C6 /* function.cpp */; };
-		A94A6BF522B17BBD00C661C6 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D222B17BBB00C661C6 /* function.cpp */; };
-		A94A6BF622B17BBD00C661C6 /* validate.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68D322B17BBB00C661C6 /* validate.h */; };
-		A94A6BF722B17BBD00C661C6 /* validate.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68D322B17BBB00C661C6 /* validate.h */; };
-		A94A6BF822B17BBD00C661C6 /* validate_adjacency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D422B17BBB00C661C6 /* validate_adjacency.cpp */; };
-		A94A6BF922B17BBD00C661C6 /* validate_adjacency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D422B17BBB00C661C6 /* validate_adjacency.cpp */; };
-		A94A6BFA22B17BBD00C661C6 /* validate_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D522B17BBB00C661C6 /* validate_conversion.cpp */; };
-		A94A6BFB22B17BBD00C661C6 /* validate_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D522B17BBB00C661C6 /* validate_conversion.cpp */; };
-		A94A6BFC22B17BBD00C661C6 /* validate_datarules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D622B17BBB00C661C6 /* validate_datarules.cpp */; };
-		A94A6BFD22B17BBD00C661C6 /* validate_datarules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D622B17BBB00C661C6 /* validate_datarules.cpp */; };
-		A94A6BFE22B17BBD00C661C6 /* validate_scopes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68D722B17BBB00C661C6 /* validate_scopes.h */; };
-		A94A6BFF22B17BBD00C661C6 /* validate_scopes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68D722B17BBB00C661C6 /* validate_scopes.h */; };
-		A94A6C0022B17BBD00C661C6 /* validate_id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D822B17BBB00C661C6 /* validate_id.cpp */; };
-		A94A6C0122B17BBD00C661C6 /* validate_id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68D822B17BBB00C661C6 /* validate_id.cpp */; };
-		A94A6C0222B17BBD00C661C6 /* validate_memory_semantics.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68D922B17BBB00C661C6 /* validate_memory_semantics.h */; };
-		A94A6C0322B17BBD00C661C6 /* validate_memory_semantics.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68D922B17BBB00C661C6 /* validate_memory_semantics.h */; };
-		A94A6C0422B17BBD00C661C6 /* validate_arithmetics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DA22B17BBB00C661C6 /* validate_arithmetics.cpp */; };
-		A94A6C0522B17BBD00C661C6 /* validate_arithmetics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DA22B17BBB00C661C6 /* validate_arithmetics.cpp */; };
-		A94A6C0622B17BBD00C661C6 /* validate_mode_setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DB22B17BBB00C661C6 /* validate_mode_setting.cpp */; };
-		A94A6C0722B17BBD00C661C6 /* validate_mode_setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DB22B17BBB00C661C6 /* validate_mode_setting.cpp */; };
-		A94A6C0822B17BBD00C661C6 /* validate_memory_semantics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DC22B17BBB00C661C6 /* validate_memory_semantics.cpp */; };
-		A94A6C0922B17BBD00C661C6 /* validate_memory_semantics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DC22B17BBB00C661C6 /* validate_memory_semantics.cpp */; };
-		A94A6C0A22B17BBD00C661C6 /* validate_logicals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DD22B17BBB00C661C6 /* validate_logicals.cpp */; };
-		A94A6C0B22B17BBD00C661C6 /* validate_logicals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DD22B17BBB00C661C6 /* validate_logicals.cpp */; };
-		A94A6C0C22B17BBD00C661C6 /* validate_derivatives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DE22B17BBB00C661C6 /* validate_derivatives.cpp */; };
-		A94A6C0D22B17BBD00C661C6 /* validate_derivatives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DE22B17BBB00C661C6 /* validate_derivatives.cpp */; };
-		A94A6C0E22B17BBD00C661C6 /* validate_memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DF22B17BBB00C661C6 /* validate_memory.cpp */; };
-		A94A6C0F22B17BBD00C661C6 /* validate_memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68DF22B17BBB00C661C6 /* validate_memory.cpp */; };
-		A94A6C1022B17BBD00C661C6 /* validate_image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E022B17BBB00C661C6 /* validate_image.cpp */; };
-		A94A6C1122B17BBD00C661C6 /* validate_image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E022B17BBB00C661C6 /* validate_image.cpp */; };
-		A94A6C1222B17BBD00C661C6 /* validate_literals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E122B17BBB00C661C6 /* validate_literals.cpp */; };
-		A94A6C1322B17BBD00C661C6 /* validate_literals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E122B17BBB00C661C6 /* validate_literals.cpp */; };
-		A94A6C1422B17BBD00C661C6 /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E222B17BBB00C661C6 /* instruction.cpp */; };
-		A94A6C1522B17BBD00C661C6 /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E222B17BBB00C661C6 /* instruction.cpp */; };
-		A94A6C1622B17BBD00C661C6 /* validate_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E322B17BBB00C661C6 /* validate_type.cpp */; };
-		A94A6C1722B17BBD00C661C6 /* validate_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E322B17BBB00C661C6 /* validate_type.cpp */; };
-		A94A6C1822B17BBD00C661C6 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68E422B17BBB00C661C6 /* instruction.h */; };
-		A94A6C1922B17BBD00C661C6 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68E422B17BBB00C661C6 /* instruction.h */; };
-		A94A6C1A22B17BBD00C661C6 /* validate_execution_limitations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E522B17BBB00C661C6 /* validate_execution_limitations.cpp */; };
-		A94A6C1B22B17BBD00C661C6 /* validate_execution_limitations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E522B17BBB00C661C6 /* validate_execution_limitations.cpp */; };
-		A94A6C1C22B17BBD00C661C6 /* validate_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E622B17BBB00C661C6 /* validate_layout.cpp */; };
-		A94A6C1D22B17BBD00C661C6 /* validate_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E622B17BBB00C661C6 /* validate_layout.cpp */; };
-		A94A6C1E22B17BBD00C661C6 /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E722B17BBB00C661C6 /* basic_block.cpp */; };
-		A94A6C1F22B17BBD00C661C6 /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E722B17BBB00C661C6 /* basic_block.cpp */; };
-		A94A6C2022B17BBD00C661C6 /* validate_function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E822B17BBB00C661C6 /* validate_function.cpp */; };
-		A94A6C2122B17BBD00C661C6 /* validate_function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68E822B17BBB00C661C6 /* validate_function.cpp */; };
-		A94A6C2222B17BBD00C661C6 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68E922B17BBB00C661C6 /* function.h */; };
-		A94A6C2322B17BBD00C661C6 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68E922B17BBB00C661C6 /* function.h */; };
-		A94A6C2422B17BBD00C661C6 /* validate_composites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68EA22B17BBB00C661C6 /* validate_composites.cpp */; };
-		A94A6C2522B17BBD00C661C6 /* validate_composites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68EA22B17BBB00C661C6 /* validate_composites.cpp */; };
-		A94A6C2622B17BBD00C661C6 /* validation_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68EB22B17BBB00C661C6 /* validation_state.cpp */; };
-		A94A6C2722B17BBD00C661C6 /* validation_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68EB22B17BBB00C661C6 /* validation_state.cpp */; };
-		A94A6C2822B17BBD00C661C6 /* validate_primitives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68EC22B17BBB00C661C6 /* validate_primitives.cpp */; };
-		A94A6C2922B17BBD00C661C6 /* validate_primitives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94A68EC22B17BBB00C661C6 /* validate_primitives.cpp */; };
-		A94A6C2A22B17BBD00C661C6 /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68ED22B17BBB00C661C6 /* decoration.h */; };
-		A94A6C2B22B17BBD00C661C6 /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A94A68ED22B17BBB00C661C6 /* decoration.h */; };
 		A972AC6521CED9060013AB25 /* InitializeDll.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABF721CED9060013AB25 /* InitializeDll.h */; };
 		A972AC6621CED9060013AB25 /* InitializeDll.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABF721CED9060013AB25 /* InitializeDll.h */; };
 		A972AC6721CED9060013AB25 /* InitializeDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972ABF821CED9060013AB25 /* InitializeDll.cpp */; };
@@ -1012,6 +262,754 @@
 		A976292621CC60BC00B52A68 /* spirv_msl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290D21CC60BC00B52A68 /* spirv_msl.cpp */; };
 		A976292721CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */; };
 		A976292821CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */; };
+		A9C2F13922E7833D001763CE /* spirv_target_env.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF7822E7833C001763CE /* spirv_target_env.cpp */; };
+		A9C2F13A22E7833D001763CE /* spirv_target_env.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF7822E7833C001763CE /* spirv_target_env.cpp */; };
+		A9C2F13B22E7833D001763CE /* spirv_fuzzer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF7A22E7833C001763CE /* spirv_fuzzer_options.h */; };
+		A9C2F13C22E7833D001763CE /* spirv_fuzzer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF7A22E7833C001763CE /* spirv_fuzzer_options.h */; };
+		A9C2F13D22E7833D001763CE /* assembly_grammar.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF7B22E7833C001763CE /* assembly_grammar.h */; };
+		A9C2F13E22E7833D001763CE /* assembly_grammar.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF7B22E7833C001763CE /* assembly_grammar.h */; };
+		A9C2F13F22E7833D001763CE /* enum_set.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF7C22E7833C001763CE /* enum_set.h */; };
+		A9C2F14022E7833D001763CE /* enum_set.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF7C22E7833C001763CE /* enum_set.h */; };
+		A9C2F14122E7833D001763CE /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF7F22E7833C001763CE /* text.cpp */; };
+		A9C2F14222E7833D001763CE /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF7F22E7833C001763CE /* text.cpp */; };
+		A9C2F14322E7833D001763CE /* assembly_grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8022E7833C001763CE /* assembly_grammar.cpp */; };
+		A9C2F14422E7833D001763CE /* assembly_grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8022E7833C001763CE /* assembly_grammar.cpp */; };
+		A9C2F14522E7833D001763CE /* text.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8122E7833C001763CE /* text.h */; };
+		A9C2F14622E7833D001763CE /* text.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8122E7833C001763CE /* text.h */; };
+		A9C2F14722E7833D001763CE /* extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8222E7833C001763CE /* extensions.cpp */; };
+		A9C2F14822E7833D001763CE /* extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8222E7833C001763CE /* extensions.cpp */; };
+		A9C2F14922E7833D001763CE /* pch_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8322E7833C001763CE /* pch_source.cpp */; };
+		A9C2F14A22E7833D001763CE /* pch_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8322E7833C001763CE /* pch_source.cpp */; };
+		A9C2F14B22E7833D001763CE /* parse_number.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8522E7833C001763CE /* parse_number.h */; };
+		A9C2F14C22E7833D001763CE /* parse_number.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8522E7833C001763CE /* parse_number.h */; };
+		A9C2F14D22E7833D001763CE /* ilist_node.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8622E7833C001763CE /* ilist_node.h */; };
+		A9C2F14E22E7833D001763CE /* ilist_node.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8622E7833C001763CE /* ilist_node.h */; };
+		A9C2F14F22E7833D001763CE /* make_unique.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8722E7833C001763CE /* make_unique.h */; };
+		A9C2F15022E7833D001763CE /* make_unique.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8722E7833C001763CE /* make_unique.h */; };
+		A9C2F15122E7833D001763CE /* string_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8822E7833C001763CE /* string_utils.h */; };
+		A9C2F15222E7833D001763CE /* string_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8822E7833C001763CE /* string_utils.h */; };
+		A9C2F15322E7833D001763CE /* small_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8922E7833C001763CE /* small_vector.h */; };
+		A9C2F15422E7833D001763CE /* small_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8922E7833C001763CE /* small_vector.h */; };
+		A9C2F15522E7833D001763CE /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8A22E7833C001763CE /* timer.cpp */; };
+		A9C2F15622E7833D001763CE /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8A22E7833C001763CE /* timer.cpp */; };
+		A9C2F15722E7833D001763CE /* timer.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8B22E7833C001763CE /* timer.h */; };
+		A9C2F15822E7833D001763CE /* timer.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8B22E7833C001763CE /* timer.h */; };
+		A9C2F15922E7833D001763CE /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8C22E7833C001763CE /* string_utils.cpp */; };
+		A9C2F15A22E7833D001763CE /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF8C22E7833C001763CE /* string_utils.cpp */; };
+		A9C2F15B22E7833D001763CE /* bit_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8D22E7833C001763CE /* bit_vector.h */; };
+		A9C2F15C22E7833D001763CE /* bit_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8D22E7833C001763CE /* bit_vector.h */; };
+		A9C2F15D22E7833D001763CE /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8E22E7833C001763CE /* bitutils.h */; };
+		A9C2F15E22E7833D001763CE /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8E22E7833C001763CE /* bitutils.h */; };
+		A9C2F15F22E7833D001763CE /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8F22E7833C001763CE /* hex_float.h */; };
+		A9C2F16022E7833D001763CE /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF8F22E7833C001763CE /* hex_float.h */; };
+		A9C2F16122E7833D001763CE /* parse_number.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9022E7833C001763CE /* parse_number.cpp */; };
+		A9C2F16222E7833D001763CE /* parse_number.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9022E7833C001763CE /* parse_number.cpp */; };
+		A9C2F16322E7833D001763CE /* bit_vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9122E7833C001763CE /* bit_vector.cpp */; };
+		A9C2F16422E7833D001763CE /* bit_vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9122E7833C001763CE /* bit_vector.cpp */; };
+		A9C2F16522E7833D001763CE /* ilist.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9222E7833C001763CE /* ilist.h */; };
+		A9C2F16622E7833D001763CE /* ilist.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9222E7833C001763CE /* ilist.h */; };
+		A9C2F16722E7833D001763CE /* spirv_target_env.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9322E7833C001763CE /* spirv_target_env.h */; };
+		A9C2F16822E7833D001763CE /* spirv_target_env.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9322E7833C001763CE /* spirv_target_env.h */; };
+		A9C2F16922E7833D001763CE /* table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9422E7833C001763CE /* table.cpp */; };
+		A9C2F16A22E7833D001763CE /* table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9422E7833C001763CE /* table.cpp */; };
+		A9C2F16B22E7833D001763CE /* operand_to_undef_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9622E7833C001763CE /* operand_to_undef_reduction_opportunity_finder.h */; };
+		A9C2F16C22E7833D001763CE /* operand_to_undef_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9622E7833C001763CE /* operand_to_undef_reduction_opportunity_finder.h */; };
+		A9C2F16D22E7833D001763CE /* remove_selection_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9722E7833C001763CE /* remove_selection_reduction_opportunity.cpp */; };
+		A9C2F16E22E7833D001763CE /* remove_selection_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9722E7833C001763CE /* remove_selection_reduction_opportunity.cpp */; };
+		A9C2F16F22E7833D001763CE /* remove_block_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9822E7833C001763CE /* remove_block_reduction_opportunity.h */; };
+		A9C2F17022E7833D001763CE /* remove_block_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9822E7833C001763CE /* remove_block_reduction_opportunity.h */; };
+		A9C2F17122E7833D001763CE /* operand_to_dominating_id_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9922E7833C001763CE /* operand_to_dominating_id_reduction_opportunity_finder.h */; };
+		A9C2F17222E7833D001763CE /* operand_to_dominating_id_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9922E7833C001763CE /* operand_to_dominating_id_reduction_opportunity_finder.h */; };
+		A9C2F17322E7833D001763CE /* reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9A22E7833C001763CE /* reduction_pass.cpp */; };
+		A9C2F17422E7833D001763CE /* reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9A22E7833C001763CE /* reduction_pass.cpp */; };
+		A9C2F17522E7833D001763CE /* operand_to_const_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9B22E7833C001763CE /* operand_to_const_reduction_opportunity_finder.cpp */; };
+		A9C2F17622E7833D001763CE /* operand_to_const_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9B22E7833C001763CE /* operand_to_const_reduction_opportunity_finder.cpp */; };
+		A9C2F17722E7833D001763CE /* operand_to_const_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9C22E7833C001763CE /* operand_to_const_reduction_opportunity_finder.h */; };
+		A9C2F17822E7833D001763CE /* operand_to_const_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EF9C22E7833C001763CE /* operand_to_const_reduction_opportunity_finder.h */; };
+		A9C2F17922E7833D001763CE /* reduction_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9E22E7833C001763CE /* reduction_util.cpp */; };
+		A9C2F17A22E7833D001763CE /* reduction_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9E22E7833C001763CE /* reduction_util.cpp */; };
+		A9C2F17B22E7833D001763CE /* structured_loop_to_selection_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9F22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity_finder.cpp */; };
+		A9C2F17C22E7833D001763CE /* structured_loop_to_selection_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EF9F22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity_finder.cpp */; };
+		A9C2F17D22E7833D001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFA022E7833C001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.h */; };
+		A9C2F17E22E7833D001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFA022E7833C001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.h */; };
+		A9C2F17F22E7833D001763CE /* remove_function_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA122E7833C001763CE /* remove_function_reduction_opportunity_finder.cpp */; };
+		A9C2F18022E7833D001763CE /* remove_function_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA122E7833C001763CE /* remove_function_reduction_opportunity_finder.cpp */; };
+		A9C2F18122E7833D001763CE /* remove_instruction_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFA222E7833C001763CE /* remove_instruction_reduction_opportunity.h */; };
+		A9C2F18222E7833D001763CE /* remove_instruction_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFA222E7833C001763CE /* remove_instruction_reduction_opportunity.h */; };
+		A9C2F18322E7833D001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFA322E7833C001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h */; };
+		A9C2F18422E7833D001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFA322E7833C001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h */; };
+		A9C2F18522E7833D001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA422E7833C001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.cpp */; };
+		A9C2F18622E7833D001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA422E7833C001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.cpp */; };
+		A9C2F18722E7833D001763CE /* remove_function_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA522E7833C001763CE /* remove_function_reduction_opportunity.cpp */; };
+		A9C2F18822E7833D001763CE /* remove_function_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA522E7833C001763CE /* remove_function_reduction_opportunity.cpp */; };
+		A9C2F18922E7833D001763CE /* remove_opname_instruction_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFA622E7833C001763CE /* remove_opname_instruction_reduction_opportunity_finder.h */; };
+		A9C2F18A22E7833D001763CE /* remove_opname_instruction_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFA622E7833C001763CE /* remove_opname_instruction_reduction_opportunity_finder.h */; };
+		A9C2F18B22E7833D001763CE /* simple_conditional_branch_to_branch_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA722E7833C001763CE /* simple_conditional_branch_to_branch_opportunity_finder.cpp */; };
+		A9C2F18C22E7833D001763CE /* simple_conditional_branch_to_branch_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA722E7833C001763CE /* simple_conditional_branch_to_branch_opportunity_finder.cpp */; };
+		A9C2F18D22E7833D001763CE /* remove_selection_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA822E7833C001763CE /* remove_selection_reduction_opportunity_finder.cpp */; };
+		A9C2F18E22E7833D001763CE /* remove_selection_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA822E7833C001763CE /* remove_selection_reduction_opportunity_finder.cpp */; };
+		A9C2F18F22E7833D001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA922E7833C001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp */; };
+		A9C2F19022E7833D001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFA922E7833C001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp */; };
+		A9C2F19122E7833D001763CE /* simple_conditional_branch_to_branch_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFAA22E7833C001763CE /* simple_conditional_branch_to_branch_opportunity_finder.h */; };
+		A9C2F19222E7833D001763CE /* simple_conditional_branch_to_branch_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFAA22E7833C001763CE /* simple_conditional_branch_to_branch_opportunity_finder.h */; };
+		A9C2F19322E7833D001763CE /* merge_blocks_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFAB22E7833C001763CE /* merge_blocks_reduction_opportunity.cpp */; };
+		A9C2F19422E7833D001763CE /* merge_blocks_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFAB22E7833C001763CE /* merge_blocks_reduction_opportunity.cpp */; };
+		A9C2F19522E7833D001763CE /* change_operand_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFAC22E7833C001763CE /* change_operand_reduction_opportunity.cpp */; };
+		A9C2F19622E7833D001763CE /* change_operand_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFAC22E7833C001763CE /* change_operand_reduction_opportunity.cpp */; };
+		A9C2F19722E7833D001763CE /* structured_loop_to_selection_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFAD22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity.h */; };
+		A9C2F19822E7833D001763CE /* structured_loop_to_selection_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFAD22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity.h */; };
+		A9C2F19922E7833D001763CE /* remove_function_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFAE22E7833C001763CE /* remove_function_reduction_opportunity.h */; };
+		A9C2F19A22E7833D001763CE /* remove_function_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFAE22E7833C001763CE /* remove_function_reduction_opportunity.h */; };
+		A9C2F19B22E7833D001763CE /* change_operand_to_undef_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFAF22E7833C001763CE /* change_operand_to_undef_reduction_opportunity.h */; };
+		A9C2F19C22E7833D001763CE /* change_operand_to_undef_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFAF22E7833C001763CE /* change_operand_to_undef_reduction_opportunity.h */; };
+		A9C2F19D22E7833D001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB022E7833C001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp */; };
+		A9C2F19E22E7833D001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB022E7833C001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp */; };
+		A9C2F19F22E7833D001763CE /* structured_loop_to_selection_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFB122E7833C001763CE /* structured_loop_to_selection_reduction_opportunity_finder.h */; };
+		A9C2F1A022E7833D001763CE /* structured_loop_to_selection_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFB122E7833C001763CE /* structured_loop_to_selection_reduction_opportunity_finder.h */; };
+		A9C2F1A122E7833D001763CE /* remove_selection_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFB222E7833C001763CE /* remove_selection_reduction_opportunity.h */; };
+		A9C2F1A222E7833D001763CE /* remove_selection_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFB222E7833C001763CE /* remove_selection_reduction_opportunity.h */; };
+		A9C2F1A322E7833D001763CE /* remove_instruction_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB322E7833C001763CE /* remove_instruction_reduction_opportunity.cpp */; };
+		A9C2F1A422E7833D001763CE /* remove_instruction_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB322E7833C001763CE /* remove_instruction_reduction_opportunity.cpp */; };
+		A9C2F1A522E7833D001763CE /* remove_selection_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFB422E7833C001763CE /* remove_selection_reduction_opportunity_finder.h */; };
+		A9C2F1A622E7833D001763CE /* remove_selection_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFB422E7833C001763CE /* remove_selection_reduction_opportunity_finder.h */; };
+		A9C2F1A722E7833D001763CE /* merge_blocks_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFB522E7833C001763CE /* merge_blocks_reduction_opportunity_finder.h */; };
+		A9C2F1A822E7833D001763CE /* merge_blocks_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFB522E7833C001763CE /* merge_blocks_reduction_opportunity_finder.h */; };
+		A9C2F1A922E7833D001763CE /* remove_opname_instruction_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB622E7833C001763CE /* remove_opname_instruction_reduction_opportunity_finder.cpp */; };
+		A9C2F1AA22E7833D001763CE /* remove_opname_instruction_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB622E7833C001763CE /* remove_opname_instruction_reduction_opportunity_finder.cpp */; };
+		A9C2F1AB22E7833D001763CE /* pch_source_reduce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB722E7833C001763CE /* pch_source_reduce.cpp */; };
+		A9C2F1AC22E7833D001763CE /* pch_source_reduce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB722E7833C001763CE /* pch_source_reduce.cpp */; };
+		A9C2F1AD22E7833D001763CE /* reducer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB822E7833C001763CE /* reducer.cpp */; };
+		A9C2F1AE22E7833D001763CE /* reducer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB822E7833C001763CE /* reducer.cpp */; };
+		A9C2F1AF22E7833D001763CE /* operand_to_undef_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB922E7833C001763CE /* operand_to_undef_reduction_opportunity_finder.cpp */; };
+		A9C2F1B022E7833D001763CE /* operand_to_undef_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFB922E7833C001763CE /* operand_to_undef_reduction_opportunity_finder.cpp */; };
+		A9C2F1B122E7833D001763CE /* remove_function_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFBA22E7833C001763CE /* remove_function_reduction_opportunity_finder.h */; };
+		A9C2F1B222E7833D001763CE /* remove_function_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFBA22E7833C001763CE /* remove_function_reduction_opportunity_finder.h */; };
+		A9C2F1B322E7833D001763CE /* pch_source_reduce.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFBB22E7833C001763CE /* pch_source_reduce.h */; };
+		A9C2F1B422E7833D001763CE /* pch_source_reduce.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFBB22E7833C001763CE /* pch_source_reduce.h */; };
+		A9C2F1B522E7833D001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFBC22E7833C001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.h */; };
+		A9C2F1B622E7833D001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFBC22E7833C001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.h */; };
+		A9C2F1B722E7833D001763CE /* merge_blocks_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFBD22E7833C001763CE /* merge_blocks_reduction_opportunity_finder.cpp */; };
+		A9C2F1B822E7833D001763CE /* merge_blocks_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFBD22E7833C001763CE /* merge_blocks_reduction_opportunity_finder.cpp */; };
+		A9C2F1B922E7833D001763CE /* reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFBE22E7833C001763CE /* reduction_opportunity.cpp */; };
+		A9C2F1BA22E7833D001763CE /* reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFBE22E7833C001763CE /* reduction_opportunity.cpp */; };
+		A9C2F1BB22E7833D001763CE /* reducer.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFBF22E7833C001763CE /* reducer.h */; };
+		A9C2F1BC22E7833D001763CE /* reducer.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFBF22E7833C001763CE /* reducer.h */; };
+		A9C2F1BD22E7833D001763CE /* change_operand_to_undef_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFC022E7833C001763CE /* change_operand_to_undef_reduction_opportunity.cpp */; };
+		A9C2F1BE22E7833D001763CE /* change_operand_to_undef_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFC022E7833C001763CE /* change_operand_to_undef_reduction_opportunity.cpp */; };
+		A9C2F1BF22E7833D001763CE /* reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC122E7833C001763CE /* reduction_opportunity.h */; };
+		A9C2F1C022E7833D001763CE /* reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC122E7833C001763CE /* reduction_opportunity.h */; };
+		A9C2F1C122E7833D001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC222E7833C001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h */; };
+		A9C2F1C222E7833D001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC222E7833C001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h */; };
+		A9C2F1C322E7833D001763CE /* operand_to_dominating_id_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFC322E7833C001763CE /* operand_to_dominating_id_reduction_opportunity_finder.cpp */; };
+		A9C2F1C422E7833D001763CE /* operand_to_dominating_id_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFC322E7833C001763CE /* operand_to_dominating_id_reduction_opportunity_finder.cpp */; };
+		A9C2F1C522E7833D001763CE /* reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC422E7833C001763CE /* reduction_opportunity_finder.h */; };
+		A9C2F1C622E7833D001763CE /* reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC422E7833C001763CE /* reduction_opportunity_finder.h */; };
+		A9C2F1C722E7833D001763CE /* change_operand_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC522E7833C001763CE /* change_operand_reduction_opportunity.h */; };
+		A9C2F1C822E7833D001763CE /* change_operand_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC522E7833C001763CE /* change_operand_reduction_opportunity.h */; };
+		A9C2F1C922E7833D001763CE /* remove_block_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC622E7833C001763CE /* remove_block_reduction_opportunity_finder.h */; };
+		A9C2F1CA22E7833D001763CE /* remove_block_reduction_opportunity_finder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC622E7833C001763CE /* remove_block_reduction_opportunity_finder.h */; };
+		A9C2F1CB22E7833D001763CE /* remove_block_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFC722E7833C001763CE /* remove_block_reduction_opportunity_finder.cpp */; };
+		A9C2F1CC22E7833D001763CE /* remove_block_reduction_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFC722E7833C001763CE /* remove_block_reduction_opportunity_finder.cpp */; };
+		A9C2F1CD22E7833D001763CE /* reduction_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC822E7833C001763CE /* reduction_util.h */; };
+		A9C2F1CE22E7833D001763CE /* reduction_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC822E7833C001763CE /* reduction_util.h */; };
+		A9C2F1CF22E7833D001763CE /* merge_blocks_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC922E7833C001763CE /* merge_blocks_reduction_opportunity.h */; };
+		A9C2F1D022E7833D001763CE /* merge_blocks_reduction_opportunity.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFC922E7833C001763CE /* merge_blocks_reduction_opportunity.h */; };
+		A9C2F1D122E7833D001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFCA22E7833C001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp */; };
+		A9C2F1D222E7833D001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFCA22E7833C001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp */; };
+		A9C2F1D322E7833D001763CE /* structured_loop_to_selection_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFCB22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity.cpp */; };
+		A9C2F1D422E7833D001763CE /* structured_loop_to_selection_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFCB22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity.cpp */; };
+		A9C2F1D522E7833D001763CE /* remove_block_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFCC22E7833C001763CE /* remove_block_reduction_opportunity.cpp */; };
+		A9C2F1D622E7833D001763CE /* remove_block_reduction_opportunity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFCC22E7833C001763CE /* remove_block_reduction_opportunity.cpp */; };
+		A9C2F1D722E7833D001763CE /* reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFCD22E7833C001763CE /* reduction_pass.h */; };
+		A9C2F1D822E7833D001763CE /* reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFCD22E7833C001763CE /* reduction_pass.h */; };
+		A9C2F1D922E7833D001763CE /* latest_version_opencl_std_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFCE22E7833C001763CE /* latest_version_opencl_std_header.h */; };
+		A9C2F1DA22E7833D001763CE /* latest_version_opencl_std_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFCE22E7833C001763CE /* latest_version_opencl_std_header.h */; };
+		A9C2F1DB22E7833D001763CE /* spirv_optimizer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFCF22E7833C001763CE /* spirv_optimizer_options.cpp */; };
+		A9C2F1DC22E7833D001763CE /* spirv_optimizer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFCF22E7833C001763CE /* spirv_optimizer_options.cpp */; };
+		A9C2F1DD22E7833D001763CE /* cfa.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD022E7833C001763CE /* cfa.h */; };
+		A9C2F1DE22E7833D001763CE /* cfa.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD022E7833C001763CE /* cfa.h */; };
+		A9C2F1DF22E7833D001763CE /* pch_source.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD122E7833C001763CE /* pch_source.h */; };
+		A9C2F1E022E7833D001763CE /* pch_source.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD122E7833C001763CE /* pch_source.h */; };
+		A9C2F1E122E7833D001763CE /* enum_string_mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD222E7833C001763CE /* enum_string_mapping.h */; };
+		A9C2F1E222E7833D001763CE /* enum_string_mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD222E7833C001763CE /* enum_string_mapping.h */; };
+		A9C2F1E322E7833D001763CE /* spirv_fuzzer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFD322E7833C001763CE /* spirv_fuzzer_options.cpp */; };
+		A9C2F1E422E7833D001763CE /* spirv_fuzzer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFD322E7833C001763CE /* spirv_fuzzer_options.cpp */; };
+		A9C2F1E522E7833D001763CE /* spirv_reducer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD422E7833C001763CE /* spirv_reducer_options.h */; };
+		A9C2F1E622E7833D001763CE /* spirv_reducer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD422E7833C001763CE /* spirv_reducer_options.h */; };
+		A9C2F1E722E7833D001763CE /* spirv_validator_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFD522E7833C001763CE /* spirv_validator_options.cpp */; };
+		A9C2F1E822E7833D001763CE /* spirv_validator_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFD522E7833C001763CE /* spirv_validator_options.cpp */; };
+		A9C2F1E922E7833D001763CE /* print.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFD722E7833C001763CE /* print.cpp */; };
+		A9C2F1EA22E7833D001763CE /* print.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFD722E7833C001763CE /* print.cpp */; };
+		A9C2F1EB22E7833D001763CE /* spirv_definition.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD822E7833C001763CE /* spirv_definition.h */; };
+		A9C2F1EC22E7833D001763CE /* spirv_definition.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD822E7833C001763CE /* spirv_definition.h */; };
+		A9C2F1ED22E7833D001763CE /* operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD922E7833C001763CE /* operand.h */; };
+		A9C2F1EE22E7833D001763CE /* operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFD922E7833C001763CE /* operand.h */; };
+		A9C2F1EF22E7833D001763CE /* spirv_endian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFDA22E7833C001763CE /* spirv_endian.cpp */; };
+		A9C2F1F022E7833D001763CE /* spirv_endian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFDA22E7833C001763CE /* spirv_endian.cpp */; };
+		A9C2F1F122E7833D001763CE /* macro.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFDB22E7833C001763CE /* macro.h */; };
+		A9C2F1F222E7833D001763CE /* macro.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFDB22E7833C001763CE /* macro.h */; };
+		A9C2F1F322E7833D001763CE /* spirv_constant.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFDC22E7833C001763CE /* spirv_constant.h */; };
+		A9C2F1F422E7833D001763CE /* spirv_constant.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFDC22E7833C001763CE /* spirv_constant.h */; };
+		A9C2F1F522E7833D001763CE /* binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFDE22E7833C001763CE /* binary.cpp */; };
+		A9C2F1F622E7833D001763CE /* binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFDE22E7833C001763CE /* binary.cpp */; };
+		A9C2F1F722E7833D001763CE /* spirv_validator_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFDF22E7833C001763CE /* spirv_validator_options.h */; };
+		A9C2F1F822E7833D001763CE /* spirv_validator_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFDF22E7833C001763CE /* spirv_validator_options.h */; };
+		A9C2F1F922E7833D001763CE /* enum_string_mapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFE022E7833C001763CE /* enum_string_mapping.cpp */; };
+		A9C2F1FA22E7833D001763CE /* enum_string_mapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFE022E7833C001763CE /* enum_string_mapping.cpp */; };
+		A9C2F1FB22E7833D001763CE /* text_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE122E7833C001763CE /* text_handler.h */; };
+		A9C2F1FC22E7833D001763CE /* text_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE122E7833C001763CE /* text_handler.h */; };
+		A9C2F1FD22E7833D001763CE /* parsed_operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE222E7833C001763CE /* parsed_operand.h */; };
+		A9C2F1FE22E7833D001763CE /* parsed_operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE222E7833C001763CE /* parsed_operand.h */; };
+		A9C2F1FF22E7833D001763CE /* name_mapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE322E7833C001763CE /* name_mapper.h */; };
+		A9C2F20022E7833D001763CE /* name_mapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE322E7833C001763CE /* name_mapper.h */; };
+		A9C2F20122E7833D001763CE /* spirv_reducer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFE422E7833C001763CE /* spirv_reducer_options.cpp */; };
+		A9C2F20222E7833D001763CE /* spirv_reducer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFE422E7833C001763CE /* spirv_reducer_options.cpp */; };
+		A9C2F20322E7833D001763CE /* parsed_operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFE522E7833C001763CE /* parsed_operand.cpp */; };
+		A9C2F20422E7833D001763CE /* parsed_operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFE522E7833C001763CE /* parsed_operand.cpp */; };
+		A9C2F20522E7833D001763CE /* diagnostic.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE622E7833C001763CE /* diagnostic.h */; };
+		A9C2F20622E7833D001763CE /* diagnostic.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE622E7833C001763CE /* diagnostic.h */; };
+		A9C2F20722E7833D001763CE /* spirv_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE722E7833C001763CE /* spirv_endian.h */; };
+		A9C2F20822E7833D001763CE /* spirv_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFE722E7833C001763CE /* spirv_endian.h */; };
+		A9C2F20922E7833D001763CE /* name_mapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFE822E7833C001763CE /* name_mapper.cpp */; };
+		A9C2F20A22E7833D001763CE /* name_mapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFE822E7833C001763CE /* name_mapper.cpp */; };
+		A9C2F20B22E7833D001763CE /* linker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFEC22E7833C001763CE /* linker.cpp */; };
+		A9C2F20C22E7833D001763CE /* linker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFEC22E7833C001763CE /* linker.cpp */; };
+		A9C2F20D22E7833D001763CE /* software_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFED22E7833C001763CE /* software_version.cpp */; };
+		A9C2F20E22E7833D001763CE /* software_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFED22E7833C001763CE /* software_version.cpp */; };
+		A9C2F20F22E7833D001763CE /* opcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFEE22E7833C001763CE /* opcode.cpp */; };
+		A9C2F21022E7833D001763CE /* opcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFEE22E7833C001763CE /* opcode.cpp */; };
+		A9C2F21122E7833D001763CE /* print.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFEF22E7833C001763CE /* print.h */; };
+		A9C2F21222E7833D001763CE /* print.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFEF22E7833C001763CE /* print.h */; };
+		A9C2F21322E7833D001763CE /* ext_inst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFF022E7833C001763CE /* ext_inst.cpp */; };
+		A9C2F21422E7833D001763CE /* ext_inst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFF022E7833C001763CE /* ext_inst.cpp */; };
+		A9C2F21522E7833D001763CE /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF122E7833C001763CE /* disassemble.h */; };
+		A9C2F21622E7833D001763CE /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF122E7833C001763CE /* disassemble.h */; };
+		A9C2F21722E7833D001763CE /* optimizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFF322E7833C001763CE /* optimizer.cpp */; };
+		A9C2F21822E7833D001763CE /* optimizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFF322E7833C001763CE /* optimizer.cpp */; };
+		A9C2F21922E7833D001763CE /* if_conversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF422E7833C001763CE /* if_conversion.h */; };
+		A9C2F21A22E7833D001763CE /* if_conversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF422E7833C001763CE /* if_conversion.h */; };
+		A9C2F21B22E7833D001763CE /* register_pressure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFF522E7833C001763CE /* register_pressure.cpp */; };
+		A9C2F21C22E7833D001763CE /* register_pressure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFF522E7833C001763CE /* register_pressure.cpp */; };
+		A9C2F21D22E7833D001763CE /* loop_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFF622E7833C001763CE /* loop_utils.cpp */; };
+		A9C2F21E22E7833D001763CE /* loop_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFF622E7833C001763CE /* loop_utils.cpp */; };
+		A9C2F21F22E7833D001763CE /* merge_return_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF722E7833C001763CE /* merge_return_pass.h */; };
+		A9C2F22022E7833D001763CE /* merge_return_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF722E7833C001763CE /* merge_return_pass.h */; };
+		A9C2F22122E7833D001763CE /* inline_opaque_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF822E7833C001763CE /* inline_opaque_pass.h */; };
+		A9C2F22222E7833D001763CE /* inline_opaque_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF822E7833C001763CE /* inline_opaque_pass.h */; };
+		A9C2F22322E7833D001763CE /* loop_fusion.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF922E7833C001763CE /* loop_fusion.h */; };
+		A9C2F22422E7833D001763CE /* loop_fusion.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFF922E7833C001763CE /* loop_fusion.h */; };
+		A9C2F22522E7833D001763CE /* combine_access_chains.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFFA22E7833C001763CE /* combine_access_chains.cpp */; };
+		A9C2F22622E7833D001763CE /* combine_access_chains.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFFA22E7833C001763CE /* combine_access_chains.cpp */; };
+		A9C2F22722E7833D001763CE /* build_module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFFB22E7833C001763CE /* build_module.cpp */; };
+		A9C2F22822E7833D001763CE /* build_module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2EFFB22E7833C001763CE /* build_module.cpp */; };
+		A9C2F22922E7833D001763CE /* composite.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFFC22E7833C001763CE /* composite.h */; };
+		A9C2F22A22E7833D001763CE /* composite.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFFC22E7833C001763CE /* composite.h */; };
+		A9C2F22B22E7833D001763CE /* compact_ids_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFFD22E7833C001763CE /* compact_ids_pass.h */; };
+		A9C2F22C22E7833D001763CE /* compact_ids_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFFD22E7833C001763CE /* compact_ids_pass.h */; };
+		A9C2F22D22E7833D001763CE /* register_pressure.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFFE22E7833C001763CE /* register_pressure.h */; };
+		A9C2F22E22E7833D001763CE /* register_pressure.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFFE22E7833C001763CE /* register_pressure.h */; };
+		A9C2F22F22E7833D001763CE /* tree_iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFFF22E7833C001763CE /* tree_iterator.h */; };
+		A9C2F23022E7833D001763CE /* tree_iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2EFFF22E7833C001763CE /* tree_iterator.h */; };
+		A9C2F23122E7833D001763CE /* strip_atomic_counter_memory_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00022E7833C001763CE /* strip_atomic_counter_memory_pass.h */; };
+		A9C2F23222E7833D001763CE /* strip_atomic_counter_memory_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00022E7833C001763CE /* strip_atomic_counter_memory_pass.h */; };
+		A9C2F23322E7833D001763CE /* legalize_vector_shuffle_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00122E7833C001763CE /* legalize_vector_shuffle_pass.h */; };
+		A9C2F23422E7833D001763CE /* legalize_vector_shuffle_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00122E7833C001763CE /* legalize_vector_shuffle_pass.h */; };
+		A9C2F23522E7833D001763CE /* local_single_store_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00222E7833C001763CE /* local_single_store_elim_pass.h */; };
+		A9C2F23622E7833D001763CE /* local_single_store_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00222E7833C001763CE /* local_single_store_elim_pass.h */; };
+		A9C2F23722E7833D001763CE /* reduce_load_size.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00322E7833C001763CE /* reduce_load_size.h */; };
+		A9C2F23822E7833D001763CE /* reduce_load_size.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00322E7833C001763CE /* reduce_load_size.h */; };
+		A9C2F23922E7833D001763CE /* code_sink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00422E7833C001763CE /* code_sink.cpp */; };
+		A9C2F23A22E7833D001763CE /* code_sink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00422E7833C001763CE /* code_sink.cpp */; };
+		A9C2F23B22E7833D001763CE /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00522E7833C001763CE /* types.cpp */; };
+		A9C2F23C22E7833D001763CE /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00522E7833C001763CE /* types.cpp */; };
+		A9C2F23D22E7833D001763CE /* scalar_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00622E7833C001763CE /* scalar_analysis.h */; };
+		A9C2F23E22E7833D001763CE /* scalar_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00622E7833C001763CE /* scalar_analysis.h */; };
+		A9C2F23F22E7833D001763CE /* strip_debug_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00722E7833C001763CE /* strip_debug_info_pass.h */; };
+		A9C2F24022E7833D001763CE /* strip_debug_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00722E7833C001763CE /* strip_debug_info_pass.h */; };
+		A9C2F24122E7833D001763CE /* cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00822E7833C001763CE /* cfg.cpp */; };
+		A9C2F24222E7833D001763CE /* cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00822E7833C001763CE /* cfg.cpp */; };
+		A9C2F24322E7833D001763CE /* strip_atomic_counter_memory_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00922E7833C001763CE /* strip_atomic_counter_memory_pass.cpp */; };
+		A9C2F24422E7833D001763CE /* strip_atomic_counter_memory_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00922E7833C001763CE /* strip_atomic_counter_memory_pass.cpp */; };
+		A9C2F24522E7833D001763CE /* decoration_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00A22E7833C001763CE /* decoration_manager.cpp */; };
+		A9C2F24622E7833D001763CE /* decoration_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00A22E7833C001763CE /* decoration_manager.cpp */; };
+		A9C2F24722E7833D001763CE /* local_single_block_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00B22E7833C001763CE /* local_single_block_elim_pass.cpp */; };
+		A9C2F24822E7833D001763CE /* local_single_block_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00B22E7833C001763CE /* local_single_block_elim_pass.cpp */; };
+		A9C2F24922E7833D001763CE /* freeze_spec_constant_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00C22E7833C001763CE /* freeze_spec_constant_value_pass.cpp */; };
+		A9C2F24A22E7833D001763CE /* freeze_spec_constant_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00C22E7833C001763CE /* freeze_spec_constant_value_pass.cpp */; };
+		A9C2F24B22E7833D001763CE /* replace_invalid_opc.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00D22E7833C001763CE /* replace_invalid_opc.h */; };
+		A9C2F24C22E7833D001763CE /* replace_invalid_opc.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00D22E7833C001763CE /* replace_invalid_opc.h */; };
+		A9C2F24D22E7833D001763CE /* local_access_chain_convert_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00E22E7833C001763CE /* local_access_chain_convert_pass.h */; };
+		A9C2F24E22E7833D001763CE /* local_access_chain_convert_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F00E22E7833C001763CE /* local_access_chain_convert_pass.h */; };
+		A9C2F24F22E7833D001763CE /* inst_bindless_check_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00F22E7833C001763CE /* inst_bindless_check_pass.cpp */; };
+		A9C2F25022E7833D001763CE /* inst_bindless_check_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F00F22E7833C001763CE /* inst_bindless_check_pass.cpp */; };
+		A9C2F25122E7833D001763CE /* local_redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01022E7833C001763CE /* local_redundancy_elimination.cpp */; };
+		A9C2F25222E7833D001763CE /* local_redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01022E7833C001763CE /* local_redundancy_elimination.cpp */; };
+		A9C2F25322E7833D001763CE /* instrument_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01222E7833C001763CE /* instrument_pass.cpp */; };
+		A9C2F25422E7833D001763CE /* instrument_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01222E7833C001763CE /* instrument_pass.cpp */; };
+		A9C2F25522E7833D001763CE /* propagator.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F01322E7833C001763CE /* propagator.h */; };
+		A9C2F25622E7833D001763CE /* propagator.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F01322E7833C001763CE /* propagator.h */; };
+		A9C2F25722E7833D001763CE /* instruction_list.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F01422E7833C001763CE /* instruction_list.h */; };
+		A9C2F25822E7833D001763CE /* instruction_list.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F01422E7833C001763CE /* instruction_list.h */; };
+		A9C2F25922E7833D001763CE /* feature_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01522E7833C001763CE /* feature_manager.cpp */; };
+		A9C2F25A22E7833D001763CE /* feature_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01522E7833C001763CE /* feature_manager.cpp */; };
+		A9C2F25B22E7833D001763CE /* pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01622E7833C001763CE /* pass.cpp */; };
+		A9C2F25C22E7833D001763CE /* pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01622E7833C001763CE /* pass.cpp */; };
+		A9C2F25D22E7833D001763CE /* loop_fission.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01722E7833C001763CE /* loop_fission.cpp */; };
+		A9C2F25E22E7833D001763CE /* loop_fission.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01722E7833C001763CE /* loop_fission.cpp */; };
+		A9C2F25F22E7833D001763CE /* dominator_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01822E7833C001763CE /* dominator_tree.cpp */; };
+		A9C2F26022E7833D001763CE /* dominator_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01822E7833C001763CE /* dominator_tree.cpp */; };
+		A9C2F26122E7833D001763CE /* merge_return_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01922E7833C001763CE /* merge_return_pass.cpp */; };
+		A9C2F26222E7833D001763CE /* merge_return_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01922E7833C001763CE /* merge_return_pass.cpp */; };
+		A9C2F26322E7833D001763CE /* ir_context.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F01A22E7833C001763CE /* ir_context.h */; };
+		A9C2F26422E7833D001763CE /* ir_context.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F01A22E7833C001763CE /* ir_context.h */; };
+		A9C2F26522E7833D001763CE /* eliminate_dead_constant_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01B22E7833C001763CE /* eliminate_dead_constant_pass.cpp */; };
+		A9C2F26622E7833D001763CE /* eliminate_dead_constant_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01B22E7833C001763CE /* eliminate_dead_constant_pass.cpp */; };
+		A9C2F26722E7833D001763CE /* cfg_cleanup_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01C22E7833C001763CE /* cfg_cleanup_pass.cpp */; };
+		A9C2F26822E7833D001763CE /* cfg_cleanup_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01C22E7833C001763CE /* cfg_cleanup_pass.cpp */; };
+		A9C2F26922E7833D001763CE /* const_folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01D22E7833C001763CE /* const_folding_rules.cpp */; };
+		A9C2F26A22E7833D001763CE /* const_folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01D22E7833C001763CE /* const_folding_rules.cpp */; };
+		A9C2F26B22E7833D001763CE /* loop_unroller.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F01E22E7833C001763CE /* loop_unroller.h */; };
+		A9C2F26C22E7833D001763CE /* loop_unroller.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F01E22E7833C001763CE /* loop_unroller.h */; };
+		A9C2F26D22E7833D001763CE /* strip_debug_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01F22E7833C001763CE /* strip_debug_info_pass.cpp */; };
+		A9C2F26E22E7833D001763CE /* strip_debug_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F01F22E7833C001763CE /* strip_debug_info_pass.cpp */; };
+		A9C2F26F22E7833D001763CE /* ssa_rewrite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02022E7833C001763CE /* ssa_rewrite_pass.cpp */; };
+		A9C2F27022E7833D001763CE /* ssa_rewrite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02022E7833C001763CE /* ssa_rewrite_pass.cpp */; };
+		A9C2F27122E7833D001763CE /* loop_dependence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02122E7833C001763CE /* loop_dependence.cpp */; };
+		A9C2F27222E7833D001763CE /* loop_dependence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02122E7833C001763CE /* loop_dependence.cpp */; };
+		A9C2F27322E7833D001763CE /* unify_const_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02222E7833C001763CE /* unify_const_pass.h */; };
+		A9C2F27422E7833D001763CE /* unify_const_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02222E7833C001763CE /* unify_const_pass.h */; };
+		A9C2F27522E7833D001763CE /* ir_loader.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02322E7833C001763CE /* ir_loader.h */; };
+		A9C2F27622E7833D001763CE /* ir_loader.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02322E7833C001763CE /* ir_loader.h */; };
+		A9C2F27722E7833D001763CE /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02422E7833C001763CE /* types.h */; };
+		A9C2F27822E7833D001763CE /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02422E7833C001763CE /* types.h */; };
+		A9C2F27922E7833D001763CE /* fold_spec_constant_op_and_composite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02522E7833C001763CE /* fold_spec_constant_op_and_composite_pass.h */; };
+		A9C2F27A22E7833D001763CE /* fold_spec_constant_op_and_composite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02522E7833C001763CE /* fold_spec_constant_op_and_composite_pass.h */; };
+		A9C2F27B22E7833D001763CE /* mem_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02622E7833C001763CE /* mem_pass.cpp */; };
+		A9C2F27C22E7833D001763CE /* mem_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02622E7833C001763CE /* mem_pass.cpp */; };
+		A9C2F27D22E7833D001763CE /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02722E7833C001763CE /* basic_block.h */; };
+		A9C2F27E22E7833D001763CE /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02722E7833C001763CE /* basic_block.h */; };
+		A9C2F27F22E7833D001763CE /* remove_duplicates_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02822E7833C001763CE /* remove_duplicates_pass.cpp */; };
+		A9C2F28022E7833D001763CE /* remove_duplicates_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02822E7833C001763CE /* remove_duplicates_pass.cpp */; };
+		A9C2F28122E7833D001763CE /* dead_variable_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02922E7833C001763CE /* dead_variable_elimination.cpp */; };
+		A9C2F28222E7833D001763CE /* dead_variable_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02922E7833C001763CE /* dead_variable_elimination.cpp */; };
+		A9C2F28322E7833D001763CE /* block_merge_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02A22E7833C001763CE /* block_merge_pass.h */; };
+		A9C2F28422E7833D001763CE /* block_merge_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F02A22E7833C001763CE /* block_merge_pass.h */; };
+		A9C2F28522E7833D001763CE /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02B22E7833C001763CE /* module.cpp */; };
+		A9C2F28622E7833D001763CE /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02B22E7833C001763CE /* module.cpp */; };
+		A9C2F28722E7833D001763CE /* fold_spec_constant_op_and_composite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02C22E7833C001763CE /* fold_spec_constant_op_and_composite_pass.cpp */; };
+		A9C2F28822E7833D001763CE /* fold_spec_constant_op_and_composite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02C22E7833C001763CE /* fold_spec_constant_op_and_composite_pass.cpp */; };
+		A9C2F28922E7833D001763CE /* loop_unswitch_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02D22E7833C001763CE /* loop_unswitch_pass.cpp */; };
+		A9C2F28A22E7833D001763CE /* loop_unswitch_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02D22E7833C001763CE /* loop_unswitch_pass.cpp */; };
+		A9C2F28B22E7833D001763CE /* unify_const_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02E22E7833C001763CE /* unify_const_pass.cpp */; };
+		A9C2F28C22E7833D001763CE /* unify_const_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02E22E7833C001763CE /* unify_const_pass.cpp */; };
+		A9C2F28D22E7833D001763CE /* type_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02F22E7833C001763CE /* type_manager.cpp */; };
+		A9C2F28E22E7833D001763CE /* type_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F02F22E7833C001763CE /* type_manager.cpp */; };
+		A9C2F28F22E7833D001763CE /* generate_webgpu_initializers_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03022E7833C001763CE /* generate_webgpu_initializers_pass.cpp */; };
+		A9C2F29022E7833D001763CE /* generate_webgpu_initializers_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03022E7833C001763CE /* generate_webgpu_initializers_pass.cpp */; };
+		A9C2F29122E7833D001763CE /* private_to_local_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03122E7833C001763CE /* private_to_local_pass.h */; };
+		A9C2F29222E7833D001763CE /* private_to_local_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03122E7833C001763CE /* private_to_local_pass.h */; };
+		A9C2F29322E7833D001763CE /* inline_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03222E7833C001763CE /* inline_pass.cpp */; };
+		A9C2F29422E7833D001763CE /* inline_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03222E7833C001763CE /* inline_pass.cpp */; };
+		A9C2F29522E7833D001763CE /* def_use_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03322E7833C001763CE /* def_use_manager.h */; };
+		A9C2F29622E7833D001763CE /* def_use_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03322E7833C001763CE /* def_use_manager.h */; };
+		A9C2F29722E7833D001763CE /* ir_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03422E7833C001763CE /* ir_loader.cpp */; };
+		A9C2F29822E7833D001763CE /* ir_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03422E7833C001763CE /* ir_loader.cpp */; };
+		A9C2F29922E7833D001763CE /* cfg_cleanup_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03522E7833C001763CE /* cfg_cleanup_pass.h */; };
+		A9C2F29A22E7833D001763CE /* cfg_cleanup_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03522E7833C001763CE /* cfg_cleanup_pass.h */; };
+		A9C2F29B22E7833D001763CE /* licm_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03622E7833C001763CE /* licm_pass.cpp */; };
+		A9C2F29C22E7833D001763CE /* licm_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03622E7833C001763CE /* licm_pass.cpp */; };
+		A9C2F29D22E7833D001763CE /* eliminate_dead_functions_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03722E7833C001763CE /* eliminate_dead_functions_pass.cpp */; };
+		A9C2F29E22E7833D001763CE /* eliminate_dead_functions_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03722E7833C001763CE /* eliminate_dead_functions_pass.cpp */; };
+		A9C2F29F22E7833D001763CE /* local_redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03822E7833C001763CE /* local_redundancy_elimination.h */; };
+		A9C2F2A022E7833D001763CE /* local_redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03822E7833C001763CE /* local_redundancy_elimination.h */; };
+		A9C2F2A122E7833D001763CE /* split_invalid_unreachable_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03922E7833C001763CE /* split_invalid_unreachable_pass.cpp */; };
+		A9C2F2A222E7833D001763CE /* split_invalid_unreachable_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03922E7833C001763CE /* split_invalid_unreachable_pass.cpp */; };
+		A9C2F2A322E7833D001763CE /* loop_peeling.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03A22E7833C001763CE /* loop_peeling.h */; };
+		A9C2F2A422E7833D001763CE /* loop_peeling.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03A22E7833C001763CE /* loop_peeling.h */; };
+		A9C2F2A522E7833D001763CE /* vector_dce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03B22E7833C001763CE /* vector_dce.cpp */; };
+		A9C2F2A622E7833D001763CE /* vector_dce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03B22E7833C001763CE /* vector_dce.cpp */; };
+		A9C2F2A722E7833D001763CE /* block_merge_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03C22E7833C001763CE /* block_merge_util.h */; };
+		A9C2F2A822E7833D001763CE /* block_merge_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03C22E7833C001763CE /* block_merge_util.h */; };
+		A9C2F2A922E7833D001763CE /* loop_unroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03D22E7833C001763CE /* loop_unroller.cpp */; };
+		A9C2F2AA22E7833D001763CE /* loop_unroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03D22E7833C001763CE /* loop_unroller.cpp */; };
+		A9C2F2AB22E7833D001763CE /* constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03E22E7833C001763CE /* constants.cpp */; };
+		A9C2F2AC22E7833D001763CE /* constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F03E22E7833C001763CE /* constants.cpp */; };
+		A9C2F2AD22E7833D001763CE /* loop_fusion_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03F22E7833C001763CE /* loop_fusion_pass.h */; };
+		A9C2F2AE22E7833D001763CE /* loop_fusion_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F03F22E7833C001763CE /* loop_fusion_pass.h */; };
+		A9C2F2AF22E7833D001763CE /* struct_cfg_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04022E7833C001763CE /* struct_cfg_analysis.h */; };
+		A9C2F2B022E7833D001763CE /* struct_cfg_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04022E7833C001763CE /* struct_cfg_analysis.h */; };
+		A9C2F2B122E7833D001763CE /* def_use_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04122E7833C001763CE /* def_use_manager.cpp */; };
+		A9C2F2B222E7833D001763CE /* def_use_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04122E7833C001763CE /* def_use_manager.cpp */; };
+		A9C2F2B322E7833D001763CE /* strip_reflect_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04222E7833C001763CE /* strip_reflect_info_pass.cpp */; };
+		A9C2F2B422E7833D001763CE /* strip_reflect_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04222E7833C001763CE /* strip_reflect_info_pass.cpp */; };
+		A9C2F2B522E7833D001763CE /* decoration_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04322E7833C001763CE /* decoration_manager.h */; };
+		A9C2F2B622E7833D001763CE /* decoration_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04322E7833C001763CE /* decoration_manager.h */; };
+		A9C2F2B722E7833D001763CE /* ccp_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04422E7833C001763CE /* ccp_pass.cpp */; };
+		A9C2F2B822E7833D001763CE /* ccp_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04422E7833C001763CE /* ccp_pass.cpp */; };
+		A9C2F2B922E7833D001763CE /* process_lines_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04522E7833C001763CE /* process_lines_pass.h */; };
+		A9C2F2BA22E7833D001763CE /* process_lines_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04522E7833C001763CE /* process_lines_pass.h */; };
+		A9C2F2BB22E7833D001763CE /* local_single_block_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04622E7833C001763CE /* local_single_block_elim_pass.h */; };
+		A9C2F2BC22E7833D001763CE /* local_single_block_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04622E7833C001763CE /* local_single_block_elim_pass.h */; };
+		A9C2F2BD22E7833D001763CE /* pch_source_opt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04722E7833C001763CE /* pch_source_opt.cpp */; };
+		A9C2F2BE22E7833D001763CE /* pch_source_opt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04722E7833C001763CE /* pch_source_opt.cpp */; };
+		A9C2F2BF22E7833D001763CE /* strength_reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04822E7833C001763CE /* strength_reduction_pass.h */; };
+		A9C2F2C022E7833D001763CE /* strength_reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04822E7833C001763CE /* strength_reduction_pass.h */; };
+		A9C2F2C122E7833D001763CE /* aggressive_dead_code_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04922E7833C001763CE /* aggressive_dead_code_elim_pass.cpp */; };
+		A9C2F2C222E7833D001763CE /* aggressive_dead_code_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04922E7833C001763CE /* aggressive_dead_code_elim_pass.cpp */; };
+		A9C2F2C322E7833D001763CE /* eliminate_dead_functions_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04A22E7833C001763CE /* eliminate_dead_functions_util.cpp */; };
+		A9C2F2C422E7833D001763CE /* eliminate_dead_functions_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04A22E7833C001763CE /* eliminate_dead_functions_util.cpp */; };
+		A9C2F2C522E7833D001763CE /* simplification_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04B22E7833C001763CE /* simplification_pass.cpp */; };
+		A9C2F2C622E7833D001763CE /* simplification_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04B22E7833C001763CE /* simplification_pass.cpp */; };
+		A9C2F2C722E7833D001763CE /* dead_branch_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04C22E7833C001763CE /* dead_branch_elim_pass.cpp */; };
+		A9C2F2C822E7833D001763CE /* dead_branch_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04C22E7833C001763CE /* dead_branch_elim_pass.cpp */; };
+		A9C2F2C922E7833D001763CE /* flatten_decoration_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04D22E7833C001763CE /* flatten_decoration_pass.cpp */; };
+		A9C2F2CA22E7833D001763CE /* flatten_decoration_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04D22E7833C001763CE /* flatten_decoration_pass.cpp */; };
+		A9C2F2CB22E7833D001763CE /* dead_insert_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04E22E7833C001763CE /* dead_insert_elim_pass.h */; };
+		A9C2F2CC22E7833D001763CE /* dead_insert_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F04E22E7833C001763CE /* dead_insert_elim_pass.h */; };
+		A9C2F2CD22E7833D001763CE /* folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04F22E7833C001763CE /* folding_rules.cpp */; };
+		A9C2F2CE22E7833D001763CE /* folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F04F22E7833C001763CE /* folding_rules.cpp */; };
+		A9C2F2CF22E7833D001763CE /* freeze_spec_constant_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05022E7833C001763CE /* freeze_spec_constant_value_pass.h */; };
+		A9C2F2D022E7833D001763CE /* freeze_spec_constant_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05022E7833C001763CE /* freeze_spec_constant_value_pass.h */; };
+		A9C2F2D122E7833D001763CE /* ir_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05122E7833C001763CE /* ir_context.cpp */; };
+		A9C2F2D222E7833D001763CE /* ir_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05122E7833C001763CE /* ir_context.cpp */; };
+		A9C2F2D322E7833D001763CE /* instrument_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05222E7833C001763CE /* instrument_pass.h */; };
+		A9C2F2D422E7833D001763CE /* instrument_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05222E7833C001763CE /* instrument_pass.h */; };
+		A9C2F2D522E7833D001763CE /* mem_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05322E7833C001763CE /* mem_pass.h */; };
+		A9C2F2D622E7833D001763CE /* mem_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05322E7833C001763CE /* mem_pass.h */; };
+		A9C2F2D722E7833D001763CE /* loop_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05422E7833C001763CE /* loop_descriptor.cpp */; };
+		A9C2F2D822E7833D001763CE /* loop_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05422E7833C001763CE /* loop_descriptor.cpp */; };
+		A9C2F2D922E7833D001763CE /* local_ssa_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05522E7833C001763CE /* local_ssa_elim_pass.cpp */; };
+		A9C2F2DA22E7833D001763CE /* local_ssa_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05522E7833C001763CE /* local_ssa_elim_pass.cpp */; };
+		A9C2F2DB22E7833D001763CE /* eliminate_dead_members_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05622E7833C001763CE /* eliminate_dead_members_pass.h */; };
+		A9C2F2DC22E7833D001763CE /* eliminate_dead_members_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05622E7833C001763CE /* eliminate_dead_members_pass.h */; };
+		A9C2F2DD22E7833D001763CE /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05722E7833C001763CE /* function.cpp */; };
+		A9C2F2DE22E7833D001763CE /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05722E7833C001763CE /* function.cpp */; };
+		A9C2F2DF22E7833D001763CE /* instruction_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05822E7833C001763CE /* instruction_list.cpp */; };
+		A9C2F2E022E7833D001763CE /* instruction_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05822E7833C001763CE /* instruction_list.cpp */; };
+		A9C2F2E122E7833D001763CE /* composite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05922E7833C001763CE /* composite.cpp */; };
+		A9C2F2E222E7833D001763CE /* composite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05922E7833C001763CE /* composite.cpp */; };
+		A9C2F2E322E7833D001763CE /* process_lines_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05A22E7833C001763CE /* process_lines_pass.cpp */; };
+		A9C2F2E422E7833D001763CE /* process_lines_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05A22E7833C001763CE /* process_lines_pass.cpp */; };
+		A9C2F2E522E7833D001763CE /* inline_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05B22E7833C001763CE /* inline_pass.h */; };
+		A9C2F2E622E7833D001763CE /* inline_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05B22E7833C001763CE /* inline_pass.h */; };
+		A9C2F2E722E7833D001763CE /* loop_dependence.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05C22E7833C001763CE /* loop_dependence.h */; };
+		A9C2F2E822E7833D001763CE /* loop_dependence.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05C22E7833C001763CE /* loop_dependence.h */; };
+		A9C2F2E922E7833D001763CE /* value_number_table.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05D22E7833C001763CE /* value_number_table.h */; };
+		A9C2F2EA22E7833D001763CE /* value_number_table.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05D22E7833C001763CE /* value_number_table.h */; };
+		A9C2F2EB22E7833D001763CE /* flatten_decoration_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05E22E7833C001763CE /* flatten_decoration_pass.h */; };
+		A9C2F2EC22E7833D001763CE /* flatten_decoration_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F05E22E7833C001763CE /* flatten_decoration_pass.h */; };
+		A9C2F2ED22E7833D001763CE /* if_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05F22E7833C001763CE /* if_conversion.cpp */; };
+		A9C2F2EE22E7833D001763CE /* if_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F05F22E7833C001763CE /* if_conversion.cpp */; };
+		A9C2F2EF22E7833D001763CE /* inline_exhaustive_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06022E7833C001763CE /* inline_exhaustive_pass.h */; };
+		A9C2F2F022E7833D001763CE /* inline_exhaustive_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06022E7833C001763CE /* inline_exhaustive_pass.h */; };
+		A9C2F2F122E7833D001763CE /* constants.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06122E7833C001763CE /* constants.h */; };
+		A9C2F2F222E7833D001763CE /* constants.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06122E7833C001763CE /* constants.h */; };
+		A9C2F2F322E7833D001763CE /* eliminate_dead_members_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06222E7833C001763CE /* eliminate_dead_members_pass.cpp */; };
+		A9C2F2F422E7833D001763CE /* eliminate_dead_members_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06222E7833C001763CE /* eliminate_dead_members_pass.cpp */; };
+		A9C2F2F522E7833D001763CE /* strength_reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06322E7833C001763CE /* strength_reduction_pass.cpp */; };
+		A9C2F2F622E7833D001763CE /* strength_reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06322E7833C001763CE /* strength_reduction_pass.cpp */; };
+		A9C2F2F722E7833D001763CE /* block_merge_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06422E7833C001763CE /* block_merge_util.cpp */; };
+		A9C2F2F822E7833D001763CE /* block_merge_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06422E7833C001763CE /* block_merge_util.cpp */; };
+		A9C2F2F922E7833D001763CE /* upgrade_memory_model.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06522E7833C001763CE /* upgrade_memory_model.h */; };
+		A9C2F2FA22E7833D001763CE /* upgrade_memory_model.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06522E7833C001763CE /* upgrade_memory_model.h */; };
+		A9C2F2FB22E7833D001763CE /* copy_prop_arrays.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06622E7833C001763CE /* copy_prop_arrays.cpp */; };
+		A9C2F2FC22E7833D001763CE /* copy_prop_arrays.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06622E7833C001763CE /* copy_prop_arrays.cpp */; };
+		A9C2F2FD22E7833D001763CE /* pass_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06722E7833C001763CE /* pass_manager.cpp */; };
+		A9C2F2FE22E7833D001763CE /* pass_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06722E7833C001763CE /* pass_manager.cpp */; };
+		A9C2F2FF22E7833D001763CE /* inline_exhaustive_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06822E7833C001763CE /* inline_exhaustive_pass.cpp */; };
+		A9C2F30022E7833D001763CE /* inline_exhaustive_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06822E7833C001763CE /* inline_exhaustive_pass.cpp */; };
+		A9C2F30122E7833D001763CE /* loop_fission.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06922E7833C001763CE /* loop_fission.h */; };
+		A9C2F30222E7833D001763CE /* loop_fission.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06922E7833C001763CE /* loop_fission.h */; };
+		A9C2F30322E7833D001763CE /* workaround1209.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06A22E7833C001763CE /* workaround1209.h */; };
+		A9C2F30422E7833D001763CE /* workaround1209.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06A22E7833C001763CE /* workaround1209.h */; };
+		A9C2F30522E7833D001763CE /* loop_fusion_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06B22E7833C001763CE /* loop_fusion_pass.cpp */; };
+		A9C2F30622E7833D001763CE /* loop_fusion_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F06B22E7833C001763CE /* loop_fusion_pass.cpp */; };
+		A9C2F30722E7833D001763CE /* log.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06C22E7833C001763CE /* log.h */; };
+		A9C2F30822E7833D001763CE /* log.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06C22E7833C001763CE /* log.h */; };
+		A9C2F30922E7833D001763CE /* split_invalid_unreachable_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06D22E7833C001763CE /* split_invalid_unreachable_pass.h */; };
+		A9C2F30A22E7833D001763CE /* split_invalid_unreachable_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06D22E7833C001763CE /* split_invalid_unreachable_pass.h */; };
+		A9C2F30B22E7833D001763CE /* copy_prop_arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06E22E7833C001763CE /* copy_prop_arrays.h */; };
+		A9C2F30C22E7833D001763CE /* copy_prop_arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06E22E7833C001763CE /* copy_prop_arrays.h */; };
+		A9C2F30D22E7833D001763CE /* eliminate_dead_constant_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06F22E7833C001763CE /* eliminate_dead_constant_pass.h */; };
+		A9C2F30E22E7833D001763CE /* eliminate_dead_constant_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F06F22E7833C001763CE /* eliminate_dead_constant_pass.h */; };
+		A9C2F30F22E7833D001763CE /* dead_insert_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07022E7833C001763CE /* dead_insert_elim_pass.cpp */; };
+		A9C2F31022E7833D001763CE /* dead_insert_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07022E7833C001763CE /* dead_insert_elim_pass.cpp */; };
+		A9C2F31122E7833D001763CE /* ssa_rewrite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07122E7833C001763CE /* ssa_rewrite_pass.h */; };
+		A9C2F31222E7833D001763CE /* ssa_rewrite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07122E7833C001763CE /* ssa_rewrite_pass.h */; };
+		A9C2F31322E7833D001763CE /* scalar_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07222E7833C001763CE /* scalar_analysis.cpp */; };
+		A9C2F31422E7833D001763CE /* scalar_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07222E7833C001763CE /* scalar_analysis.cpp */; };
+		A9C2F31522E7833D001763CE /* dead_variable_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07322E7833C001763CE /* dead_variable_elimination.h */; };
+		A9C2F31622E7833D001763CE /* dead_variable_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07322E7833C001763CE /* dead_variable_elimination.h */; };
+		A9C2F31722E7833D001763CE /* block_merge_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07422E7833C001763CE /* block_merge_pass.cpp */; };
+		A9C2F31822E7833D001763CE /* block_merge_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07422E7833C001763CE /* block_merge_pass.cpp */; };
+		A9C2F31922E7833D001763CE /* dominator_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07522E7833C001763CE /* dominator_analysis.h */; };
+		A9C2F31A22E7833D001763CE /* dominator_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07522E7833C001763CE /* dominator_analysis.h */; };
+		A9C2F31B22E7833D001763CE /* pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07622E7833C001763CE /* pass.h */; };
+		A9C2F31C22E7833D001763CE /* pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07622E7833C001763CE /* pass.h */; };
+		A9C2F31D22E7833D001763CE /* folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07722E7833C001763CE /* folding_rules.h */; };
+		A9C2F31E22E7833D001763CE /* folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07722E7833C001763CE /* folding_rules.h */; };
+		A9C2F31F22E7833D001763CE /* eliminate_dead_functions_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07822E7833C001763CE /* eliminate_dead_functions_pass.h */; };
+		A9C2F32022E7833D001763CE /* eliminate_dead_functions_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07822E7833C001763CE /* eliminate_dead_functions_pass.h */; };
+		A9C2F32122E7833D001763CE /* eliminate_dead_functions_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07922E7833C001763CE /* eliminate_dead_functions_util.h */; };
+		A9C2F32222E7833D001763CE /* eliminate_dead_functions_util.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07922E7833C001763CE /* eliminate_dead_functions_util.h */; };
+		A9C2F32322E7833D001763CE /* fold.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07A22E7833C001763CE /* fold.h */; };
+		A9C2F32422E7833D001763CE /* fold.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07A22E7833C001763CE /* fold.h */; };
+		A9C2F32522E7833D001763CE /* local_single_store_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07B22E7833C001763CE /* local_single_store_elim_pass.cpp */; };
+		A9C2F32622E7833D001763CE /* local_single_store_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07B22E7833C001763CE /* local_single_store_elim_pass.cpp */; };
+		A9C2F32722E7833D001763CE /* dead_branch_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07C22E7833C001763CE /* dead_branch_elim_pass.h */; };
+		A9C2F32822E7833D001763CE /* dead_branch_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07C22E7833C001763CE /* dead_branch_elim_pass.h */; };
+		A9C2F32922E7833D001763CE /* private_to_local_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07D22E7833C001763CE /* private_to_local_pass.cpp */; };
+		A9C2F32A22E7833D001763CE /* private_to_local_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07D22E7833C001763CE /* private_to_local_pass.cpp */; };
+		A9C2F32B22E7833D001763CE /* scalar_analysis_nodes.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07E22E7833C001763CE /* scalar_analysis_nodes.h */; };
+		A9C2F32C22E7833D001763CE /* scalar_analysis_nodes.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F07E22E7833C001763CE /* scalar_analysis_nodes.h */; };
+		A9C2F32D22E7833D001763CE /* propagator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07F22E7833C001763CE /* propagator.cpp */; };
+		A9C2F32E22E7833D001763CE /* propagator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F07F22E7833C001763CE /* propagator.cpp */; };
+		A9C2F32F22E7833D001763CE /* fix_storage_class.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08022E7833C001763CE /* fix_storage_class.h */; };
+		A9C2F33022E7833D001763CE /* fix_storage_class.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08022E7833C001763CE /* fix_storage_class.h */; };
+		A9C2F33122E7833D001763CE /* loop_dependence_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08122E7833C001763CE /* loop_dependence_helpers.cpp */; };
+		A9C2F33222E7833D001763CE /* loop_dependence_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08122E7833C001763CE /* loop_dependence_helpers.cpp */; };
+		A9C2F33322E7833D001763CE /* set_spec_constant_default_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08222E7833C001763CE /* set_spec_constant_default_value_pass.cpp */; };
+		A9C2F33422E7833D001763CE /* set_spec_constant_default_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08222E7833C001763CE /* set_spec_constant_default_value_pass.cpp */; };
+		A9C2F33522E7833D001763CE /* passes.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08322E7833C001763CE /* passes.h */; };
+		A9C2F33622E7833D001763CE /* passes.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08322E7833C001763CE /* passes.h */; };
+		A9C2F33722E7833D001763CE /* fold.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08422E7833C001763CE /* fold.cpp */; };
+		A9C2F33822E7833D001763CE /* fold.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08422E7833C001763CE /* fold.cpp */; };
+		A9C2F33922E7833D001763CE /* strip_reflect_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08522E7833C001763CE /* strip_reflect_info_pass.h */; };
+		A9C2F33A22E7833D001763CE /* strip_reflect_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08522E7833C001763CE /* strip_reflect_info_pass.h */; };
+		A9C2F33B22E7833D001763CE /* scalar_replacement_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08622E7833C001763CE /* scalar_replacement_pass.cpp */; };
+		A9C2F33C22E7833D001763CE /* scalar_replacement_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08622E7833C001763CE /* scalar_replacement_pass.cpp */; };
+		A9C2F33D22E7833D001763CE /* simplification_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08722E7833C001763CE /* simplification_pass.h */; };
+		A9C2F33E22E7833D001763CE /* simplification_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08722E7833C001763CE /* simplification_pass.h */; };
+		A9C2F33F22E7833D001763CE /* remove_duplicates_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08822E7833C001763CE /* remove_duplicates_pass.h */; };
+		A9C2F34022E7833D001763CE /* remove_duplicates_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08822E7833C001763CE /* remove_duplicates_pass.h */; };
+		A9C2F34122E7833D001763CE /* redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08922E7833C001763CE /* redundancy_elimination.cpp */; };
+		A9C2F34222E7833D001763CE /* redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08922E7833C001763CE /* redundancy_elimination.cpp */; };
+		A9C2F34322E7833D001763CE /* reflect.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08A22E7833C001763CE /* reflect.h */; };
+		A9C2F34422E7833D001763CE /* reflect.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08A22E7833C001763CE /* reflect.h */; };
+		A9C2F34522E7833D001763CE /* workaround1209.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08B22E7833C001763CE /* workaround1209.cpp */; };
+		A9C2F34622E7833D001763CE /* workaround1209.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08B22E7833C001763CE /* workaround1209.cpp */; };
+		A9C2F34722E7833D001763CE /* null_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08C22E7833C001763CE /* null_pass.h */; };
+		A9C2F34822E7833D001763CE /* null_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08C22E7833C001763CE /* null_pass.h */; };
+		A9C2F34922E7833D001763CE /* const_folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08D22E7833C001763CE /* const_folding_rules.h */; };
+		A9C2F34A22E7833D001763CE /* const_folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08D22E7833C001763CE /* const_folding_rules.h */; };
+		A9C2F34B22E7833D001763CE /* scalar_replacement_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08E22E7833C001763CE /* scalar_replacement_pass.h */; };
+		A9C2F34C22E7833D001763CE /* scalar_replacement_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F08E22E7833C001763CE /* scalar_replacement_pass.h */; };
+		A9C2F34D22E7833D001763CE /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08F22E7833C001763CE /* instruction.cpp */; };
+		A9C2F34E22E7833D001763CE /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F08F22E7833C001763CE /* instruction.cpp */; };
+		A9C2F34F22E7833D001763CE /* pch_source_opt.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09022E7833C001763CE /* pch_source_opt.h */; };
+		A9C2F35022E7833D001763CE /* pch_source_opt.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09022E7833C001763CE /* pch_source_opt.h */; };
+		A9C2F35122E7833D001763CE /* reduce_load_size.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09122E7833C001763CE /* reduce_load_size.cpp */; };
+		A9C2F35222E7833D001763CE /* reduce_load_size.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09122E7833C001763CE /* reduce_load_size.cpp */; };
+		A9C2F35322E7833D001763CE /* redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09222E7833C001763CE /* redundancy_elimination.h */; };
+		A9C2F35422E7833D001763CE /* redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09222E7833C001763CE /* redundancy_elimination.h */; };
+		A9C2F35522E7833D001763CE /* fix_storage_class.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09322E7833C001763CE /* fix_storage_class.cpp */; };
+		A9C2F35622E7833D001763CE /* fix_storage_class.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09322E7833C001763CE /* fix_storage_class.cpp */; };
+		A9C2F35722E7833D001763CE /* value_number_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09422E7833C001763CE /* value_number_table.cpp */; };
+		A9C2F35822E7833D001763CE /* value_number_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09422E7833C001763CE /* value_number_table.cpp */; };
+		A9C2F35922E7833D001763CE /* local_ssa_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09522E7833C001763CE /* local_ssa_elim_pass.h */; };
+		A9C2F35A22E7833D001763CE /* local_ssa_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09522E7833C001763CE /* local_ssa_elim_pass.h */; };
+		A9C2F35B22E7833D001763CE /* inline_opaque_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09622E7833C001763CE /* inline_opaque_pass.cpp */; };
+		A9C2F35C22E7833D001763CE /* inline_opaque_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09622E7833C001763CE /* inline_opaque_pass.cpp */; };
+		A9C2F35D22E7833D001763CE /* replace_invalid_opc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09722E7833C001763CE /* replace_invalid_opc.cpp */; };
+		A9C2F35E22E7833D001763CE /* replace_invalid_opc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09722E7833C001763CE /* replace_invalid_opc.cpp */; };
+		A9C2F35F22E7833D001763CE /* loop_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09822E7833C001763CE /* loop_utils.h */; };
+		A9C2F36022E7833D001763CE /* loop_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09822E7833C001763CE /* loop_utils.h */; };
+		A9C2F36122E7833D001763CE /* module.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09922E7833C001763CE /* module.h */; };
+		A9C2F36222E7833D001763CE /* module.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09922E7833C001763CE /* module.h */; };
+		A9C2F36322E7833D001763CE /* dominator_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09A22E7833C001763CE /* dominator_analysis.cpp */; };
+		A9C2F36422E7833D001763CE /* dominator_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09A22E7833C001763CE /* dominator_analysis.cpp */; };
+		A9C2F36522E7833D001763CE /* decompose_initialized_variables_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09B22E7833C001763CE /* decompose_initialized_variables_pass.cpp */; };
+		A9C2F36622E7833D001763CE /* decompose_initialized_variables_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F09B22E7833C001763CE /* decompose_initialized_variables_pass.cpp */; };
+		A9C2F36722E7833D001763CE /* ir_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09C22E7833C001763CE /* ir_builder.h */; };
+		A9C2F36822E7833D001763CE /* ir_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09C22E7833C001763CE /* ir_builder.h */; };
+		A9C2F36922E7833D001763CE /* loop_unswitch_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09D22E7833C001763CE /* loop_unswitch_pass.h */; };
+		A9C2F36A22E7833D001763CE /* loop_unswitch_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09D22E7833C001763CE /* loop_unswitch_pass.h */; };
+		A9C2F36B22E7833D001763CE /* cfg.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09E22E7833C001763CE /* cfg.h */; };
+		A9C2F36C22E7833D001763CE /* cfg.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09E22E7833C001763CE /* cfg.h */; };
+		A9C2F36D22E7833D001763CE /* code_sink.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09F22E7833C001763CE /* code_sink.h */; };
+		A9C2F36E22E7833D001763CE /* code_sink.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F09F22E7833C001763CE /* code_sink.h */; };
+		A9C2F36F22E7833D001763CE /* loop_descriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A022E7833C001763CE /* loop_descriptor.h */; };
+		A9C2F37022E7833D001763CE /* loop_descriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A022E7833C001763CE /* loop_descriptor.h */; };
+		A9C2F37122E7833D001763CE /* generate_webgpu_initializers_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A122E7833C001763CE /* generate_webgpu_initializers_pass.h */; };
+		A9C2F37222E7833D001763CE /* generate_webgpu_initializers_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A122E7833C001763CE /* generate_webgpu_initializers_pass.h */; };
+		A9C2F37322E7833D001763CE /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A222E7833C001763CE /* instruction.h */; };
+		A9C2F37422E7833D001763CE /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A222E7833C001763CE /* instruction.h */; };
+		A9C2F37522E7833D001763CE /* aggressive_dead_code_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A322E7833C001763CE /* aggressive_dead_code_elim_pass.h */; };
+		A9C2F37622E7833D001763CE /* aggressive_dead_code_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A322E7833C001763CE /* aggressive_dead_code_elim_pass.h */; };
+		A9C2F37722E7833D001763CE /* struct_cfg_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0A422E7833C001763CE /* struct_cfg_analysis.cpp */; };
+		A9C2F37822E7833D001763CE /* struct_cfg_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0A422E7833C001763CE /* struct_cfg_analysis.cpp */; };
+		A9C2F37922E7833D001763CE /* vector_dce.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A522E7833C001763CE /* vector_dce.h */; };
+		A9C2F37A22E7833D001763CE /* vector_dce.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A522E7833C001763CE /* vector_dce.h */; };
+		A9C2F37B22E7833D001763CE /* combine_access_chains.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A622E7833C001763CE /* combine_access_chains.h */; };
+		A9C2F37C22E7833D001763CE /* combine_access_chains.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A622E7833C001763CE /* combine_access_chains.h */; };
+		A9C2F37D22E7833D001763CE /* pass_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A722E7833C001763CE /* pass_manager.h */; };
+		A9C2F37E22E7833D001763CE /* pass_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0A722E7833C001763CE /* pass_manager.h */; };
+		A9C2F37F22E7833D001763CE /* local_access_chain_convert_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0A822E7833C001763CE /* local_access_chain_convert_pass.cpp */; };
+		A9C2F38022E7833D001763CE /* local_access_chain_convert_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0A822E7833C001763CE /* local_access_chain_convert_pass.cpp */; };
+		A9C2F38122E7833D001763CE /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0A922E7833C001763CE /* basic_block.cpp */; };
+		A9C2F38222E7833D001763CE /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0A922E7833C001763CE /* basic_block.cpp */; };
+		A9C2F38322E7833D001763CE /* iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AA22E7833C001763CE /* iterator.h */; };
+		A9C2F38422E7833D001763CE /* iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AA22E7833C001763CE /* iterator.h */; };
+		A9C2F38522E7833D001763CE /* licm_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AB22E7833C001763CE /* licm_pass.h */; };
+		A9C2F38622E7833D001763CE /* licm_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AB22E7833C001763CE /* licm_pass.h */; };
+		A9C2F38722E7833D001763CE /* build_module.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AC22E7833C001763CE /* build_module.h */; };
+		A9C2F38822E7833D001763CE /* build_module.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AC22E7833C001763CE /* build_module.h */; };
+		A9C2F38922E7833D001763CE /* ccp_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AD22E7833C001763CE /* ccp_pass.h */; };
+		A9C2F38A22E7833D001763CE /* ccp_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AD22E7833C001763CE /* ccp_pass.h */; };
+		A9C2F38B22E7833D001763CE /* decompose_initialized_variables_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AE22E7833C001763CE /* decompose_initialized_variables_pass.h */; };
+		A9C2F38C22E7833D001763CE /* decompose_initialized_variables_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AE22E7833C001763CE /* decompose_initialized_variables_pass.h */; };
+		A9C2F38D22E7833D001763CE /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AF22E7833C001763CE /* function.h */; };
+		A9C2F38E22E7833D001763CE /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0AF22E7833C001763CE /* function.h */; };
+		A9C2F38F22E7833D001763CE /* loop_fusion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B022E7833C001763CE /* loop_fusion.cpp */; };
+		A9C2F39022E7833D001763CE /* loop_fusion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B022E7833C001763CE /* loop_fusion.cpp */; };
+		A9C2F39122E7833D001763CE /* upgrade_memory_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B122E7833C001763CE /* upgrade_memory_model.cpp */; };
+		A9C2F39222E7833D001763CE /* upgrade_memory_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B122E7833C001763CE /* upgrade_memory_model.cpp */; };
+		A9C2F39322E7833D001763CE /* feature_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B222E7833C001763CE /* feature_manager.h */; };
+		A9C2F39422E7833D001763CE /* feature_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B222E7833C001763CE /* feature_manager.h */; };
+		A9C2F39522E7833D001763CE /* inst_bindless_check_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B322E7833C001763CE /* inst_bindless_check_pass.h */; };
+		A9C2F39622E7833D001763CE /* inst_bindless_check_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B322E7833C001763CE /* inst_bindless_check_pass.h */; };
+		A9C2F39722E7833D001763CE /* scalar_analysis_simplification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B422E7833C001763CE /* scalar_analysis_simplification.cpp */; };
+		A9C2F39822E7833D001763CE /* scalar_analysis_simplification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B422E7833C001763CE /* scalar_analysis_simplification.cpp */; };
+		A9C2F39922E7833D001763CE /* set_spec_constant_default_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B522E7833C001763CE /* set_spec_constant_default_value_pass.h */; };
+		A9C2F39A22E7833D001763CE /* set_spec_constant_default_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B522E7833C001763CE /* set_spec_constant_default_value_pass.h */; };
+		A9C2F39B22E7833D001763CE /* dominator_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B622E7833C001763CE /* dominator_tree.h */; };
+		A9C2F39C22E7833D001763CE /* dominator_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B622E7833C001763CE /* dominator_tree.h */; };
+		A9C2F39D22E7833D001763CE /* legalize_vector_shuffle_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B722E7833C001763CE /* legalize_vector_shuffle_pass.cpp */; };
+		A9C2F39E22E7833D001763CE /* legalize_vector_shuffle_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B722E7833C001763CE /* legalize_vector_shuffle_pass.cpp */; };
+		A9C2F39F22E7833D001763CE /* type_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B822E7833C001763CE /* type_manager.h */; };
+		A9C2F3A022E7833D001763CE /* type_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0B822E7833C001763CE /* type_manager.h */; };
+		A9C2F3A122E7833D001763CE /* compact_ids_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B922E7833C001763CE /* compact_ids_pass.cpp */; };
+		A9C2F3A222E7833D001763CE /* compact_ids_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0B922E7833C001763CE /* compact_ids_pass.cpp */; };
+		A9C2F3A322E7833D001763CE /* loop_peeling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0BA22E7833C001763CE /* loop_peeling.cpp */; };
+		A9C2F3A422E7833D001763CE /* loop_peeling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0BA22E7833C001763CE /* loop_peeling.cpp */; };
+		A9C2F3A522E7833D001763CE /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0BB22E7833C001763CE /* table.h */; };
+		A9C2F3A622E7833D001763CE /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0BB22E7833C001763CE /* table.h */; };
+		A9C2F41B22E7833D001763CE /* ext_inst.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0F922E7833D001763CE /* ext_inst.h */; };
+		A9C2F41C22E7833D001763CE /* ext_inst.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0F922E7833D001763CE /* ext_inst.h */; };
+		A9C2F41D22E7833D001763CE /* diagnostic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0FA22E7833D001763CE /* diagnostic.cpp */; };
+		A9C2F41E22E7833D001763CE /* diagnostic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0FA22E7833D001763CE /* diagnostic.cpp */; };
+		A9C2F41F22E7833D001763CE /* latest_version_spirv_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0FB22E7833D001763CE /* latest_version_spirv_header.h */; };
+		A9C2F42022E7833D001763CE /* latest_version_spirv_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0FB22E7833D001763CE /* latest_version_spirv_header.h */; };
+		A9C2F42122E7833D001763CE /* libspirv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0FC22E7833D001763CE /* libspirv.cpp */; };
+		A9C2F42222E7833D001763CE /* libspirv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F0FC22E7833D001763CE /* libspirv.cpp */; };
+		A9C2F42322E7833D001763CE /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0FD22E7833D001763CE /* instruction.h */; };
+		A9C2F42422E7833D001763CE /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0FD22E7833D001763CE /* instruction.h */; };
+		A9C2F42522E7833D001763CE /* spirv_optimizer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0FE22E7833D001763CE /* spirv_optimizer_options.h */; };
+		A9C2F42622E7833D001763CE /* spirv_optimizer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0FE22E7833D001763CE /* spirv_optimizer_options.h */; };
+		A9C2F42722E7833D001763CE /* opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0FF22E7833D001763CE /* opcode.h */; };
+		A9C2F42822E7833D001763CE /* opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F0FF22E7833D001763CE /* opcode.h */; };
+		A9C2F42922E7833D001763CE /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10022E7833D001763CE /* operand.cpp */; };
+		A9C2F42A22E7833D001763CE /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10022E7833D001763CE /* operand.cpp */; };
+		A9C2F42B22E7833D001763CE /* latest_version_glsl_std_450_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F10122E7833D001763CE /* latest_version_glsl_std_450_header.h */; };
+		A9C2F42C22E7833D001763CE /* latest_version_glsl_std_450_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F10122E7833D001763CE /* latest_version_glsl_std_450_header.h */; };
+		A9C2F42D22E7833D001763CE /* extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F10222E7833D001763CE /* extensions.h */; };
+		A9C2F42E22E7833D001763CE /* extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F10222E7833D001763CE /* extensions.h */; };
+		A9C2F42F22E7833D001763CE /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10322E7833D001763CE /* disassemble.cpp */; };
+		A9C2F43022E7833D001763CE /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10322E7833D001763CE /* disassemble.cpp */; };
+		A9C2F43122E7833D001763CE /* binary.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F10422E7833D001763CE /* binary.h */; };
+		A9C2F43222E7833D001763CE /* binary.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F10422E7833D001763CE /* binary.h */; };
+		A9C2F43322E7833D001763CE /* text_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10522E7833D001763CE /* text_handler.cpp */; };
+		A9C2F43422E7833D001763CE /* text_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10522E7833D001763CE /* text_handler.cpp */; };
+		A9C2F43522E7833D001763CE /* validate_annotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10722E7833D001763CE /* validate_annotation.cpp */; };
+		A9C2F43622E7833D001763CE /* validate_annotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10722E7833D001763CE /* validate_annotation.cpp */; };
+		A9C2F43722E7833D001763CE /* validate_misc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10822E7833D001763CE /* validate_misc.cpp */; };
+		A9C2F43822E7833D001763CE /* validate_misc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10822E7833D001763CE /* validate_misc.cpp */; };
+		A9C2F43922E7833D001763CE /* validate_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10922E7833D001763CE /* validate_cfg.cpp */; };
+		A9C2F43A22E7833D001763CE /* validate_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10922E7833D001763CE /* validate_cfg.cpp */; };
+		A9C2F43B22E7833D001763CE /* validate_capability.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10A22E7833D001763CE /* validate_capability.cpp */; };
+		A9C2F43C22E7833D001763CE /* validate_capability.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10A22E7833D001763CE /* validate_capability.cpp */; };
+		A9C2F43D22E7833D001763CE /* construct.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F10B22E7833D001763CE /* construct.h */; };
+		A9C2F43E22E7833D001763CE /* construct.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F10B22E7833D001763CE /* construct.h */; };
+		A9C2F43F22E7833D001763CE /* validate_barriers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10C22E7833D001763CE /* validate_barriers.cpp */; };
+		A9C2F44022E7833D001763CE /* validate_barriers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10C22E7833D001763CE /* validate_barriers.cpp */; };
+		A9C2F44122E7833D001763CE /* validate_non_uniform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10D22E7833D001763CE /* validate_non_uniform.cpp */; };
+		A9C2F44222E7833D001763CE /* validate_non_uniform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10D22E7833D001763CE /* validate_non_uniform.cpp */; };
+		A9C2F44322E7833D001763CE /* validate_scopes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10E22E7833D001763CE /* validate_scopes.cpp */; };
+		A9C2F44422E7833D001763CE /* validate_scopes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10E22E7833D001763CE /* validate_scopes.cpp */; };
+		A9C2F44522E7833D001763CE /* validate_atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10F22E7833D001763CE /* validate_atomics.cpp */; };
+		A9C2F44622E7833D001763CE /* validate_atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F10F22E7833D001763CE /* validate_atomics.cpp */; };
+		A9C2F44722E7833D001763CE /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F11022E7833D001763CE /* basic_block.h */; };
+		A9C2F44822E7833D001763CE /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F11022E7833D001763CE /* basic_block.h */; };
+		A9C2F44922E7833D001763CE /* validate_instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11122E7833D001763CE /* validate_instruction.cpp */; };
+		A9C2F44A22E7833D001763CE /* validate_instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11122E7833D001763CE /* validate_instruction.cpp */; };
+		A9C2F44B22E7833D001763CE /* validate_decorations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11222E7833D001763CE /* validate_decorations.cpp */; };
+		A9C2F44C22E7833D001763CE /* validate_decorations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11222E7833D001763CE /* validate_decorations.cpp */; };
+		A9C2F44D22E7833D001763CE /* validate_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11322E7833D001763CE /* validate_debug.cpp */; };
+		A9C2F44E22E7833D001763CE /* validate_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11322E7833D001763CE /* validate_debug.cpp */; };
+		A9C2F44F22E7833D001763CE /* validate_builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11422E7833D001763CE /* validate_builtins.cpp */; };
+		A9C2F45022E7833D001763CE /* validate_builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11422E7833D001763CE /* validate_builtins.cpp */; };
+		A9C2F45122E7833D001763CE /* validate_interfaces.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11522E7833D001763CE /* validate_interfaces.cpp */; };
+		A9C2F45222E7833D001763CE /* validate_interfaces.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11522E7833D001763CE /* validate_interfaces.cpp */; };
+		A9C2F45322E7833D001763CE /* validate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11622E7833D001763CE /* validate.cpp */; };
+		A9C2F45422E7833D001763CE /* validate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11622E7833D001763CE /* validate.cpp */; };
+		A9C2F45522E7833D001763CE /* validation_state.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F11722E7833D001763CE /* validation_state.h */; };
+		A9C2F45622E7833D001763CE /* validation_state.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F11722E7833D001763CE /* validation_state.h */; };
+		A9C2F45722E7833D001763CE /* validate_constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11822E7833D001763CE /* validate_constants.cpp */; };
+		A9C2F45822E7833D001763CE /* validate_constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11822E7833D001763CE /* validate_constants.cpp */; };
+		A9C2F45922E7833D001763CE /* validate_bitwise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11922E7833D001763CE /* validate_bitwise.cpp */; };
+		A9C2F45A22E7833D001763CE /* validate_bitwise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11922E7833D001763CE /* validate_bitwise.cpp */; };
+		A9C2F45B22E7833D001763CE /* validate_extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11A22E7833D001763CE /* validate_extensions.cpp */; };
+		A9C2F45C22E7833D001763CE /* validate_extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11A22E7833D001763CE /* validate_extensions.cpp */; };
+		A9C2F45D22E7833D001763CE /* construct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11B22E7833D001763CE /* construct.cpp */; };
+		A9C2F45E22E7833D001763CE /* construct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11B22E7833D001763CE /* construct.cpp */; };
+		A9C2F45F22E7833D001763CE /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11C22E7833D001763CE /* function.cpp */; };
+		A9C2F46022E7833D001763CE /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11C22E7833D001763CE /* function.cpp */; };
+		A9C2F46122E7833D001763CE /* validate.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F11D22E7833D001763CE /* validate.h */; };
+		A9C2F46222E7833D001763CE /* validate.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F11D22E7833D001763CE /* validate.h */; };
+		A9C2F46322E7833D001763CE /* validate_adjacency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11E22E7833D001763CE /* validate_adjacency.cpp */; };
+		A9C2F46422E7833D001763CE /* validate_adjacency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11E22E7833D001763CE /* validate_adjacency.cpp */; };
+		A9C2F46522E7833D001763CE /* validate_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11F22E7833D001763CE /* validate_conversion.cpp */; };
+		A9C2F46622E7833D001763CE /* validate_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F11F22E7833D001763CE /* validate_conversion.cpp */; };
+		A9C2F46722E7833D001763CE /* validate_small_type_uses.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12022E7833D001763CE /* validate_small_type_uses.cpp */; };
+		A9C2F46822E7833D001763CE /* validate_small_type_uses.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12022E7833D001763CE /* validate_small_type_uses.cpp */; };
+		A9C2F46922E7833D001763CE /* validate_datarules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12122E7833D001763CE /* validate_datarules.cpp */; };
+		A9C2F46A22E7833D001763CE /* validate_datarules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12122E7833D001763CE /* validate_datarules.cpp */; };
+		A9C2F46B22E7833D001763CE /* validate_scopes.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F12222E7833D001763CE /* validate_scopes.h */; };
+		A9C2F46C22E7833D001763CE /* validate_scopes.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F12222E7833D001763CE /* validate_scopes.h */; };
+		A9C2F46D22E7833D001763CE /* validate_id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12322E7833D001763CE /* validate_id.cpp */; };
+		A9C2F46E22E7833D001763CE /* validate_id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12322E7833D001763CE /* validate_id.cpp */; };
+		A9C2F46F22E7833D001763CE /* validate_memory_semantics.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F12422E7833D001763CE /* validate_memory_semantics.h */; };
+		A9C2F47022E7833D001763CE /* validate_memory_semantics.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F12422E7833D001763CE /* validate_memory_semantics.h */; };
+		A9C2F47122E7833D001763CE /* validate_arithmetics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12522E7833D001763CE /* validate_arithmetics.cpp */; };
+		A9C2F47222E7833D001763CE /* validate_arithmetics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12522E7833D001763CE /* validate_arithmetics.cpp */; };
+		A9C2F47322E7833D001763CE /* validate_mode_setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12622E7833D001763CE /* validate_mode_setting.cpp */; };
+		A9C2F47422E7833D001763CE /* validate_mode_setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12622E7833D001763CE /* validate_mode_setting.cpp */; };
+		A9C2F47522E7833D001763CE /* validate_memory_semantics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12722E7833D001763CE /* validate_memory_semantics.cpp */; };
+		A9C2F47622E7833D001763CE /* validate_memory_semantics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12722E7833D001763CE /* validate_memory_semantics.cpp */; };
+		A9C2F47722E7833D001763CE /* validate_logicals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12822E7833D001763CE /* validate_logicals.cpp */; };
+		A9C2F47822E7833D001763CE /* validate_logicals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12822E7833D001763CE /* validate_logicals.cpp */; };
+		A9C2F47922E7833D001763CE /* validate_derivatives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12922E7833D001763CE /* validate_derivatives.cpp */; };
+		A9C2F47A22E7833D001763CE /* validate_derivatives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12922E7833D001763CE /* validate_derivatives.cpp */; };
+		A9C2F47B22E7833D001763CE /* validate_memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12A22E7833D001763CE /* validate_memory.cpp */; };
+		A9C2F47C22E7833D001763CE /* validate_memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12A22E7833D001763CE /* validate_memory.cpp */; };
+		A9C2F47D22E7833D001763CE /* validate_image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12B22E7833D001763CE /* validate_image.cpp */; };
+		A9C2F47E22E7833D001763CE /* validate_image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12B22E7833D001763CE /* validate_image.cpp */; };
+		A9C2F47F22E7833D001763CE /* validate_literals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12C22E7833D001763CE /* validate_literals.cpp */; };
+		A9C2F48022E7833D001763CE /* validate_literals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12C22E7833D001763CE /* validate_literals.cpp */; };
+		A9C2F48122E7833D001763CE /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12D22E7833D001763CE /* instruction.cpp */; };
+		A9C2F48222E7833D001763CE /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12D22E7833D001763CE /* instruction.cpp */; };
+		A9C2F48322E7833D001763CE /* validate_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12E22E7833D001763CE /* validate_type.cpp */; };
+		A9C2F48422E7833D001763CE /* validate_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F12E22E7833D001763CE /* validate_type.cpp */; };
+		A9C2F48522E7833D001763CE /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F12F22E7833D001763CE /* instruction.h */; };
+		A9C2F48622E7833D001763CE /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F12F22E7833D001763CE /* instruction.h */; };
+		A9C2F48722E7833D001763CE /* validate_execution_limitations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13022E7833D001763CE /* validate_execution_limitations.cpp */; };
+		A9C2F48822E7833D001763CE /* validate_execution_limitations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13022E7833D001763CE /* validate_execution_limitations.cpp */; };
+		A9C2F48922E7833D001763CE /* validate_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13122E7833D001763CE /* validate_layout.cpp */; };
+		A9C2F48A22E7833D001763CE /* validate_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13122E7833D001763CE /* validate_layout.cpp */; };
+		A9C2F48B22E7833D001763CE /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13222E7833D001763CE /* basic_block.cpp */; };
+		A9C2F48C22E7833D001763CE /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13222E7833D001763CE /* basic_block.cpp */; };
+		A9C2F48D22E7833D001763CE /* validate_function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13322E7833D001763CE /* validate_function.cpp */; };
+		A9C2F48E22E7833D001763CE /* validate_function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13322E7833D001763CE /* validate_function.cpp */; };
+		A9C2F48F22E7833D001763CE /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F13422E7833D001763CE /* function.h */; };
+		A9C2F49022E7833D001763CE /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F13422E7833D001763CE /* function.h */; };
+		A9C2F49122E7833D001763CE /* validate_composites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13522E7833D001763CE /* validate_composites.cpp */; };
+		A9C2F49222E7833D001763CE /* validate_composites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13522E7833D001763CE /* validate_composites.cpp */; };
+		A9C2F49322E7833D001763CE /* validation_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13622E7833D001763CE /* validation_state.cpp */; };
+		A9C2F49422E7833D001763CE /* validation_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13622E7833D001763CE /* validation_state.cpp */; };
+		A9C2F49522E7833D001763CE /* validate_primitives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13722E7833D001763CE /* validate_primitives.cpp */; };
+		A9C2F49622E7833D001763CE /* validate_primitives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C2F13722E7833D001763CE /* validate_primitives.cpp */; };
+		A9C2F49722E7833D001763CE /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F13822E7833D001763CE /* decoration.h */; };
+		A9C2F49822E7833D001763CE /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2F13822E7833D001763CE /* decoration.h */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -1078,390 +1076,6 @@
 		450A4F64221C5A95007203D7 /* spirv_reflect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_reflect.cpp; sourceTree = "<group>"; };
 		A90FD89F21CC4EAB00B92BB2 /* libSPIRVCross.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVCross.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		A90FD9E421CC4EB900B92BB2 /* libSPIRVCross.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVCross.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		A94A673E22B17BBB00C661C6 /* spirv_target_env.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_target_env.cpp; sourceTree = "<group>"; };
-		A94A673F22B17BBB00C661C6 /* extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json"; sourceTree = "<group>"; };
-		A94A674022B17BBB00C661C6 /* spirv_fuzzer_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_fuzzer_options.h; sourceTree = "<group>"; };
-		A94A674122B17BBB00C661C6 /* assembly_grammar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembly_grammar.h; sourceTree = "<group>"; };
-		A94A674222B17BBB00C661C6 /* enum_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum_set.h; sourceTree = "<group>"; };
-		A94A674322B17BBB00C661C6 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
-		A94A674422B17BBB00C661C6 /* extinst.spv-amd-shader-ballot.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-ballot.grammar.json"; sourceTree = "<group>"; };
-		A94A674522B17BBB00C661C6 /* text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text.cpp; sourceTree = "<group>"; };
-		A94A674622B17BBB00C661C6 /* assembly_grammar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembly_grammar.cpp; sourceTree = "<group>"; };
-		A94A674722B17BBB00C661C6 /* text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text.h; sourceTree = "<group>"; };
-		A94A674822B17BBB00C661C6 /* extensions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = extensions.cpp; sourceTree = "<group>"; };
-		A94A674922B17BBB00C661C6 /* pch_source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch_source.cpp; sourceTree = "<group>"; };
-		A94A674B22B17BBB00C661C6 /* parse_number.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse_number.h; sourceTree = "<group>"; };
-		A94A674C22B17BBB00C661C6 /* ilist_node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ilist_node.h; sourceTree = "<group>"; };
-		A94A674D22B17BBB00C661C6 /* make_unique.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = make_unique.h; sourceTree = "<group>"; };
-		A94A674E22B17BBB00C661C6 /* string_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_utils.h; sourceTree = "<group>"; };
-		A94A674F22B17BBB00C661C6 /* small_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = small_vector.h; sourceTree = "<group>"; };
-		A94A675022B17BBB00C661C6 /* timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timer.cpp; sourceTree = "<group>"; };
-		A94A675122B17BBB00C661C6 /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timer.h; sourceTree = "<group>"; };
-		A94A675222B17BBB00C661C6 /* string_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_utils.cpp; sourceTree = "<group>"; };
-		A94A675322B17BBB00C661C6 /* bit_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_vector.h; sourceTree = "<group>"; };
-		A94A675422B17BBB00C661C6 /* bitutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitutils.h; sourceTree = "<group>"; };
-		A94A675522B17BBB00C661C6 /* hex_float.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hex_float.h; sourceTree = "<group>"; };
-		A94A675622B17BBB00C661C6 /* parse_number.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parse_number.cpp; sourceTree = "<group>"; };
-		A94A675722B17BBB00C661C6 /* bit_vector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bit_vector.cpp; sourceTree = "<group>"; };
-		A94A675822B17BBB00C661C6 /* ilist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ilist.h; sourceTree = "<group>"; };
-		A94A675922B17BBB00C661C6 /* spirv_target_env.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_target_env.h; sourceTree = "<group>"; };
-		A94A675A22B17BBB00C661C6 /* table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = table.cpp; sourceTree = "<group>"; };
-		A94A675C22B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand_to_undef_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A675D22B17BBB00C661C6 /* remove_selection_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_selection_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A675E22B17BBB00C661C6 /* remove_block_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_block_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A675F22B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand_to_dominating_id_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A676022B17BBB00C661C6 /* reduction_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduction_pass.cpp; sourceTree = "<group>"; };
-		A94A676122B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand_to_const_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A676222B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand_to_const_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A676322B17BBB00C661C6 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
-		A94A676422B17BBB00C661C6 /* reduction_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduction_util.cpp; sourceTree = "<group>"; };
-		A94A676522B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = structured_loop_to_selection_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A676622B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simple_conditional_branch_to_branch_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A676722B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_function_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A676822B17BBB00C661C6 /* remove_instruction_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_instruction_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A676922B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conditional_branch_to_simple_conditional_branch_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A676A22B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simple_conditional_branch_to_branch_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A676B22B17BBB00C661C6 /* remove_function_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_function_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A676C22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_opname_instruction_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A676D22B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simple_conditional_branch_to_branch_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A676E22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_selection_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A676F22B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A677022B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simple_conditional_branch_to_branch_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A677122B17BBB00C661C6 /* merge_blocks_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = merge_blocks_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A677222B17BBB00C661C6 /* change_operand_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = change_operand_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A677322B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = structured_loop_to_selection_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A677422B17BBB00C661C6 /* remove_function_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_function_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A677522B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = change_operand_to_undef_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A677622B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_unreferenced_instruction_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A677722B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = structured_loop_to_selection_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A677822B17BBB00C661C6 /* remove_selection_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_selection_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A677922B17BBB00C661C6 /* remove_instruction_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_instruction_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A677A22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_selection_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A677B22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge_blocks_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A677C22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_opname_instruction_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A677D22B17BBB00C661C6 /* pch_source_reduce.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch_source_reduce.cpp; sourceTree = "<group>"; };
-		A94A677E22B17BBB00C661C6 /* reducer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reducer.cpp; sourceTree = "<group>"; };
-		A94A677F22B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand_to_undef_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A678022B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_function_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A678122B17BBB00C661C6 /* pch_source_reduce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch_source_reduce.h; sourceTree = "<group>"; };
-		A94A678222B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_unreferenced_instruction_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A678322B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = merge_blocks_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A678422B17BBB00C661C6 /* reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A678522B17BBB00C661C6 /* reducer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reducer.h; sourceTree = "<group>"; };
-		A94A678622B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = change_operand_to_undef_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A678722B17BBB00C661C6 /* reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A678822B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conditional_branch_to_simple_conditional_branch_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A678922B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand_to_dominating_id_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A678A22B17BBB00C661C6 /* reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A678B22B17BBB00C661C6 /* change_operand_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = change_operand_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A678C22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_block_reduction_opportunity_finder.h; sourceTree = "<group>"; };
-		A94A678D22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_block_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A678E22B17BBB00C661C6 /* reduction_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_util.h; sourceTree = "<group>"; };
-		A94A678F22B17BBB00C661C6 /* merge_blocks_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge_blocks_reduction_opportunity.h; sourceTree = "<group>"; };
-		A94A679022B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp; sourceTree = "<group>"; };
-		A94A679122B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = structured_loop_to_selection_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A679222B17BBB00C661C6 /* remove_block_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_block_reduction_opportunity.cpp; sourceTree = "<group>"; };
-		A94A679322B17BBB00C661C6 /* reduction_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_pass.h; sourceTree = "<group>"; };
-		A94A679422B17BBB00C661C6 /* latest_version_opencl_std_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_opencl_std_header.h; sourceTree = "<group>"; };
-		A94A679522B17BBB00C661C6 /* spirv_optimizer_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_optimizer_options.cpp; sourceTree = "<group>"; };
-		A94A679622B17BBB00C661C6 /* cfa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfa.h; sourceTree = "<group>"; };
-		A94A679722B17BBB00C661C6 /* pch_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch_source.h; sourceTree = "<group>"; };
-		A94A679822B17BBB00C661C6 /* enum_string_mapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum_string_mapping.h; sourceTree = "<group>"; };
-		A94A679922B17BBB00C661C6 /* spirv_fuzzer_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_fuzzer_options.cpp; sourceTree = "<group>"; };
-		A94A679A22B17BBB00C661C6 /* spirv_reducer_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_reducer_options.h; sourceTree = "<group>"; };
-		A94A679B22B17BBB00C661C6 /* spirv_validator_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_validator_options.cpp; sourceTree = "<group>"; };
-		A94A679C22B17BBB00C661C6 /* extinst.spv-amd-shader-trinary-minmax.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-trinary-minmax.grammar.json"; sourceTree = "<group>"; };
-		A94A679D22B17BBB00C661C6 /* print.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = print.cpp; sourceTree = "<group>"; };
-		A94A679E22B17BBB00C661C6 /* spirv_definition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_definition.h; sourceTree = "<group>"; };
-		A94A679F22B17BBB00C661C6 /* operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand.h; sourceTree = "<group>"; };
-		A94A67A022B17BBB00C661C6 /* spirv_endian.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_endian.cpp; sourceTree = "<group>"; };
-		A94A67A122B17BBB00C661C6 /* macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macro.h; sourceTree = "<group>"; };
-		A94A67A222B17BBB00C661C6 /* spirv_constant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_constant.h; sourceTree = "<group>"; };
-		A94A67A322B17BBB00C661C6 /* extinst.spv-amd-gcn-shader.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-gcn-shader.grammar.json"; sourceTree = "<group>"; };
-		A94A67A422B17BBB00C661C6 /* binary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binary.cpp; sourceTree = "<group>"; };
-		A94A67A522B17BBB00C661C6 /* spirv_validator_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_validator_options.h; sourceTree = "<group>"; };
-		A94A67A622B17BBB00C661C6 /* enum_string_mapping.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = enum_string_mapping.cpp; sourceTree = "<group>"; };
-		A94A67A722B17BBB00C661C6 /* text_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text_handler.h; sourceTree = "<group>"; };
-		A94A67A822B17BBB00C661C6 /* parsed_operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parsed_operand.h; sourceTree = "<group>"; };
-		A94A67A922B17BBB00C661C6 /* name_mapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = name_mapper.h; sourceTree = "<group>"; };
-		A94A67AA22B17BBB00C661C6 /* spirv_reducer_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_reducer_options.cpp; sourceTree = "<group>"; };
-		A94A67AB22B17BBB00C661C6 /* parsed_operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parsed_operand.cpp; sourceTree = "<group>"; };
-		A94A67AC22B17BBB00C661C6 /* diagnostic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = diagnostic.h; sourceTree = "<group>"; };
-		A94A67AD22B17BBB00C661C6 /* spirv_endian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_endian.h; sourceTree = "<group>"; };
-		A94A67AE22B17BBB00C661C6 /* name_mapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = name_mapper.cpp; sourceTree = "<group>"; };
-		A94A67AF22B17BBB00C661C6 /* extinst.debuginfo.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = extinst.debuginfo.grammar.json; sourceTree = "<group>"; };
-		A94A67B122B17BBB00C661C6 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
-		A94A67B222B17BBB00C661C6 /* linker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linker.cpp; sourceTree = "<group>"; };
-		A94A67B322B17BBB00C661C6 /* software_version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = software_version.cpp; sourceTree = "<group>"; };
-		A94A67B422B17BBB00C661C6 /* opcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode.cpp; sourceTree = "<group>"; };
-		A94A67B522B17BBB00C661C6 /* print.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = print.h; sourceTree = "<group>"; };
-		A94A67B622B17BBB00C661C6 /* ext_inst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ext_inst.cpp; sourceTree = "<group>"; };
-		A94A67B722B17BBB00C661C6 /* disassemble.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disassemble.h; sourceTree = "<group>"; };
-		A94A67B922B17BBB00C661C6 /* optimizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = optimizer.cpp; sourceTree = "<group>"; };
-		A94A67BA22B17BBB00C661C6 /* if_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = if_conversion.h; sourceTree = "<group>"; };
-		A94A67BB22B17BBB00C661C6 /* register_pressure.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = register_pressure.cpp; sourceTree = "<group>"; };
-		A94A67BC22B17BBB00C661C6 /* loop_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_utils.cpp; sourceTree = "<group>"; };
-		A94A67BD22B17BBB00C661C6 /* merge_return_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge_return_pass.h; sourceTree = "<group>"; };
-		A94A67BE22B17BBB00C661C6 /* inline_opaque_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_opaque_pass.h; sourceTree = "<group>"; };
-		A94A67BF22B17BBB00C661C6 /* loop_fusion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fusion.h; sourceTree = "<group>"; };
-		A94A67C022B17BBB00C661C6 /* combine_access_chains.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = combine_access_chains.cpp; sourceTree = "<group>"; };
-		A94A67C122B17BBB00C661C6 /* build_module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = build_module.cpp; sourceTree = "<group>"; };
-		A94A67C222B17BBB00C661C6 /* composite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = composite.h; sourceTree = "<group>"; };
-		A94A67C322B17BBB00C661C6 /* compact_ids_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compact_ids_pass.h; sourceTree = "<group>"; };
-		A94A67C422B17BBB00C661C6 /* register_pressure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = register_pressure.h; sourceTree = "<group>"; };
-		A94A67C522B17BBB00C661C6 /* tree_iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tree_iterator.h; sourceTree = "<group>"; };
-		A94A67C622B17BBB00C661C6 /* strip_atomic_counter_memory_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_atomic_counter_memory_pass.h; sourceTree = "<group>"; };
-		A94A67C722B17BBB00C661C6 /* legalize_vector_shuffle_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = legalize_vector_shuffle_pass.h; sourceTree = "<group>"; };
-		A94A67C822B17BBB00C661C6 /* local_single_store_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_single_store_elim_pass.h; sourceTree = "<group>"; };
-		A94A67C922B17BBB00C661C6 /* reduce_load_size.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduce_load_size.h; sourceTree = "<group>"; };
-		A94A67CA22B17BBB00C661C6 /* code_sink.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = code_sink.cpp; sourceTree = "<group>"; };
-		A94A67CB22B17BBB00C661C6 /* types.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = types.cpp; sourceTree = "<group>"; };
-		A94A67CC22B17BBB00C661C6 /* scalar_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_analysis.h; sourceTree = "<group>"; };
-		A94A67CD22B17BBB00C661C6 /* strip_debug_info_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_debug_info_pass.h; sourceTree = "<group>"; };
-		A94A67CE22B17BBB00C661C6 /* cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cfg.cpp; sourceTree = "<group>"; };
-		A94A67CF22B17BBB00C661C6 /* strip_atomic_counter_memory_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strip_atomic_counter_memory_pass.cpp; sourceTree = "<group>"; };
-		A94A67D022B17BBB00C661C6 /* decoration_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decoration_manager.cpp; sourceTree = "<group>"; };
-		A94A67D122B17BBB00C661C6 /* local_single_block_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_single_block_elim_pass.cpp; sourceTree = "<group>"; };
-		A94A67D222B17BBB00C661C6 /* freeze_spec_constant_value_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = freeze_spec_constant_value_pass.cpp; sourceTree = "<group>"; };
-		A94A67D322B17BBB00C661C6 /* replace_invalid_opc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = replace_invalid_opc.h; sourceTree = "<group>"; };
-		A94A67D422B17BBB00C661C6 /* local_access_chain_convert_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_access_chain_convert_pass.h; sourceTree = "<group>"; };
-		A94A67D522B17BBB00C661C6 /* inst_bindless_check_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inst_bindless_check_pass.cpp; sourceTree = "<group>"; };
-		A94A67D622B17BBB00C661C6 /* local_redundancy_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_redundancy_elimination.cpp; sourceTree = "<group>"; };
-		A94A67D722B17BBB00C661C6 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
-		A94A67D822B17BBB00C661C6 /* instrument_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instrument_pass.cpp; sourceTree = "<group>"; };
-		A94A67D922B17BBB00C661C6 /* propagator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = propagator.h; sourceTree = "<group>"; };
-		A94A67DA22B17BBB00C661C6 /* instruction_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction_list.h; sourceTree = "<group>"; };
-		A94A67DB22B17BBB00C661C6 /* feature_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = feature_manager.cpp; sourceTree = "<group>"; };
-		A94A67DC22B17BBB00C661C6 /* pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pass.cpp; sourceTree = "<group>"; };
-		A94A67DD22B17BBB00C661C6 /* loop_fission.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fission.cpp; sourceTree = "<group>"; };
-		A94A67DE22B17BBB00C661C6 /* dominator_tree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dominator_tree.cpp; sourceTree = "<group>"; };
-		A94A67DF22B17BBB00C661C6 /* merge_return_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = merge_return_pass.cpp; sourceTree = "<group>"; };
-		A94A67E022B17BBB00C661C6 /* ir_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_context.h; sourceTree = "<group>"; };
-		A94A67E122B17BBB00C661C6 /* eliminate_dead_constant_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_constant_pass.cpp; sourceTree = "<group>"; };
-		A94A67E222B17BBB00C661C6 /* cfg_cleanup_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cfg_cleanup_pass.cpp; sourceTree = "<group>"; };
-		A94A67E322B17BBB00C661C6 /* const_folding_rules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = const_folding_rules.cpp; sourceTree = "<group>"; };
-		A94A67E422B17BBB00C661C6 /* loop_unroller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_unroller.h; sourceTree = "<group>"; };
-		A94A67E522B17BBB00C661C6 /* strip_debug_info_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strip_debug_info_pass.cpp; sourceTree = "<group>"; };
-		A94A67E622B17BBB00C661C6 /* ssa_rewrite_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ssa_rewrite_pass.cpp; sourceTree = "<group>"; };
-		A94A67E722B17BBB00C661C6 /* loop_dependence.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_dependence.cpp; sourceTree = "<group>"; };
-		A94A67E822B17BBB00C661C6 /* unify_const_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unify_const_pass.h; sourceTree = "<group>"; };
-		A94A67E922B17BBB00C661C6 /* ir_loader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_loader.h; sourceTree = "<group>"; };
-		A94A67EA22B17BBB00C661C6 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = "<group>"; };
-		A94A67EB22B17BBB00C661C6 /* fold_spec_constant_op_and_composite_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold_spec_constant_op_and_composite_pass.h; sourceTree = "<group>"; };
-		A94A67EC22B17BBB00C661C6 /* mem_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mem_pass.cpp; sourceTree = "<group>"; };
-		A94A67ED22B17BBB00C661C6 /* basic_block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic_block.h; sourceTree = "<group>"; };
-		A94A67EE22B17BBB00C661C6 /* remove_duplicates_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_duplicates_pass.cpp; sourceTree = "<group>"; };
-		A94A67EF22B17BBB00C661C6 /* dead_variable_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_variable_elimination.cpp; sourceTree = "<group>"; };
-		A94A67F022B17BBB00C661C6 /* block_merge_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_merge_pass.h; sourceTree = "<group>"; };
-		A94A67F122B17BBB00C661C6 /* module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = module.cpp; sourceTree = "<group>"; };
-		A94A67F222B17BBB00C661C6 /* fold_spec_constant_op_and_composite_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fold_spec_constant_op_and_composite_pass.cpp; sourceTree = "<group>"; };
-		A94A67F322B17BBB00C661C6 /* loop_unswitch_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_unswitch_pass.cpp; sourceTree = "<group>"; };
-		A94A67F422B17BBB00C661C6 /* unify_const_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unify_const_pass.cpp; sourceTree = "<group>"; };
-		A94A67F522B17BBB00C661C6 /* type_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = type_manager.cpp; sourceTree = "<group>"; };
-		A94A67F622B17BBB00C661C6 /* generate_webgpu_initializers_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = generate_webgpu_initializers_pass.cpp; sourceTree = "<group>"; };
-		A94A67F722B17BBB00C661C6 /* private_to_local_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = private_to_local_pass.h; sourceTree = "<group>"; };
-		A94A67F822B17BBB00C661C6 /* inline_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_pass.cpp; sourceTree = "<group>"; };
-		A94A67F922B17BBB00C661C6 /* def_use_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = def_use_manager.h; sourceTree = "<group>"; };
-		A94A67FA22B17BBB00C661C6 /* ir_loader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ir_loader.cpp; sourceTree = "<group>"; };
-		A94A67FB22B17BBB00C661C6 /* cfg_cleanup_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfg_cleanup_pass.h; sourceTree = "<group>"; };
-		A94A67FC22B17BBB00C661C6 /* licm_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = licm_pass.cpp; sourceTree = "<group>"; };
-		A94A67FD22B17BBB00C661C6 /* eliminate_dead_functions_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_functions_pass.cpp; sourceTree = "<group>"; };
-		A94A67FE22B17BBB00C661C6 /* local_redundancy_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_redundancy_elimination.h; sourceTree = "<group>"; };
-		A94A67FF22B17BBB00C661C6 /* split_invalid_unreachable_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = split_invalid_unreachable_pass.cpp; sourceTree = "<group>"; };
-		A94A680022B17BBB00C661C6 /* loop_peeling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_peeling.h; sourceTree = "<group>"; };
-		A94A680122B17BBB00C661C6 /* vector_dce.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vector_dce.cpp; sourceTree = "<group>"; };
-		A94A680222B17BBB00C661C6 /* block_merge_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_merge_util.h; sourceTree = "<group>"; };
-		A94A680322B17BBB00C661C6 /* loop_unroller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_unroller.cpp; sourceTree = "<group>"; };
-		A94A680422B17BBB00C661C6 /* constants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = constants.cpp; sourceTree = "<group>"; };
-		A94A680522B17BBB00C661C6 /* loop_fusion_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fusion_pass.h; sourceTree = "<group>"; };
-		A94A680622B17BBB00C661C6 /* struct_cfg_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = struct_cfg_analysis.h; sourceTree = "<group>"; };
-		A94A680722B17BBB00C661C6 /* common_uniform_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = common_uniform_elim_pass.cpp; sourceTree = "<group>"; };
-		A94A680822B17BBB00C661C6 /* def_use_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = def_use_manager.cpp; sourceTree = "<group>"; };
-		A94A680922B17BBB00C661C6 /* strip_reflect_info_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strip_reflect_info_pass.cpp; sourceTree = "<group>"; };
-		A94A680A22B17BBB00C661C6 /* decoration_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoration_manager.h; sourceTree = "<group>"; };
-		A94A680B22B17BBB00C661C6 /* ccp_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ccp_pass.cpp; sourceTree = "<group>"; };
-		A94A680C22B17BBB00C661C6 /* process_lines_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = process_lines_pass.h; sourceTree = "<group>"; };
-		A94A680D22B17BBB00C661C6 /* local_single_block_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_single_block_elim_pass.h; sourceTree = "<group>"; };
-		A94A680E22B17BBB00C661C6 /* pch_source_opt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch_source_opt.cpp; sourceTree = "<group>"; };
-		A94A680F22B17BBB00C661C6 /* strength_reduction_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strength_reduction_pass.h; sourceTree = "<group>"; };
-		A94A681022B17BBB00C661C6 /* aggressive_dead_code_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aggressive_dead_code_elim_pass.cpp; sourceTree = "<group>"; };
-		A94A681122B17BBB00C661C6 /* eliminate_dead_functions_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_functions_util.cpp; sourceTree = "<group>"; };
-		A94A681222B17BBB00C661C6 /* simplification_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simplification_pass.cpp; sourceTree = "<group>"; };
-		A94A681322B17BBB00C661C6 /* dead_branch_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_branch_elim_pass.cpp; sourceTree = "<group>"; };
-		A94A681422B17BBB00C661C6 /* flatten_decoration_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = flatten_decoration_pass.cpp; sourceTree = "<group>"; };
-		A94A681522B17BBB00C661C6 /* dead_insert_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_insert_elim_pass.h; sourceTree = "<group>"; };
-		A94A681622B17BBB00C661C6 /* folding_rules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = folding_rules.cpp; sourceTree = "<group>"; };
-		A94A681722B17BBB00C661C6 /* freeze_spec_constant_value_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = freeze_spec_constant_value_pass.h; sourceTree = "<group>"; };
-		A94A681822B17BBB00C661C6 /* ir_context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ir_context.cpp; sourceTree = "<group>"; };
-		A94A681922B17BBB00C661C6 /* instrument_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instrument_pass.h; sourceTree = "<group>"; };
-		A94A681A22B17BBB00C661C6 /* mem_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_pass.h; sourceTree = "<group>"; };
-		A94A681B22B17BBB00C661C6 /* loop_descriptor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_descriptor.cpp; sourceTree = "<group>"; };
-		A94A681C22B17BBB00C661C6 /* local_ssa_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_ssa_elim_pass.cpp; sourceTree = "<group>"; };
-		A94A681D22B17BBB00C661C6 /* eliminate_dead_members_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_members_pass.h; sourceTree = "<group>"; };
-		A94A681E22B17BBB00C661C6 /* function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cpp; sourceTree = "<group>"; };
-		A94A681F22B17BBB00C661C6 /* instruction_list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction_list.cpp; sourceTree = "<group>"; };
-		A94A682022B17BBB00C661C6 /* composite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = composite.cpp; sourceTree = "<group>"; };
-		A94A682122B17BBB00C661C6 /* process_lines_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = process_lines_pass.cpp; sourceTree = "<group>"; };
-		A94A682222B17BBB00C661C6 /* inline_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_pass.h; sourceTree = "<group>"; };
-		A94A682322B17BBB00C661C6 /* loop_dependence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_dependence.h; sourceTree = "<group>"; };
-		A94A682422B17BBB00C661C6 /* value_number_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = value_number_table.h; sourceTree = "<group>"; };
-		A94A682522B17BBB00C661C6 /* flatten_decoration_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flatten_decoration_pass.h; sourceTree = "<group>"; };
-		A94A682622B17BBB00C661C6 /* if_conversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = if_conversion.cpp; sourceTree = "<group>"; };
-		A94A682722B17BBB00C661C6 /* inline_exhaustive_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_exhaustive_pass.h; sourceTree = "<group>"; };
-		A94A682822B17BBB00C661C6 /* constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constants.h; sourceTree = "<group>"; };
-		A94A682922B17BBB00C661C6 /* eliminate_dead_members_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_members_pass.cpp; sourceTree = "<group>"; };
-		A94A682A22B17BBB00C661C6 /* strength_reduction_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strength_reduction_pass.cpp; sourceTree = "<group>"; };
-		A94A682B22B17BBB00C661C6 /* block_merge_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_merge_util.cpp; sourceTree = "<group>"; };
-		A94A682C22B17BBB00C661C6 /* upgrade_memory_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upgrade_memory_model.h; sourceTree = "<group>"; };
-		A94A682D22B17BBB00C661C6 /* copy_prop_arrays.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = copy_prop_arrays.cpp; sourceTree = "<group>"; };
-		A94A682E22B17BBB00C661C6 /* pass_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pass_manager.cpp; sourceTree = "<group>"; };
-		A94A682F22B17BBB00C661C6 /* inline_exhaustive_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_exhaustive_pass.cpp; sourceTree = "<group>"; };
-		A94A683022B17BBB00C661C6 /* loop_fission.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fission.h; sourceTree = "<group>"; };
-		A94A683122B17BBB00C661C6 /* workaround1209.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = workaround1209.h; sourceTree = "<group>"; };
-		A94A683222B17BBB00C661C6 /* loop_fusion_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fusion_pass.cpp; sourceTree = "<group>"; };
-		A94A683322B17BBB00C661C6 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
-		A94A683422B17BBB00C661C6 /* split_invalid_unreachable_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = split_invalid_unreachable_pass.h; sourceTree = "<group>"; };
-		A94A683522B17BBB00C661C6 /* copy_prop_arrays.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = copy_prop_arrays.h; sourceTree = "<group>"; };
-		A94A683622B17BBB00C661C6 /* eliminate_dead_constant_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_constant_pass.h; sourceTree = "<group>"; };
-		A94A683722B17BBB00C661C6 /* dead_insert_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_insert_elim_pass.cpp; sourceTree = "<group>"; };
-		A94A683822B17BBB00C661C6 /* ssa_rewrite_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssa_rewrite_pass.h; sourceTree = "<group>"; };
-		A94A683922B17BBB00C661C6 /* scalar_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_analysis.cpp; sourceTree = "<group>"; };
-		A94A683A22B17BBB00C661C6 /* dead_variable_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_variable_elimination.h; sourceTree = "<group>"; };
-		A94A683B22B17BBB00C661C6 /* block_merge_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_merge_pass.cpp; sourceTree = "<group>"; };
-		A94A683C22B17BBB00C661C6 /* dominator_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dominator_analysis.h; sourceTree = "<group>"; };
-		A94A683D22B17BBB00C661C6 /* pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pass.h; sourceTree = "<group>"; };
-		A94A683E22B17BBB00C661C6 /* folding_rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = folding_rules.h; sourceTree = "<group>"; };
-		A94A683F22B17BBB00C661C6 /* eliminate_dead_functions_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_functions_pass.h; sourceTree = "<group>"; };
-		A94A684022B17BBB00C661C6 /* common_uniform_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_uniform_elim_pass.h; sourceTree = "<group>"; };
-		A94A684122B17BBB00C661C6 /* eliminate_dead_functions_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_functions_util.h; sourceTree = "<group>"; };
-		A94A684222B17BBB00C661C6 /* fold.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold.h; sourceTree = "<group>"; };
-		A94A684322B17BBB00C661C6 /* local_single_store_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_single_store_elim_pass.cpp; sourceTree = "<group>"; };
-		A94A684422B17BBB00C661C6 /* dead_branch_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_branch_elim_pass.h; sourceTree = "<group>"; };
-		A94A684522B17BBB00C661C6 /* private_to_local_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = private_to_local_pass.cpp; sourceTree = "<group>"; };
-		A94A684622B17BBB00C661C6 /* scalar_analysis_nodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_analysis_nodes.h; sourceTree = "<group>"; };
-		A94A684722B17BBB00C661C6 /* propagator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = propagator.cpp; sourceTree = "<group>"; };
-		A94A684822B17BBB00C661C6 /* fix_storage_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fix_storage_class.h; sourceTree = "<group>"; };
-		A94A684922B17BBB00C661C6 /* loop_dependence_helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_dependence_helpers.cpp; sourceTree = "<group>"; };
-		A94A684A22B17BBB00C661C6 /* set_spec_constant_default_value_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = set_spec_constant_default_value_pass.cpp; sourceTree = "<group>"; };
-		A94A684B22B17BBB00C661C6 /* passes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = passes.h; sourceTree = "<group>"; };
-		A94A684C22B17BBB00C661C6 /* fold.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fold.cpp; sourceTree = "<group>"; };
-		A94A684D22B17BBB00C661C6 /* strip_reflect_info_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_reflect_info_pass.h; sourceTree = "<group>"; };
-		A94A684E22B17BBB00C661C6 /* scalar_replacement_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_replacement_pass.cpp; sourceTree = "<group>"; };
-		A94A684F22B17BBB00C661C6 /* simplification_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simplification_pass.h; sourceTree = "<group>"; };
-		A94A685022B17BBB00C661C6 /* remove_duplicates_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_duplicates_pass.h; sourceTree = "<group>"; };
-		A94A685122B17BBB00C661C6 /* redundancy_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = redundancy_elimination.cpp; sourceTree = "<group>"; };
-		A94A685222B17BBB00C661C6 /* reflect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reflect.h; sourceTree = "<group>"; };
-		A94A685322B17BBB00C661C6 /* workaround1209.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = workaround1209.cpp; sourceTree = "<group>"; };
-		A94A685422B17BBB00C661C6 /* null_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = null_pass.h; sourceTree = "<group>"; };
-		A94A685522B17BBB00C661C6 /* const_folding_rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = const_folding_rules.h; sourceTree = "<group>"; };
-		A94A685622B17BBB00C661C6 /* scalar_replacement_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_replacement_pass.h; sourceTree = "<group>"; };
-		A94A685722B17BBB00C661C6 /* instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction.cpp; sourceTree = "<group>"; };
-		A94A685822B17BBB00C661C6 /* pch_source_opt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch_source_opt.h; sourceTree = "<group>"; };
-		A94A685922B17BBB00C661C6 /* reduce_load_size.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduce_load_size.cpp; sourceTree = "<group>"; };
-		A94A685A22B17BBB00C661C6 /* redundancy_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = redundancy_elimination.h; sourceTree = "<group>"; };
-		A94A685B22B17BBB00C661C6 /* fix_storage_class.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fix_storage_class.cpp; sourceTree = "<group>"; };
-		A94A685C22B17BBB00C661C6 /* value_number_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = value_number_table.cpp; sourceTree = "<group>"; };
-		A94A685D22B17BBB00C661C6 /* local_ssa_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_ssa_elim_pass.h; sourceTree = "<group>"; };
-		A94A685E22B17BBB00C661C6 /* inline_opaque_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_opaque_pass.cpp; sourceTree = "<group>"; };
-		A94A685F22B17BBB00C661C6 /* replace_invalid_opc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = replace_invalid_opc.cpp; sourceTree = "<group>"; };
-		A94A686022B17BBB00C661C6 /* loop_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_utils.h; sourceTree = "<group>"; };
-		A94A686122B17BBB00C661C6 /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = "<group>"; };
-		A94A686222B17BBB00C661C6 /* dominator_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dominator_analysis.cpp; sourceTree = "<group>"; };
-		A94A686322B17BBB00C661C6 /* decompose_initialized_variables_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decompose_initialized_variables_pass.cpp; sourceTree = "<group>"; };
-		A94A686422B17BBB00C661C6 /* ir_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_builder.h; sourceTree = "<group>"; };
-		A94A686522B17BBB00C661C6 /* loop_unswitch_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_unswitch_pass.h; sourceTree = "<group>"; };
-		A94A686622B17BBB00C661C6 /* cfg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfg.h; sourceTree = "<group>"; };
-		A94A686722B17BBB00C661C6 /* code_sink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = code_sink.h; sourceTree = "<group>"; };
-		A94A686822B17BBB00C661C6 /* loop_descriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_descriptor.h; sourceTree = "<group>"; };
-		A94A686922B17BBB00C661C6 /* generate_webgpu_initializers_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generate_webgpu_initializers_pass.h; sourceTree = "<group>"; };
-		A94A686A22B17BBB00C661C6 /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
-		A94A686B22B17BBB00C661C6 /* aggressive_dead_code_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aggressive_dead_code_elim_pass.h; sourceTree = "<group>"; };
-		A94A686C22B17BBB00C661C6 /* struct_cfg_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = struct_cfg_analysis.cpp; sourceTree = "<group>"; };
-		A94A686D22B17BBB00C661C6 /* vector_dce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_dce.h; sourceTree = "<group>"; };
-		A94A686E22B17BBB00C661C6 /* combine_access_chains.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = combine_access_chains.h; sourceTree = "<group>"; };
-		A94A686F22B17BBB00C661C6 /* pass_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pass_manager.h; sourceTree = "<group>"; };
-		A94A687022B17BBB00C661C6 /* local_access_chain_convert_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_access_chain_convert_pass.cpp; sourceTree = "<group>"; };
-		A94A687122B17BBB00C661C6 /* basic_block.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = basic_block.cpp; sourceTree = "<group>"; };
-		A94A687222B17BBB00C661C6 /* iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator.h; sourceTree = "<group>"; };
-		A94A687322B17BBB00C661C6 /* licm_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = licm_pass.h; sourceTree = "<group>"; };
-		A94A687422B17BBB00C661C6 /* build_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build_module.h; sourceTree = "<group>"; };
-		A94A687522B17BBB00C661C6 /* ccp_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ccp_pass.h; sourceTree = "<group>"; };
-		A94A687622B17BBB00C661C6 /* decompose_initialized_variables_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decompose_initialized_variables_pass.h; sourceTree = "<group>"; };
-		A94A687722B17BBB00C661C6 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = "<group>"; };
-		A94A687822B17BBB00C661C6 /* loop_fusion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fusion.cpp; sourceTree = "<group>"; };
-		A94A687922B17BBB00C661C6 /* upgrade_memory_model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = upgrade_memory_model.cpp; sourceTree = "<group>"; };
-		A94A687A22B17BBB00C661C6 /* feature_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = feature_manager.h; sourceTree = "<group>"; };
-		A94A687B22B17BBB00C661C6 /* inst_bindless_check_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inst_bindless_check_pass.h; sourceTree = "<group>"; };
-		A94A687C22B17BBB00C661C6 /* scalar_analysis_simplification.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_analysis_simplification.cpp; sourceTree = "<group>"; };
-		A94A687D22B17BBB00C661C6 /* set_spec_constant_default_value_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = set_spec_constant_default_value_pass.h; sourceTree = "<group>"; };
-		A94A687E22B17BBB00C661C6 /* dominator_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dominator_tree.h; sourceTree = "<group>"; };
-		A94A687F22B17BBB00C661C6 /* legalize_vector_shuffle_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = legalize_vector_shuffle_pass.cpp; sourceTree = "<group>"; };
-		A94A688022B17BBB00C661C6 /* type_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_manager.h; sourceTree = "<group>"; };
-		A94A688122B17BBB00C661C6 /* compact_ids_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compact_ids_pass.cpp; sourceTree = "<group>"; };
-		A94A688222B17BBB00C661C6 /* loop_peeling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_peeling.cpp; sourceTree = "<group>"; };
-		A94A688322B17BBB00C661C6 /* table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = table.h; sourceTree = "<group>"; };
-		A94A68AF22B17BBB00C661C6 /* ext_inst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ext_inst.h; sourceTree = "<group>"; };
-		A94A68B022B17BBB00C661C6 /* diagnostic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = diagnostic.cpp; sourceTree = "<group>"; };
-		A94A68B122B17BBB00C661C6 /* latest_version_spirv_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_spirv_header.h; sourceTree = "<group>"; };
-		A94A68B222B17BBB00C661C6 /* libspirv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libspirv.cpp; sourceTree = "<group>"; };
-		A94A68B322B17BBB00C661C6 /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
-		A94A68B422B17BBB00C661C6 /* spirv_optimizer_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_optimizer_options.h; sourceTree = "<group>"; };
-		A94A68B522B17BBB00C661C6 /* opcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opcode.h; sourceTree = "<group>"; };
-		A94A68B622B17BBB00C661C6 /* operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand.cpp; sourceTree = "<group>"; };
-		A94A68B722B17BBB00C661C6 /* latest_version_glsl_std_450_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_glsl_std_450_header.h; sourceTree = "<group>"; };
-		A94A68B822B17BBB00C661C6 /* extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = extensions.h; sourceTree = "<group>"; };
-		A94A68B922B17BBB00C661C6 /* disassemble.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassemble.cpp; sourceTree = "<group>"; };
-		A94A68BA22B17BBB00C661C6 /* binary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binary.h; sourceTree = "<group>"; };
-		A94A68BB22B17BBB00C661C6 /* text_handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text_handler.cpp; sourceTree = "<group>"; };
-		A94A68BD22B17BBB00C661C6 /* validate_annotation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_annotation.cpp; sourceTree = "<group>"; };
-		A94A68BE22B17BBB00C661C6 /* validate_misc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_misc.cpp; sourceTree = "<group>"; };
-		A94A68BF22B17BBB00C661C6 /* validate_cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_cfg.cpp; sourceTree = "<group>"; };
-		A94A68C022B17BBB00C661C6 /* validate_capability.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_capability.cpp; sourceTree = "<group>"; };
-		A94A68C122B17BBB00C661C6 /* construct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = construct.h; sourceTree = "<group>"; };
-		A94A68C222B17BBB00C661C6 /* validate_barriers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_barriers.cpp; sourceTree = "<group>"; };
-		A94A68C322B17BBB00C661C6 /* validate_non_uniform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_non_uniform.cpp; sourceTree = "<group>"; };
-		A94A68C422B17BBB00C661C6 /* validate_scopes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_scopes.cpp; sourceTree = "<group>"; };
-		A94A68C522B17BBB00C661C6 /* validate_atomics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_atomics.cpp; sourceTree = "<group>"; };
-		A94A68C622B17BBB00C661C6 /* basic_block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic_block.h; sourceTree = "<group>"; };
-		A94A68C722B17BBB00C661C6 /* validate_instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_instruction.cpp; sourceTree = "<group>"; };
-		A94A68C822B17BBB00C661C6 /* validate_decorations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_decorations.cpp; sourceTree = "<group>"; };
-		A94A68C922B17BBB00C661C6 /* validate_debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_debug.cpp; sourceTree = "<group>"; };
-		A94A68CA22B17BBB00C661C6 /* validate_builtins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_builtins.cpp; sourceTree = "<group>"; };
-		A94A68CB22B17BBB00C661C6 /* validate_interfaces.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_interfaces.cpp; sourceTree = "<group>"; };
-		A94A68CC22B17BBB00C661C6 /* validate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate.cpp; sourceTree = "<group>"; };
-		A94A68CD22B17BBB00C661C6 /* validation_state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validation_state.h; sourceTree = "<group>"; };
-		A94A68CE22B17BBB00C661C6 /* validate_constants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_constants.cpp; sourceTree = "<group>"; };
-		A94A68CF22B17BBB00C661C6 /* validate_bitwise.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_bitwise.cpp; sourceTree = "<group>"; };
-		A94A68D022B17BBB00C661C6 /* validate_extensions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_extensions.cpp; sourceTree = "<group>"; };
-		A94A68D122B17BBB00C661C6 /* construct.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = construct.cpp; sourceTree = "<group>"; };
-		A94A68D222B17BBB00C661C6 /* function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cpp; sourceTree = "<group>"; };
-		A94A68D322B17BBB00C661C6 /* validate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validate.h; sourceTree = "<group>"; };
-		A94A68D422B17BBB00C661C6 /* validate_adjacency.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_adjacency.cpp; sourceTree = "<group>"; };
-		A94A68D522B17BBB00C661C6 /* validate_conversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_conversion.cpp; sourceTree = "<group>"; };
-		A94A68D622B17BBB00C661C6 /* validate_datarules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_datarules.cpp; sourceTree = "<group>"; };
-		A94A68D722B17BBB00C661C6 /* validate_scopes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validate_scopes.h; sourceTree = "<group>"; };
-		A94A68D822B17BBB00C661C6 /* validate_id.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_id.cpp; sourceTree = "<group>"; };
-		A94A68D922B17BBB00C661C6 /* validate_memory_semantics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validate_memory_semantics.h; sourceTree = "<group>"; };
-		A94A68DA22B17BBB00C661C6 /* validate_arithmetics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_arithmetics.cpp; sourceTree = "<group>"; };
-		A94A68DB22B17BBB00C661C6 /* validate_mode_setting.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_mode_setting.cpp; sourceTree = "<group>"; };
-		A94A68DC22B17BBB00C661C6 /* validate_memory_semantics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_memory_semantics.cpp; sourceTree = "<group>"; };
-		A94A68DD22B17BBB00C661C6 /* validate_logicals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_logicals.cpp; sourceTree = "<group>"; };
-		A94A68DE22B17BBB00C661C6 /* validate_derivatives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_derivatives.cpp; sourceTree = "<group>"; };
-		A94A68DF22B17BBB00C661C6 /* validate_memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_memory.cpp; sourceTree = "<group>"; };
-		A94A68E022B17BBB00C661C6 /* validate_image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_image.cpp; sourceTree = "<group>"; };
-		A94A68E122B17BBB00C661C6 /* validate_literals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_literals.cpp; sourceTree = "<group>"; };
-		A94A68E222B17BBB00C661C6 /* instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction.cpp; sourceTree = "<group>"; };
-		A94A68E322B17BBB00C661C6 /* validate_type.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_type.cpp; sourceTree = "<group>"; };
-		A94A68E422B17BBB00C661C6 /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
-		A94A68E522B17BBB00C661C6 /* validate_execution_limitations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_execution_limitations.cpp; sourceTree = "<group>"; };
-		A94A68E622B17BBB00C661C6 /* validate_layout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_layout.cpp; sourceTree = "<group>"; };
-		A94A68E722B17BBB00C661C6 /* basic_block.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = basic_block.cpp; sourceTree = "<group>"; };
-		A94A68E822B17BBB00C661C6 /* validate_function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_function.cpp; sourceTree = "<group>"; };
-		A94A68E922B17BBB00C661C6 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = "<group>"; };
-		A94A68EA22B17BBB00C661C6 /* validate_composites.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_composites.cpp; sourceTree = "<group>"; };
-		A94A68EB22B17BBB00C661C6 /* validation_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validation_state.cpp; sourceTree = "<group>"; };
-		A94A68EC22B17BBB00C661C6 /* validate_primitives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_primitives.cpp; sourceTree = "<group>"; };
-		A94A68ED22B17BBB00C661C6 /* decoration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoration.h; sourceTree = "<group>"; };
 		A9679AAC21D269D900856BF7 /* package_ext_libs_macos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ext_libs_macos.sh; sourceTree = "<group>"; };
 		A9679AAD21D269D900856BF7 /* package_ext_libs_ios.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ext_libs_ios.sh; sourceTree = "<group>"; };
 		A9679AAE21D269D900856BF7 /* package_ext_libs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ext_libs.sh; sourceTree = "<group>"; };
@@ -1581,6 +1195,389 @@
 		A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cross_parsed_ir.cpp; sourceTree = "<group>"; };
 		A9C2104521D14FD7006BA2D3 /* fetchDependencies */ = {isa = PBXFileReference; lastKnownFileType = text; path = fetchDependencies; sourceTree = "<group>"; };
 		A9C2104721D15843006BA2D3 /* ExternalRevisions */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ExternalRevisions; sourceTree = "<group>"; };
+		A9C2EF7822E7833C001763CE /* spirv_target_env.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_target_env.cpp; sourceTree = "<group>"; };
+		A9C2EF7922E7833C001763CE /* extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json"; sourceTree = "<group>"; };
+		A9C2EF7A22E7833C001763CE /* spirv_fuzzer_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_fuzzer_options.h; sourceTree = "<group>"; };
+		A9C2EF7B22E7833C001763CE /* assembly_grammar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembly_grammar.h; sourceTree = "<group>"; };
+		A9C2EF7C22E7833C001763CE /* enum_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum_set.h; sourceTree = "<group>"; };
+		A9C2EF7D22E7833C001763CE /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A9C2EF7E22E7833C001763CE /* extinst.spv-amd-shader-ballot.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-ballot.grammar.json"; sourceTree = "<group>"; };
+		A9C2EF7F22E7833C001763CE /* text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text.cpp; sourceTree = "<group>"; };
+		A9C2EF8022E7833C001763CE /* assembly_grammar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembly_grammar.cpp; sourceTree = "<group>"; };
+		A9C2EF8122E7833C001763CE /* text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text.h; sourceTree = "<group>"; };
+		A9C2EF8222E7833C001763CE /* extensions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = extensions.cpp; sourceTree = "<group>"; };
+		A9C2EF8322E7833C001763CE /* pch_source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch_source.cpp; sourceTree = "<group>"; };
+		A9C2EF8522E7833C001763CE /* parse_number.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse_number.h; sourceTree = "<group>"; };
+		A9C2EF8622E7833C001763CE /* ilist_node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ilist_node.h; sourceTree = "<group>"; };
+		A9C2EF8722E7833C001763CE /* make_unique.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = make_unique.h; sourceTree = "<group>"; };
+		A9C2EF8822E7833C001763CE /* string_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_utils.h; sourceTree = "<group>"; };
+		A9C2EF8922E7833C001763CE /* small_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = small_vector.h; sourceTree = "<group>"; };
+		A9C2EF8A22E7833C001763CE /* timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timer.cpp; sourceTree = "<group>"; };
+		A9C2EF8B22E7833C001763CE /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timer.h; sourceTree = "<group>"; };
+		A9C2EF8C22E7833C001763CE /* string_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_utils.cpp; sourceTree = "<group>"; };
+		A9C2EF8D22E7833C001763CE /* bit_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_vector.h; sourceTree = "<group>"; };
+		A9C2EF8E22E7833C001763CE /* bitutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitutils.h; sourceTree = "<group>"; };
+		A9C2EF8F22E7833C001763CE /* hex_float.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hex_float.h; sourceTree = "<group>"; };
+		A9C2EF9022E7833C001763CE /* parse_number.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parse_number.cpp; sourceTree = "<group>"; };
+		A9C2EF9122E7833C001763CE /* bit_vector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bit_vector.cpp; sourceTree = "<group>"; };
+		A9C2EF9222E7833C001763CE /* ilist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ilist.h; sourceTree = "<group>"; };
+		A9C2EF9322E7833C001763CE /* spirv_target_env.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_target_env.h; sourceTree = "<group>"; };
+		A9C2EF9422E7833C001763CE /* table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = table.cpp; sourceTree = "<group>"; };
+		A9C2EF9622E7833C001763CE /* operand_to_undef_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand_to_undef_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EF9722E7833C001763CE /* remove_selection_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_selection_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EF9822E7833C001763CE /* remove_block_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_block_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EF9922E7833C001763CE /* operand_to_dominating_id_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand_to_dominating_id_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EF9A22E7833C001763CE /* reduction_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduction_pass.cpp; sourceTree = "<group>"; };
+		A9C2EF9B22E7833C001763CE /* operand_to_const_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand_to_const_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EF9C22E7833C001763CE /* operand_to_const_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand_to_const_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EF9D22E7833C001763CE /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A9C2EF9E22E7833C001763CE /* reduction_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduction_util.cpp; sourceTree = "<group>"; };
+		A9C2EF9F22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = structured_loop_to_selection_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFA022E7833C001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simple_conditional_branch_to_branch_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFA122E7833C001763CE /* remove_function_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_function_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFA222E7833C001763CE /* remove_instruction_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_instruction_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFA322E7833C001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conditional_branch_to_simple_conditional_branch_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFA422E7833C001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simple_conditional_branch_to_branch_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFA522E7833C001763CE /* remove_function_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_function_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFA622E7833C001763CE /* remove_opname_instruction_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_opname_instruction_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFA722E7833C001763CE /* simple_conditional_branch_to_branch_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simple_conditional_branch_to_branch_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFA822E7833C001763CE /* remove_selection_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_selection_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFA922E7833C001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFAA22E7833C001763CE /* simple_conditional_branch_to_branch_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simple_conditional_branch_to_branch_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFAB22E7833C001763CE /* merge_blocks_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = merge_blocks_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFAC22E7833C001763CE /* change_operand_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = change_operand_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFAD22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = structured_loop_to_selection_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFAE22E7833C001763CE /* remove_function_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_function_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFAF22E7833C001763CE /* change_operand_to_undef_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = change_operand_to_undef_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFB022E7833C001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_unreferenced_instruction_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFB122E7833C001763CE /* structured_loop_to_selection_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = structured_loop_to_selection_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFB222E7833C001763CE /* remove_selection_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_selection_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFB322E7833C001763CE /* remove_instruction_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_instruction_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFB422E7833C001763CE /* remove_selection_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_selection_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFB522E7833C001763CE /* merge_blocks_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge_blocks_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFB622E7833C001763CE /* remove_opname_instruction_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_opname_instruction_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFB722E7833C001763CE /* pch_source_reduce.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch_source_reduce.cpp; sourceTree = "<group>"; };
+		A9C2EFB822E7833C001763CE /* reducer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reducer.cpp; sourceTree = "<group>"; };
+		A9C2EFB922E7833C001763CE /* operand_to_undef_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand_to_undef_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFBA22E7833C001763CE /* remove_function_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_function_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFBB22E7833C001763CE /* pch_source_reduce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch_source_reduce.h; sourceTree = "<group>"; };
+		A9C2EFBC22E7833C001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_unreferenced_instruction_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFBD22E7833C001763CE /* merge_blocks_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = merge_blocks_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFBE22E7833C001763CE /* reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFBF22E7833C001763CE /* reducer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reducer.h; sourceTree = "<group>"; };
+		A9C2EFC022E7833C001763CE /* change_operand_to_undef_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = change_operand_to_undef_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFC122E7833C001763CE /* reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFC222E7833C001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conditional_branch_to_simple_conditional_branch_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFC322E7833C001763CE /* operand_to_dominating_id_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand_to_dominating_id_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFC422E7833C001763CE /* reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFC522E7833C001763CE /* change_operand_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = change_operand_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFC622E7833C001763CE /* remove_block_reduction_opportunity_finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_block_reduction_opportunity_finder.h; sourceTree = "<group>"; };
+		A9C2EFC722E7833C001763CE /* remove_block_reduction_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_block_reduction_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFC822E7833C001763CE /* reduction_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_util.h; sourceTree = "<group>"; };
+		A9C2EFC922E7833C001763CE /* merge_blocks_reduction_opportunity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge_blocks_reduction_opportunity.h; sourceTree = "<group>"; };
+		A9C2EFCA22E7833C001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp; sourceTree = "<group>"; };
+		A9C2EFCB22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = structured_loop_to_selection_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFCC22E7833C001763CE /* remove_block_reduction_opportunity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_block_reduction_opportunity.cpp; sourceTree = "<group>"; };
+		A9C2EFCD22E7833C001763CE /* reduction_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_pass.h; sourceTree = "<group>"; };
+		A9C2EFCE22E7833C001763CE /* latest_version_opencl_std_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_opencl_std_header.h; sourceTree = "<group>"; };
+		A9C2EFCF22E7833C001763CE /* spirv_optimizer_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_optimizer_options.cpp; sourceTree = "<group>"; };
+		A9C2EFD022E7833C001763CE /* cfa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfa.h; sourceTree = "<group>"; };
+		A9C2EFD122E7833C001763CE /* pch_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch_source.h; sourceTree = "<group>"; };
+		A9C2EFD222E7833C001763CE /* enum_string_mapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum_string_mapping.h; sourceTree = "<group>"; };
+		A9C2EFD322E7833C001763CE /* spirv_fuzzer_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_fuzzer_options.cpp; sourceTree = "<group>"; };
+		A9C2EFD422E7833C001763CE /* spirv_reducer_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_reducer_options.h; sourceTree = "<group>"; };
+		A9C2EFD522E7833C001763CE /* spirv_validator_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_validator_options.cpp; sourceTree = "<group>"; };
+		A9C2EFD622E7833C001763CE /* extinst.spv-amd-shader-trinary-minmax.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-trinary-minmax.grammar.json"; sourceTree = "<group>"; };
+		A9C2EFD722E7833C001763CE /* print.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = print.cpp; sourceTree = "<group>"; };
+		A9C2EFD822E7833C001763CE /* spirv_definition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_definition.h; sourceTree = "<group>"; };
+		A9C2EFD922E7833C001763CE /* operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand.h; sourceTree = "<group>"; };
+		A9C2EFDA22E7833C001763CE /* spirv_endian.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_endian.cpp; sourceTree = "<group>"; };
+		A9C2EFDB22E7833C001763CE /* macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macro.h; sourceTree = "<group>"; };
+		A9C2EFDC22E7833C001763CE /* spirv_constant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_constant.h; sourceTree = "<group>"; };
+		A9C2EFDD22E7833C001763CE /* extinst.spv-amd-gcn-shader.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-gcn-shader.grammar.json"; sourceTree = "<group>"; };
+		A9C2EFDE22E7833C001763CE /* binary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binary.cpp; sourceTree = "<group>"; };
+		A9C2EFDF22E7833C001763CE /* spirv_validator_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_validator_options.h; sourceTree = "<group>"; };
+		A9C2EFE022E7833C001763CE /* enum_string_mapping.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = enum_string_mapping.cpp; sourceTree = "<group>"; };
+		A9C2EFE122E7833C001763CE /* text_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text_handler.h; sourceTree = "<group>"; };
+		A9C2EFE222E7833C001763CE /* parsed_operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parsed_operand.h; sourceTree = "<group>"; };
+		A9C2EFE322E7833C001763CE /* name_mapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = name_mapper.h; sourceTree = "<group>"; };
+		A9C2EFE422E7833C001763CE /* spirv_reducer_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_reducer_options.cpp; sourceTree = "<group>"; };
+		A9C2EFE522E7833C001763CE /* parsed_operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parsed_operand.cpp; sourceTree = "<group>"; };
+		A9C2EFE622E7833C001763CE /* diagnostic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = diagnostic.h; sourceTree = "<group>"; };
+		A9C2EFE722E7833C001763CE /* spirv_endian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_endian.h; sourceTree = "<group>"; };
+		A9C2EFE822E7833C001763CE /* name_mapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = name_mapper.cpp; sourceTree = "<group>"; };
+		A9C2EFE922E7833C001763CE /* extinst.debuginfo.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = extinst.debuginfo.grammar.json; sourceTree = "<group>"; };
+		A9C2EFEB22E7833C001763CE /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A9C2EFEC22E7833C001763CE /* linker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linker.cpp; sourceTree = "<group>"; };
+		A9C2EFED22E7833C001763CE /* software_version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = software_version.cpp; sourceTree = "<group>"; };
+		A9C2EFEE22E7833C001763CE /* opcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode.cpp; sourceTree = "<group>"; };
+		A9C2EFEF22E7833C001763CE /* print.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = print.h; sourceTree = "<group>"; };
+		A9C2EFF022E7833C001763CE /* ext_inst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ext_inst.cpp; sourceTree = "<group>"; };
+		A9C2EFF122E7833C001763CE /* disassemble.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disassemble.h; sourceTree = "<group>"; };
+		A9C2EFF322E7833C001763CE /* optimizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = optimizer.cpp; sourceTree = "<group>"; };
+		A9C2EFF422E7833C001763CE /* if_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = if_conversion.h; sourceTree = "<group>"; };
+		A9C2EFF522E7833C001763CE /* register_pressure.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = register_pressure.cpp; sourceTree = "<group>"; };
+		A9C2EFF622E7833C001763CE /* loop_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_utils.cpp; sourceTree = "<group>"; };
+		A9C2EFF722E7833C001763CE /* merge_return_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge_return_pass.h; sourceTree = "<group>"; };
+		A9C2EFF822E7833C001763CE /* inline_opaque_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_opaque_pass.h; sourceTree = "<group>"; };
+		A9C2EFF922E7833C001763CE /* loop_fusion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fusion.h; sourceTree = "<group>"; };
+		A9C2EFFA22E7833C001763CE /* combine_access_chains.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = combine_access_chains.cpp; sourceTree = "<group>"; };
+		A9C2EFFB22E7833C001763CE /* build_module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = build_module.cpp; sourceTree = "<group>"; };
+		A9C2EFFC22E7833C001763CE /* composite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = composite.h; sourceTree = "<group>"; };
+		A9C2EFFD22E7833C001763CE /* compact_ids_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compact_ids_pass.h; sourceTree = "<group>"; };
+		A9C2EFFE22E7833C001763CE /* register_pressure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = register_pressure.h; sourceTree = "<group>"; };
+		A9C2EFFF22E7833C001763CE /* tree_iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tree_iterator.h; sourceTree = "<group>"; };
+		A9C2F00022E7833C001763CE /* strip_atomic_counter_memory_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_atomic_counter_memory_pass.h; sourceTree = "<group>"; };
+		A9C2F00122E7833C001763CE /* legalize_vector_shuffle_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = legalize_vector_shuffle_pass.h; sourceTree = "<group>"; };
+		A9C2F00222E7833C001763CE /* local_single_store_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_single_store_elim_pass.h; sourceTree = "<group>"; };
+		A9C2F00322E7833C001763CE /* reduce_load_size.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduce_load_size.h; sourceTree = "<group>"; };
+		A9C2F00422E7833C001763CE /* code_sink.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = code_sink.cpp; sourceTree = "<group>"; };
+		A9C2F00522E7833C001763CE /* types.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = types.cpp; sourceTree = "<group>"; };
+		A9C2F00622E7833C001763CE /* scalar_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_analysis.h; sourceTree = "<group>"; };
+		A9C2F00722E7833C001763CE /* strip_debug_info_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_debug_info_pass.h; sourceTree = "<group>"; };
+		A9C2F00822E7833C001763CE /* cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cfg.cpp; sourceTree = "<group>"; };
+		A9C2F00922E7833C001763CE /* strip_atomic_counter_memory_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strip_atomic_counter_memory_pass.cpp; sourceTree = "<group>"; };
+		A9C2F00A22E7833C001763CE /* decoration_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decoration_manager.cpp; sourceTree = "<group>"; };
+		A9C2F00B22E7833C001763CE /* local_single_block_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_single_block_elim_pass.cpp; sourceTree = "<group>"; };
+		A9C2F00C22E7833C001763CE /* freeze_spec_constant_value_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = freeze_spec_constant_value_pass.cpp; sourceTree = "<group>"; };
+		A9C2F00D22E7833C001763CE /* replace_invalid_opc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = replace_invalid_opc.h; sourceTree = "<group>"; };
+		A9C2F00E22E7833C001763CE /* local_access_chain_convert_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_access_chain_convert_pass.h; sourceTree = "<group>"; };
+		A9C2F00F22E7833C001763CE /* inst_bindless_check_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inst_bindless_check_pass.cpp; sourceTree = "<group>"; };
+		A9C2F01022E7833C001763CE /* local_redundancy_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_redundancy_elimination.cpp; sourceTree = "<group>"; };
+		A9C2F01122E7833C001763CE /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A9C2F01222E7833C001763CE /* instrument_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instrument_pass.cpp; sourceTree = "<group>"; };
+		A9C2F01322E7833C001763CE /* propagator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = propagator.h; sourceTree = "<group>"; };
+		A9C2F01422E7833C001763CE /* instruction_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction_list.h; sourceTree = "<group>"; };
+		A9C2F01522E7833C001763CE /* feature_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = feature_manager.cpp; sourceTree = "<group>"; };
+		A9C2F01622E7833C001763CE /* pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pass.cpp; sourceTree = "<group>"; };
+		A9C2F01722E7833C001763CE /* loop_fission.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fission.cpp; sourceTree = "<group>"; };
+		A9C2F01822E7833C001763CE /* dominator_tree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dominator_tree.cpp; sourceTree = "<group>"; };
+		A9C2F01922E7833C001763CE /* merge_return_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = merge_return_pass.cpp; sourceTree = "<group>"; };
+		A9C2F01A22E7833C001763CE /* ir_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_context.h; sourceTree = "<group>"; };
+		A9C2F01B22E7833C001763CE /* eliminate_dead_constant_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_constant_pass.cpp; sourceTree = "<group>"; };
+		A9C2F01C22E7833C001763CE /* cfg_cleanup_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cfg_cleanup_pass.cpp; sourceTree = "<group>"; };
+		A9C2F01D22E7833C001763CE /* const_folding_rules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = const_folding_rules.cpp; sourceTree = "<group>"; };
+		A9C2F01E22E7833C001763CE /* loop_unroller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_unroller.h; sourceTree = "<group>"; };
+		A9C2F01F22E7833C001763CE /* strip_debug_info_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strip_debug_info_pass.cpp; sourceTree = "<group>"; };
+		A9C2F02022E7833C001763CE /* ssa_rewrite_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ssa_rewrite_pass.cpp; sourceTree = "<group>"; };
+		A9C2F02122E7833C001763CE /* loop_dependence.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_dependence.cpp; sourceTree = "<group>"; };
+		A9C2F02222E7833C001763CE /* unify_const_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unify_const_pass.h; sourceTree = "<group>"; };
+		A9C2F02322E7833C001763CE /* ir_loader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_loader.h; sourceTree = "<group>"; };
+		A9C2F02422E7833C001763CE /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = "<group>"; };
+		A9C2F02522E7833C001763CE /* fold_spec_constant_op_and_composite_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold_spec_constant_op_and_composite_pass.h; sourceTree = "<group>"; };
+		A9C2F02622E7833C001763CE /* mem_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mem_pass.cpp; sourceTree = "<group>"; };
+		A9C2F02722E7833C001763CE /* basic_block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic_block.h; sourceTree = "<group>"; };
+		A9C2F02822E7833C001763CE /* remove_duplicates_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_duplicates_pass.cpp; sourceTree = "<group>"; };
+		A9C2F02922E7833C001763CE /* dead_variable_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_variable_elimination.cpp; sourceTree = "<group>"; };
+		A9C2F02A22E7833C001763CE /* block_merge_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_merge_pass.h; sourceTree = "<group>"; };
+		A9C2F02B22E7833C001763CE /* module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = module.cpp; sourceTree = "<group>"; };
+		A9C2F02C22E7833C001763CE /* fold_spec_constant_op_and_composite_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fold_spec_constant_op_and_composite_pass.cpp; sourceTree = "<group>"; };
+		A9C2F02D22E7833C001763CE /* loop_unswitch_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_unswitch_pass.cpp; sourceTree = "<group>"; };
+		A9C2F02E22E7833C001763CE /* unify_const_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unify_const_pass.cpp; sourceTree = "<group>"; };
+		A9C2F02F22E7833C001763CE /* type_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = type_manager.cpp; sourceTree = "<group>"; };
+		A9C2F03022E7833C001763CE /* generate_webgpu_initializers_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = generate_webgpu_initializers_pass.cpp; sourceTree = "<group>"; };
+		A9C2F03122E7833C001763CE /* private_to_local_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = private_to_local_pass.h; sourceTree = "<group>"; };
+		A9C2F03222E7833C001763CE /* inline_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_pass.cpp; sourceTree = "<group>"; };
+		A9C2F03322E7833C001763CE /* def_use_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = def_use_manager.h; sourceTree = "<group>"; };
+		A9C2F03422E7833C001763CE /* ir_loader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ir_loader.cpp; sourceTree = "<group>"; };
+		A9C2F03522E7833C001763CE /* cfg_cleanup_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfg_cleanup_pass.h; sourceTree = "<group>"; };
+		A9C2F03622E7833C001763CE /* licm_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = licm_pass.cpp; sourceTree = "<group>"; };
+		A9C2F03722E7833C001763CE /* eliminate_dead_functions_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_functions_pass.cpp; sourceTree = "<group>"; };
+		A9C2F03822E7833C001763CE /* local_redundancy_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_redundancy_elimination.h; sourceTree = "<group>"; };
+		A9C2F03922E7833C001763CE /* split_invalid_unreachable_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = split_invalid_unreachable_pass.cpp; sourceTree = "<group>"; };
+		A9C2F03A22E7833C001763CE /* loop_peeling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_peeling.h; sourceTree = "<group>"; };
+		A9C2F03B22E7833C001763CE /* vector_dce.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vector_dce.cpp; sourceTree = "<group>"; };
+		A9C2F03C22E7833C001763CE /* block_merge_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_merge_util.h; sourceTree = "<group>"; };
+		A9C2F03D22E7833C001763CE /* loop_unroller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_unroller.cpp; sourceTree = "<group>"; };
+		A9C2F03E22E7833C001763CE /* constants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = constants.cpp; sourceTree = "<group>"; };
+		A9C2F03F22E7833C001763CE /* loop_fusion_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fusion_pass.h; sourceTree = "<group>"; };
+		A9C2F04022E7833C001763CE /* struct_cfg_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = struct_cfg_analysis.h; sourceTree = "<group>"; };
+		A9C2F04122E7833C001763CE /* def_use_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = def_use_manager.cpp; sourceTree = "<group>"; };
+		A9C2F04222E7833C001763CE /* strip_reflect_info_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strip_reflect_info_pass.cpp; sourceTree = "<group>"; };
+		A9C2F04322E7833C001763CE /* decoration_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoration_manager.h; sourceTree = "<group>"; };
+		A9C2F04422E7833C001763CE /* ccp_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ccp_pass.cpp; sourceTree = "<group>"; };
+		A9C2F04522E7833C001763CE /* process_lines_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = process_lines_pass.h; sourceTree = "<group>"; };
+		A9C2F04622E7833C001763CE /* local_single_block_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_single_block_elim_pass.h; sourceTree = "<group>"; };
+		A9C2F04722E7833C001763CE /* pch_source_opt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch_source_opt.cpp; sourceTree = "<group>"; };
+		A9C2F04822E7833C001763CE /* strength_reduction_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strength_reduction_pass.h; sourceTree = "<group>"; };
+		A9C2F04922E7833C001763CE /* aggressive_dead_code_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aggressive_dead_code_elim_pass.cpp; sourceTree = "<group>"; };
+		A9C2F04A22E7833C001763CE /* eliminate_dead_functions_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_functions_util.cpp; sourceTree = "<group>"; };
+		A9C2F04B22E7833C001763CE /* simplification_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simplification_pass.cpp; sourceTree = "<group>"; };
+		A9C2F04C22E7833C001763CE /* dead_branch_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_branch_elim_pass.cpp; sourceTree = "<group>"; };
+		A9C2F04D22E7833C001763CE /* flatten_decoration_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = flatten_decoration_pass.cpp; sourceTree = "<group>"; };
+		A9C2F04E22E7833C001763CE /* dead_insert_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_insert_elim_pass.h; sourceTree = "<group>"; };
+		A9C2F04F22E7833C001763CE /* folding_rules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = folding_rules.cpp; sourceTree = "<group>"; };
+		A9C2F05022E7833C001763CE /* freeze_spec_constant_value_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = freeze_spec_constant_value_pass.h; sourceTree = "<group>"; };
+		A9C2F05122E7833C001763CE /* ir_context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ir_context.cpp; sourceTree = "<group>"; };
+		A9C2F05222E7833C001763CE /* instrument_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instrument_pass.h; sourceTree = "<group>"; };
+		A9C2F05322E7833C001763CE /* mem_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_pass.h; sourceTree = "<group>"; };
+		A9C2F05422E7833C001763CE /* loop_descriptor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_descriptor.cpp; sourceTree = "<group>"; };
+		A9C2F05522E7833C001763CE /* local_ssa_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_ssa_elim_pass.cpp; sourceTree = "<group>"; };
+		A9C2F05622E7833C001763CE /* eliminate_dead_members_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_members_pass.h; sourceTree = "<group>"; };
+		A9C2F05722E7833C001763CE /* function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cpp; sourceTree = "<group>"; };
+		A9C2F05822E7833C001763CE /* instruction_list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction_list.cpp; sourceTree = "<group>"; };
+		A9C2F05922E7833C001763CE /* composite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = composite.cpp; sourceTree = "<group>"; };
+		A9C2F05A22E7833C001763CE /* process_lines_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = process_lines_pass.cpp; sourceTree = "<group>"; };
+		A9C2F05B22E7833C001763CE /* inline_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_pass.h; sourceTree = "<group>"; };
+		A9C2F05C22E7833C001763CE /* loop_dependence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_dependence.h; sourceTree = "<group>"; };
+		A9C2F05D22E7833C001763CE /* value_number_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = value_number_table.h; sourceTree = "<group>"; };
+		A9C2F05E22E7833C001763CE /* flatten_decoration_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flatten_decoration_pass.h; sourceTree = "<group>"; };
+		A9C2F05F22E7833C001763CE /* if_conversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = if_conversion.cpp; sourceTree = "<group>"; };
+		A9C2F06022E7833C001763CE /* inline_exhaustive_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_exhaustive_pass.h; sourceTree = "<group>"; };
+		A9C2F06122E7833C001763CE /* constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constants.h; sourceTree = "<group>"; };
+		A9C2F06222E7833C001763CE /* eliminate_dead_members_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_members_pass.cpp; sourceTree = "<group>"; };
+		A9C2F06322E7833C001763CE /* strength_reduction_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strength_reduction_pass.cpp; sourceTree = "<group>"; };
+		A9C2F06422E7833C001763CE /* block_merge_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_merge_util.cpp; sourceTree = "<group>"; };
+		A9C2F06522E7833C001763CE /* upgrade_memory_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upgrade_memory_model.h; sourceTree = "<group>"; };
+		A9C2F06622E7833C001763CE /* copy_prop_arrays.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = copy_prop_arrays.cpp; sourceTree = "<group>"; };
+		A9C2F06722E7833C001763CE /* pass_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pass_manager.cpp; sourceTree = "<group>"; };
+		A9C2F06822E7833C001763CE /* inline_exhaustive_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_exhaustive_pass.cpp; sourceTree = "<group>"; };
+		A9C2F06922E7833C001763CE /* loop_fission.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fission.h; sourceTree = "<group>"; };
+		A9C2F06A22E7833C001763CE /* workaround1209.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = workaround1209.h; sourceTree = "<group>"; };
+		A9C2F06B22E7833C001763CE /* loop_fusion_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fusion_pass.cpp; sourceTree = "<group>"; };
+		A9C2F06C22E7833C001763CE /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
+		A9C2F06D22E7833C001763CE /* split_invalid_unreachable_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = split_invalid_unreachable_pass.h; sourceTree = "<group>"; };
+		A9C2F06E22E7833C001763CE /* copy_prop_arrays.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = copy_prop_arrays.h; sourceTree = "<group>"; };
+		A9C2F06F22E7833C001763CE /* eliminate_dead_constant_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_constant_pass.h; sourceTree = "<group>"; };
+		A9C2F07022E7833C001763CE /* dead_insert_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_insert_elim_pass.cpp; sourceTree = "<group>"; };
+		A9C2F07122E7833C001763CE /* ssa_rewrite_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssa_rewrite_pass.h; sourceTree = "<group>"; };
+		A9C2F07222E7833C001763CE /* scalar_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_analysis.cpp; sourceTree = "<group>"; };
+		A9C2F07322E7833C001763CE /* dead_variable_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_variable_elimination.h; sourceTree = "<group>"; };
+		A9C2F07422E7833C001763CE /* block_merge_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_merge_pass.cpp; sourceTree = "<group>"; };
+		A9C2F07522E7833C001763CE /* dominator_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dominator_analysis.h; sourceTree = "<group>"; };
+		A9C2F07622E7833C001763CE /* pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pass.h; sourceTree = "<group>"; };
+		A9C2F07722E7833C001763CE /* folding_rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = folding_rules.h; sourceTree = "<group>"; };
+		A9C2F07822E7833C001763CE /* eliminate_dead_functions_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_functions_pass.h; sourceTree = "<group>"; };
+		A9C2F07922E7833C001763CE /* eliminate_dead_functions_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_functions_util.h; sourceTree = "<group>"; };
+		A9C2F07A22E7833C001763CE /* fold.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold.h; sourceTree = "<group>"; };
+		A9C2F07B22E7833C001763CE /* local_single_store_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_single_store_elim_pass.cpp; sourceTree = "<group>"; };
+		A9C2F07C22E7833C001763CE /* dead_branch_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_branch_elim_pass.h; sourceTree = "<group>"; };
+		A9C2F07D22E7833C001763CE /* private_to_local_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = private_to_local_pass.cpp; sourceTree = "<group>"; };
+		A9C2F07E22E7833C001763CE /* scalar_analysis_nodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_analysis_nodes.h; sourceTree = "<group>"; };
+		A9C2F07F22E7833C001763CE /* propagator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = propagator.cpp; sourceTree = "<group>"; };
+		A9C2F08022E7833C001763CE /* fix_storage_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fix_storage_class.h; sourceTree = "<group>"; };
+		A9C2F08122E7833C001763CE /* loop_dependence_helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_dependence_helpers.cpp; sourceTree = "<group>"; };
+		A9C2F08222E7833C001763CE /* set_spec_constant_default_value_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = set_spec_constant_default_value_pass.cpp; sourceTree = "<group>"; };
+		A9C2F08322E7833C001763CE /* passes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = passes.h; sourceTree = "<group>"; };
+		A9C2F08422E7833C001763CE /* fold.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fold.cpp; sourceTree = "<group>"; };
+		A9C2F08522E7833C001763CE /* strip_reflect_info_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_reflect_info_pass.h; sourceTree = "<group>"; };
+		A9C2F08622E7833C001763CE /* scalar_replacement_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_replacement_pass.cpp; sourceTree = "<group>"; };
+		A9C2F08722E7833C001763CE /* simplification_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simplification_pass.h; sourceTree = "<group>"; };
+		A9C2F08822E7833C001763CE /* remove_duplicates_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_duplicates_pass.h; sourceTree = "<group>"; };
+		A9C2F08922E7833C001763CE /* redundancy_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = redundancy_elimination.cpp; sourceTree = "<group>"; };
+		A9C2F08A22E7833C001763CE /* reflect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reflect.h; sourceTree = "<group>"; };
+		A9C2F08B22E7833C001763CE /* workaround1209.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = workaround1209.cpp; sourceTree = "<group>"; };
+		A9C2F08C22E7833C001763CE /* null_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = null_pass.h; sourceTree = "<group>"; };
+		A9C2F08D22E7833C001763CE /* const_folding_rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = const_folding_rules.h; sourceTree = "<group>"; };
+		A9C2F08E22E7833C001763CE /* scalar_replacement_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_replacement_pass.h; sourceTree = "<group>"; };
+		A9C2F08F22E7833C001763CE /* instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction.cpp; sourceTree = "<group>"; };
+		A9C2F09022E7833C001763CE /* pch_source_opt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch_source_opt.h; sourceTree = "<group>"; };
+		A9C2F09122E7833C001763CE /* reduce_load_size.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduce_load_size.cpp; sourceTree = "<group>"; };
+		A9C2F09222E7833C001763CE /* redundancy_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = redundancy_elimination.h; sourceTree = "<group>"; };
+		A9C2F09322E7833C001763CE /* fix_storage_class.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fix_storage_class.cpp; sourceTree = "<group>"; };
+		A9C2F09422E7833C001763CE /* value_number_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = value_number_table.cpp; sourceTree = "<group>"; };
+		A9C2F09522E7833C001763CE /* local_ssa_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_ssa_elim_pass.h; sourceTree = "<group>"; };
+		A9C2F09622E7833C001763CE /* inline_opaque_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_opaque_pass.cpp; sourceTree = "<group>"; };
+		A9C2F09722E7833C001763CE /* replace_invalid_opc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = replace_invalid_opc.cpp; sourceTree = "<group>"; };
+		A9C2F09822E7833C001763CE /* loop_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_utils.h; sourceTree = "<group>"; };
+		A9C2F09922E7833C001763CE /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = "<group>"; };
+		A9C2F09A22E7833C001763CE /* dominator_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dominator_analysis.cpp; sourceTree = "<group>"; };
+		A9C2F09B22E7833C001763CE /* decompose_initialized_variables_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decompose_initialized_variables_pass.cpp; sourceTree = "<group>"; };
+		A9C2F09C22E7833C001763CE /* ir_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_builder.h; sourceTree = "<group>"; };
+		A9C2F09D22E7833C001763CE /* loop_unswitch_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_unswitch_pass.h; sourceTree = "<group>"; };
+		A9C2F09E22E7833C001763CE /* cfg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfg.h; sourceTree = "<group>"; };
+		A9C2F09F22E7833C001763CE /* code_sink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = code_sink.h; sourceTree = "<group>"; };
+		A9C2F0A022E7833C001763CE /* loop_descriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_descriptor.h; sourceTree = "<group>"; };
+		A9C2F0A122E7833C001763CE /* generate_webgpu_initializers_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generate_webgpu_initializers_pass.h; sourceTree = "<group>"; };
+		A9C2F0A222E7833C001763CE /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
+		A9C2F0A322E7833C001763CE /* aggressive_dead_code_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aggressive_dead_code_elim_pass.h; sourceTree = "<group>"; };
+		A9C2F0A422E7833C001763CE /* struct_cfg_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = struct_cfg_analysis.cpp; sourceTree = "<group>"; };
+		A9C2F0A522E7833C001763CE /* vector_dce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_dce.h; sourceTree = "<group>"; };
+		A9C2F0A622E7833C001763CE /* combine_access_chains.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = combine_access_chains.h; sourceTree = "<group>"; };
+		A9C2F0A722E7833C001763CE /* pass_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pass_manager.h; sourceTree = "<group>"; };
+		A9C2F0A822E7833C001763CE /* local_access_chain_convert_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_access_chain_convert_pass.cpp; sourceTree = "<group>"; };
+		A9C2F0A922E7833C001763CE /* basic_block.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = basic_block.cpp; sourceTree = "<group>"; };
+		A9C2F0AA22E7833C001763CE /* iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator.h; sourceTree = "<group>"; };
+		A9C2F0AB22E7833C001763CE /* licm_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = licm_pass.h; sourceTree = "<group>"; };
+		A9C2F0AC22E7833C001763CE /* build_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build_module.h; sourceTree = "<group>"; };
+		A9C2F0AD22E7833C001763CE /* ccp_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ccp_pass.h; sourceTree = "<group>"; };
+		A9C2F0AE22E7833C001763CE /* decompose_initialized_variables_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decompose_initialized_variables_pass.h; sourceTree = "<group>"; };
+		A9C2F0AF22E7833C001763CE /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = "<group>"; };
+		A9C2F0B022E7833C001763CE /* loop_fusion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fusion.cpp; sourceTree = "<group>"; };
+		A9C2F0B122E7833C001763CE /* upgrade_memory_model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = upgrade_memory_model.cpp; sourceTree = "<group>"; };
+		A9C2F0B222E7833C001763CE /* feature_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = feature_manager.h; sourceTree = "<group>"; };
+		A9C2F0B322E7833C001763CE /* inst_bindless_check_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inst_bindless_check_pass.h; sourceTree = "<group>"; };
+		A9C2F0B422E7833C001763CE /* scalar_analysis_simplification.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_analysis_simplification.cpp; sourceTree = "<group>"; };
+		A9C2F0B522E7833C001763CE /* set_spec_constant_default_value_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = set_spec_constant_default_value_pass.h; sourceTree = "<group>"; };
+		A9C2F0B622E7833C001763CE /* dominator_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dominator_tree.h; sourceTree = "<group>"; };
+		A9C2F0B722E7833C001763CE /* legalize_vector_shuffle_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = legalize_vector_shuffle_pass.cpp; sourceTree = "<group>"; };
+		A9C2F0B822E7833C001763CE /* type_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_manager.h; sourceTree = "<group>"; };
+		A9C2F0B922E7833C001763CE /* compact_ids_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compact_ids_pass.cpp; sourceTree = "<group>"; };
+		A9C2F0BA22E7833C001763CE /* loop_peeling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_peeling.cpp; sourceTree = "<group>"; };
+		A9C2F0BB22E7833C001763CE /* table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = table.h; sourceTree = "<group>"; };
+		A9C2F0F922E7833D001763CE /* ext_inst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ext_inst.h; sourceTree = "<group>"; };
+		A9C2F0FA22E7833D001763CE /* diagnostic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = diagnostic.cpp; sourceTree = "<group>"; };
+		A9C2F0FB22E7833D001763CE /* latest_version_spirv_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_spirv_header.h; sourceTree = "<group>"; };
+		A9C2F0FC22E7833D001763CE /* libspirv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libspirv.cpp; sourceTree = "<group>"; };
+		A9C2F0FD22E7833D001763CE /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
+		A9C2F0FE22E7833D001763CE /* spirv_optimizer_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_optimizer_options.h; sourceTree = "<group>"; };
+		A9C2F0FF22E7833D001763CE /* opcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opcode.h; sourceTree = "<group>"; };
+		A9C2F10022E7833D001763CE /* operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand.cpp; sourceTree = "<group>"; };
+		A9C2F10122E7833D001763CE /* latest_version_glsl_std_450_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_glsl_std_450_header.h; sourceTree = "<group>"; };
+		A9C2F10222E7833D001763CE /* extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = extensions.h; sourceTree = "<group>"; };
+		A9C2F10322E7833D001763CE /* disassemble.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassemble.cpp; sourceTree = "<group>"; };
+		A9C2F10422E7833D001763CE /* binary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binary.h; sourceTree = "<group>"; };
+		A9C2F10522E7833D001763CE /* text_handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text_handler.cpp; sourceTree = "<group>"; };
+		A9C2F10722E7833D001763CE /* validate_annotation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_annotation.cpp; sourceTree = "<group>"; };
+		A9C2F10822E7833D001763CE /* validate_misc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_misc.cpp; sourceTree = "<group>"; };
+		A9C2F10922E7833D001763CE /* validate_cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_cfg.cpp; sourceTree = "<group>"; };
+		A9C2F10A22E7833D001763CE /* validate_capability.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_capability.cpp; sourceTree = "<group>"; };
+		A9C2F10B22E7833D001763CE /* construct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = construct.h; sourceTree = "<group>"; };
+		A9C2F10C22E7833D001763CE /* validate_barriers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_barriers.cpp; sourceTree = "<group>"; };
+		A9C2F10D22E7833D001763CE /* validate_non_uniform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_non_uniform.cpp; sourceTree = "<group>"; };
+		A9C2F10E22E7833D001763CE /* validate_scopes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_scopes.cpp; sourceTree = "<group>"; };
+		A9C2F10F22E7833D001763CE /* validate_atomics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_atomics.cpp; sourceTree = "<group>"; };
+		A9C2F11022E7833D001763CE /* basic_block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic_block.h; sourceTree = "<group>"; };
+		A9C2F11122E7833D001763CE /* validate_instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_instruction.cpp; sourceTree = "<group>"; };
+		A9C2F11222E7833D001763CE /* validate_decorations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_decorations.cpp; sourceTree = "<group>"; };
+		A9C2F11322E7833D001763CE /* validate_debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_debug.cpp; sourceTree = "<group>"; };
+		A9C2F11422E7833D001763CE /* validate_builtins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_builtins.cpp; sourceTree = "<group>"; };
+		A9C2F11522E7833D001763CE /* validate_interfaces.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_interfaces.cpp; sourceTree = "<group>"; };
+		A9C2F11622E7833D001763CE /* validate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate.cpp; sourceTree = "<group>"; };
+		A9C2F11722E7833D001763CE /* validation_state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validation_state.h; sourceTree = "<group>"; };
+		A9C2F11822E7833D001763CE /* validate_constants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_constants.cpp; sourceTree = "<group>"; };
+		A9C2F11922E7833D001763CE /* validate_bitwise.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_bitwise.cpp; sourceTree = "<group>"; };
+		A9C2F11A22E7833D001763CE /* validate_extensions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_extensions.cpp; sourceTree = "<group>"; };
+		A9C2F11B22E7833D001763CE /* construct.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = construct.cpp; sourceTree = "<group>"; };
+		A9C2F11C22E7833D001763CE /* function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cpp; sourceTree = "<group>"; };
+		A9C2F11D22E7833D001763CE /* validate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validate.h; sourceTree = "<group>"; };
+		A9C2F11E22E7833D001763CE /* validate_adjacency.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_adjacency.cpp; sourceTree = "<group>"; };
+		A9C2F11F22E7833D001763CE /* validate_conversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_conversion.cpp; sourceTree = "<group>"; };
+		A9C2F12022E7833D001763CE /* validate_small_type_uses.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_small_type_uses.cpp; sourceTree = "<group>"; };
+		A9C2F12122E7833D001763CE /* validate_datarules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_datarules.cpp; sourceTree = "<group>"; };
+		A9C2F12222E7833D001763CE /* validate_scopes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validate_scopes.h; sourceTree = "<group>"; };
+		A9C2F12322E7833D001763CE /* validate_id.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_id.cpp; sourceTree = "<group>"; };
+		A9C2F12422E7833D001763CE /* validate_memory_semantics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validate_memory_semantics.h; sourceTree = "<group>"; };
+		A9C2F12522E7833D001763CE /* validate_arithmetics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_arithmetics.cpp; sourceTree = "<group>"; };
+		A9C2F12622E7833D001763CE /* validate_mode_setting.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_mode_setting.cpp; sourceTree = "<group>"; };
+		A9C2F12722E7833D001763CE /* validate_memory_semantics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_memory_semantics.cpp; sourceTree = "<group>"; };
+		A9C2F12822E7833D001763CE /* validate_logicals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_logicals.cpp; sourceTree = "<group>"; };
+		A9C2F12922E7833D001763CE /* validate_derivatives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_derivatives.cpp; sourceTree = "<group>"; };
+		A9C2F12A22E7833D001763CE /* validate_memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_memory.cpp; sourceTree = "<group>"; };
+		A9C2F12B22E7833D001763CE /* validate_image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_image.cpp; sourceTree = "<group>"; };
+		A9C2F12C22E7833D001763CE /* validate_literals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_literals.cpp; sourceTree = "<group>"; };
+		A9C2F12D22E7833D001763CE /* instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction.cpp; sourceTree = "<group>"; };
+		A9C2F12E22E7833D001763CE /* validate_type.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_type.cpp; sourceTree = "<group>"; };
+		A9C2F12F22E7833D001763CE /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
+		A9C2F13022E7833D001763CE /* validate_execution_limitations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_execution_limitations.cpp; sourceTree = "<group>"; };
+		A9C2F13122E7833D001763CE /* validate_layout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_layout.cpp; sourceTree = "<group>"; };
+		A9C2F13222E7833D001763CE /* basic_block.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = basic_block.cpp; sourceTree = "<group>"; };
+		A9C2F13322E7833D001763CE /* validate_function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_function.cpp; sourceTree = "<group>"; };
+		A9C2F13422E7833D001763CE /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = "<group>"; };
+		A9C2F13522E7833D001763CE /* validate_composites.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_composites.cpp; sourceTree = "<group>"; };
+		A9C2F13622E7833D001763CE /* validation_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validation_state.cpp; sourceTree = "<group>"; };
+		A9C2F13722E7833D001763CE /* validate_primitives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_primitives.cpp; sourceTree = "<group>"; };
+		A9C2F13822E7833D001763CE /* decoration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoration.h; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXGroup section */
@@ -1594,437 +1591,6 @@
 			path = External;
 			sourceTree = "<group>";
 		};
-		A94A673D22B17BBB00C661C6 /* source */ = {
-			isa = PBXGroup;
-			children = (
-				A94A673E22B17BBB00C661C6 /* spirv_target_env.cpp */,
-				A94A673F22B17BBB00C661C6 /* extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json */,
-				A94A674022B17BBB00C661C6 /* spirv_fuzzer_options.h */,
-				A94A674122B17BBB00C661C6 /* assembly_grammar.h */,
-				A94A674222B17BBB00C661C6 /* enum_set.h */,
-				A94A674322B17BBB00C661C6 /* CMakeLists.txt */,
-				A94A674422B17BBB00C661C6 /* extinst.spv-amd-shader-ballot.grammar.json */,
-				A94A674522B17BBB00C661C6 /* text.cpp */,
-				A94A674622B17BBB00C661C6 /* assembly_grammar.cpp */,
-				A94A674722B17BBB00C661C6 /* text.h */,
-				A94A674822B17BBB00C661C6 /* extensions.cpp */,
-				A94A674922B17BBB00C661C6 /* pch_source.cpp */,
-				A94A674A22B17BBB00C661C6 /* util */,
-				A94A675922B17BBB00C661C6 /* spirv_target_env.h */,
-				A94A675A22B17BBB00C661C6 /* table.cpp */,
-				A94A675B22B17BBB00C661C6 /* reduce */,
-				A94A679422B17BBB00C661C6 /* latest_version_opencl_std_header.h */,
-				A94A679522B17BBB00C661C6 /* spirv_optimizer_options.cpp */,
-				A94A679622B17BBB00C661C6 /* cfa.h */,
-				A94A679722B17BBB00C661C6 /* pch_source.h */,
-				A94A679822B17BBB00C661C6 /* enum_string_mapping.h */,
-				A94A679922B17BBB00C661C6 /* spirv_fuzzer_options.cpp */,
-				A94A679A22B17BBB00C661C6 /* spirv_reducer_options.h */,
-				A94A679B22B17BBB00C661C6 /* spirv_validator_options.cpp */,
-				A94A679C22B17BBB00C661C6 /* extinst.spv-amd-shader-trinary-minmax.grammar.json */,
-				A94A679D22B17BBB00C661C6 /* print.cpp */,
-				A94A679E22B17BBB00C661C6 /* spirv_definition.h */,
-				A94A679F22B17BBB00C661C6 /* operand.h */,
-				A94A67A022B17BBB00C661C6 /* spirv_endian.cpp */,
-				A94A67A122B17BBB00C661C6 /* macro.h */,
-				A94A67A222B17BBB00C661C6 /* spirv_constant.h */,
-				A94A67A322B17BBB00C661C6 /* extinst.spv-amd-gcn-shader.grammar.json */,
-				A94A67A422B17BBB00C661C6 /* binary.cpp */,
-				A94A67A522B17BBB00C661C6 /* spirv_validator_options.h */,
-				A94A67A622B17BBB00C661C6 /* enum_string_mapping.cpp */,
-				A94A67A722B17BBB00C661C6 /* text_handler.h */,
-				A94A67A822B17BBB00C661C6 /* parsed_operand.h */,
-				A94A67A922B17BBB00C661C6 /* name_mapper.h */,
-				A94A67AA22B17BBB00C661C6 /* spirv_reducer_options.cpp */,
-				A94A67AB22B17BBB00C661C6 /* parsed_operand.cpp */,
-				A94A67AC22B17BBB00C661C6 /* diagnostic.h */,
-				A94A67AD22B17BBB00C661C6 /* spirv_endian.h */,
-				A94A67AE22B17BBB00C661C6 /* name_mapper.cpp */,
-				A94A67AF22B17BBB00C661C6 /* extinst.debuginfo.grammar.json */,
-				A94A67B022B17BBB00C661C6 /* link */,
-				A94A67B322B17BBB00C661C6 /* software_version.cpp */,
-				A94A67B422B17BBB00C661C6 /* opcode.cpp */,
-				A94A67B522B17BBB00C661C6 /* print.h */,
-				A94A67B622B17BBB00C661C6 /* ext_inst.cpp */,
-				A94A67B722B17BBB00C661C6 /* disassemble.h */,
-				A94A67B822B17BBB00C661C6 /* opt */,
-				A94A688322B17BBB00C661C6 /* table.h */,
-				A94A68AF22B17BBB00C661C6 /* ext_inst.h */,
-				A94A68B022B17BBB00C661C6 /* diagnostic.cpp */,
-				A94A68B122B17BBB00C661C6 /* latest_version_spirv_header.h */,
-				A94A68B222B17BBB00C661C6 /* libspirv.cpp */,
-				A94A68B322B17BBB00C661C6 /* instruction.h */,
-				A94A68B422B17BBB00C661C6 /* spirv_optimizer_options.h */,
-				A94A68B522B17BBB00C661C6 /* opcode.h */,
-				A94A68B622B17BBB00C661C6 /* operand.cpp */,
-				A94A68B722B17BBB00C661C6 /* latest_version_glsl_std_450_header.h */,
-				A94A68B822B17BBB00C661C6 /* extensions.h */,
-				A94A68B922B17BBB00C661C6 /* disassemble.cpp */,
-				A94A68BA22B17BBB00C661C6 /* binary.h */,
-				A94A68BB22B17BBB00C661C6 /* text_handler.cpp */,
-				A94A68BC22B17BBB00C661C6 /* val */,
-			);
-			path = source;
-			sourceTree = "<group>";
-		};
-		A94A674A22B17BBB00C661C6 /* util */ = {
-			isa = PBXGroup;
-			children = (
-				A94A674B22B17BBB00C661C6 /* parse_number.h */,
-				A94A674C22B17BBB00C661C6 /* ilist_node.h */,
-				A94A674D22B17BBB00C661C6 /* make_unique.h */,
-				A94A674E22B17BBB00C661C6 /* string_utils.h */,
-				A94A674F22B17BBB00C661C6 /* small_vector.h */,
-				A94A675022B17BBB00C661C6 /* timer.cpp */,
-				A94A675122B17BBB00C661C6 /* timer.h */,
-				A94A675222B17BBB00C661C6 /* string_utils.cpp */,
-				A94A675322B17BBB00C661C6 /* bit_vector.h */,
-				A94A675422B17BBB00C661C6 /* bitutils.h */,
-				A94A675522B17BBB00C661C6 /* hex_float.h */,
-				A94A675622B17BBB00C661C6 /* parse_number.cpp */,
-				A94A675722B17BBB00C661C6 /* bit_vector.cpp */,
-				A94A675822B17BBB00C661C6 /* ilist.h */,
-			);
-			path = util;
-			sourceTree = "<group>";
-		};
-		A94A675B22B17BBB00C661C6 /* reduce */ = {
-			isa = PBXGroup;
-			children = (
-				A94A675C22B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.h */,
-				A94A675D22B17BBB00C661C6 /* remove_selection_reduction_opportunity.cpp */,
-				A94A675E22B17BBB00C661C6 /* remove_block_reduction_opportunity.h */,
-				A94A675F22B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.h */,
-				A94A676022B17BBB00C661C6 /* reduction_pass.cpp */,
-				A94A676122B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.cpp */,
-				A94A676222B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.h */,
-				A94A676322B17BBB00C661C6 /* CMakeLists.txt */,
-				A94A676422B17BBB00C661C6 /* reduction_util.cpp */,
-				A94A676522B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.cpp */,
-				A94A676622B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.h */,
-				A94A676722B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.cpp */,
-				A94A676822B17BBB00C661C6 /* remove_instruction_reduction_opportunity.h */,
-				A94A676922B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h */,
-				A94A676A22B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.cpp */,
-				A94A676B22B17BBB00C661C6 /* remove_function_reduction_opportunity.cpp */,
-				A94A676C22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.h */,
-				A94A676D22B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.cpp */,
-				A94A676E22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.cpp */,
-				A94A676F22B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp */,
-				A94A677022B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.h */,
-				A94A677122B17BBB00C661C6 /* merge_blocks_reduction_opportunity.cpp */,
-				A94A677222B17BBB00C661C6 /* change_operand_reduction_opportunity.cpp */,
-				A94A677322B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.h */,
-				A94A677422B17BBB00C661C6 /* remove_function_reduction_opportunity.h */,
-				A94A677522B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.h */,
-				A94A677622B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp */,
-				A94A677722B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.h */,
-				A94A677822B17BBB00C661C6 /* remove_selection_reduction_opportunity.h */,
-				A94A677922B17BBB00C661C6 /* remove_instruction_reduction_opportunity.cpp */,
-				A94A677A22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.h */,
-				A94A677B22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.h */,
-				A94A677C22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.cpp */,
-				A94A677D22B17BBB00C661C6 /* pch_source_reduce.cpp */,
-				A94A677E22B17BBB00C661C6 /* reducer.cpp */,
-				A94A677F22B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.cpp */,
-				A94A678022B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.h */,
-				A94A678122B17BBB00C661C6 /* pch_source_reduce.h */,
-				A94A678222B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.h */,
-				A94A678322B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.cpp */,
-				A94A678422B17BBB00C661C6 /* reduction_opportunity.cpp */,
-				A94A678522B17BBB00C661C6 /* reducer.h */,
-				A94A678622B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.cpp */,
-				A94A678722B17BBB00C661C6 /* reduction_opportunity.h */,
-				A94A678822B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h */,
-				A94A678922B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.cpp */,
-				A94A678A22B17BBB00C661C6 /* reduction_opportunity_finder.h */,
-				A94A678B22B17BBB00C661C6 /* change_operand_reduction_opportunity.h */,
-				A94A678C22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.h */,
-				A94A678D22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.cpp */,
-				A94A678E22B17BBB00C661C6 /* reduction_util.h */,
-				A94A678F22B17BBB00C661C6 /* merge_blocks_reduction_opportunity.h */,
-				A94A679022B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp */,
-				A94A679122B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.cpp */,
-				A94A679222B17BBB00C661C6 /* remove_block_reduction_opportunity.cpp */,
-				A94A679322B17BBB00C661C6 /* reduction_pass.h */,
-			);
-			path = reduce;
-			sourceTree = "<group>";
-		};
-		A94A67B022B17BBB00C661C6 /* link */ = {
-			isa = PBXGroup;
-			children = (
-				A94A67B122B17BBB00C661C6 /* CMakeLists.txt */,
-				A94A67B222B17BBB00C661C6 /* linker.cpp */,
-			);
-			path = link;
-			sourceTree = "<group>";
-		};
-		A94A67B822B17BBB00C661C6 /* opt */ = {
-			isa = PBXGroup;
-			children = (
-				A94A67B922B17BBB00C661C6 /* optimizer.cpp */,
-				A94A67BA22B17BBB00C661C6 /* if_conversion.h */,
-				A94A67BB22B17BBB00C661C6 /* register_pressure.cpp */,
-				A94A67BC22B17BBB00C661C6 /* loop_utils.cpp */,
-				A94A67BD22B17BBB00C661C6 /* merge_return_pass.h */,
-				A94A67BE22B17BBB00C661C6 /* inline_opaque_pass.h */,
-				A94A67BF22B17BBB00C661C6 /* loop_fusion.h */,
-				A94A67C022B17BBB00C661C6 /* combine_access_chains.cpp */,
-				A94A67C122B17BBB00C661C6 /* build_module.cpp */,
-				A94A67C222B17BBB00C661C6 /* composite.h */,
-				A94A67C322B17BBB00C661C6 /* compact_ids_pass.h */,
-				A94A67C422B17BBB00C661C6 /* register_pressure.h */,
-				A94A67C522B17BBB00C661C6 /* tree_iterator.h */,
-				A94A67C622B17BBB00C661C6 /* strip_atomic_counter_memory_pass.h */,
-				A94A67C722B17BBB00C661C6 /* legalize_vector_shuffle_pass.h */,
-				A94A67C822B17BBB00C661C6 /* local_single_store_elim_pass.h */,
-				A94A67C922B17BBB00C661C6 /* reduce_load_size.h */,
-				A94A67CA22B17BBB00C661C6 /* code_sink.cpp */,
-				A94A67CB22B17BBB00C661C6 /* types.cpp */,
-				A94A67CC22B17BBB00C661C6 /* scalar_analysis.h */,
-				A94A67CD22B17BBB00C661C6 /* strip_debug_info_pass.h */,
-				A94A67CE22B17BBB00C661C6 /* cfg.cpp */,
-				A94A67CF22B17BBB00C661C6 /* strip_atomic_counter_memory_pass.cpp */,
-				A94A67D022B17BBB00C661C6 /* decoration_manager.cpp */,
-				A94A67D122B17BBB00C661C6 /* local_single_block_elim_pass.cpp */,
-				A94A67D222B17BBB00C661C6 /* freeze_spec_constant_value_pass.cpp */,
-				A94A67D322B17BBB00C661C6 /* replace_invalid_opc.h */,
-				A94A67D422B17BBB00C661C6 /* local_access_chain_convert_pass.h */,
-				A94A67D522B17BBB00C661C6 /* inst_bindless_check_pass.cpp */,
-				A94A67D622B17BBB00C661C6 /* local_redundancy_elimination.cpp */,
-				A94A67D722B17BBB00C661C6 /* CMakeLists.txt */,
-				A94A67D822B17BBB00C661C6 /* instrument_pass.cpp */,
-				A94A67D922B17BBB00C661C6 /* propagator.h */,
-				A94A67DA22B17BBB00C661C6 /* instruction_list.h */,
-				A94A67DB22B17BBB00C661C6 /* feature_manager.cpp */,
-				A94A67DC22B17BBB00C661C6 /* pass.cpp */,
-				A94A67DD22B17BBB00C661C6 /* loop_fission.cpp */,
-				A94A67DE22B17BBB00C661C6 /* dominator_tree.cpp */,
-				A94A67DF22B17BBB00C661C6 /* merge_return_pass.cpp */,
-				A94A67E022B17BBB00C661C6 /* ir_context.h */,
-				A94A67E122B17BBB00C661C6 /* eliminate_dead_constant_pass.cpp */,
-				A94A67E222B17BBB00C661C6 /* cfg_cleanup_pass.cpp */,
-				A94A67E322B17BBB00C661C6 /* const_folding_rules.cpp */,
-				A94A67E422B17BBB00C661C6 /* loop_unroller.h */,
-				A94A67E522B17BBB00C661C6 /* strip_debug_info_pass.cpp */,
-				A94A67E622B17BBB00C661C6 /* ssa_rewrite_pass.cpp */,
-				A94A67E722B17BBB00C661C6 /* loop_dependence.cpp */,
-				A94A67E822B17BBB00C661C6 /* unify_const_pass.h */,
-				A94A67E922B17BBB00C661C6 /* ir_loader.h */,
-				A94A67EA22B17BBB00C661C6 /* types.h */,
-				A94A67EB22B17BBB00C661C6 /* fold_spec_constant_op_and_composite_pass.h */,
-				A94A67EC22B17BBB00C661C6 /* mem_pass.cpp */,
-				A94A67ED22B17BBB00C661C6 /* basic_block.h */,
-				A94A67EE22B17BBB00C661C6 /* remove_duplicates_pass.cpp */,
-				A94A67EF22B17BBB00C661C6 /* dead_variable_elimination.cpp */,
-				A94A67F022B17BBB00C661C6 /* block_merge_pass.h */,
-				A94A67F122B17BBB00C661C6 /* module.cpp */,
-				A94A67F222B17BBB00C661C6 /* fold_spec_constant_op_and_composite_pass.cpp */,
-				A94A67F322B17BBB00C661C6 /* loop_unswitch_pass.cpp */,
-				A94A67F422B17BBB00C661C6 /* unify_const_pass.cpp */,
-				A94A67F522B17BBB00C661C6 /* type_manager.cpp */,
-				A94A67F622B17BBB00C661C6 /* generate_webgpu_initializers_pass.cpp */,
-				A94A67F722B17BBB00C661C6 /* private_to_local_pass.h */,
-				A94A67F822B17BBB00C661C6 /* inline_pass.cpp */,
-				A94A67F922B17BBB00C661C6 /* def_use_manager.h */,
-				A94A67FA22B17BBB00C661C6 /* ir_loader.cpp */,
-				A94A67FB22B17BBB00C661C6 /* cfg_cleanup_pass.h */,
-				A94A67FC22B17BBB00C661C6 /* licm_pass.cpp */,
-				A94A67FD22B17BBB00C661C6 /* eliminate_dead_functions_pass.cpp */,
-				A94A67FE22B17BBB00C661C6 /* local_redundancy_elimination.h */,
-				A94A67FF22B17BBB00C661C6 /* split_invalid_unreachable_pass.cpp */,
-				A94A680022B17BBB00C661C6 /* loop_peeling.h */,
-				A94A680122B17BBB00C661C6 /* vector_dce.cpp */,
-				A94A680222B17BBB00C661C6 /* block_merge_util.h */,
-				A94A680322B17BBB00C661C6 /* loop_unroller.cpp */,
-				A94A680422B17BBB00C661C6 /* constants.cpp */,
-				A94A680522B17BBB00C661C6 /* loop_fusion_pass.h */,
-				A94A680622B17BBB00C661C6 /* struct_cfg_analysis.h */,
-				A94A680722B17BBB00C661C6 /* common_uniform_elim_pass.cpp */,
-				A94A680822B17BBB00C661C6 /* def_use_manager.cpp */,
-				A94A680922B17BBB00C661C6 /* strip_reflect_info_pass.cpp */,
-				A94A680A22B17BBB00C661C6 /* decoration_manager.h */,
-				A94A680B22B17BBB00C661C6 /* ccp_pass.cpp */,
-				A94A680C22B17BBB00C661C6 /* process_lines_pass.h */,
-				A94A680D22B17BBB00C661C6 /* local_single_block_elim_pass.h */,
-				A94A680E22B17BBB00C661C6 /* pch_source_opt.cpp */,
-				A94A680F22B17BBB00C661C6 /* strength_reduction_pass.h */,
-				A94A681022B17BBB00C661C6 /* aggressive_dead_code_elim_pass.cpp */,
-				A94A681122B17BBB00C661C6 /* eliminate_dead_functions_util.cpp */,
-				A94A681222B17BBB00C661C6 /* simplification_pass.cpp */,
-				A94A681322B17BBB00C661C6 /* dead_branch_elim_pass.cpp */,
-				A94A681422B17BBB00C661C6 /* flatten_decoration_pass.cpp */,
-				A94A681522B17BBB00C661C6 /* dead_insert_elim_pass.h */,
-				A94A681622B17BBB00C661C6 /* folding_rules.cpp */,
-				A94A681722B17BBB00C661C6 /* freeze_spec_constant_value_pass.h */,
-				A94A681822B17BBB00C661C6 /* ir_context.cpp */,
-				A94A681922B17BBB00C661C6 /* instrument_pass.h */,
-				A94A681A22B17BBB00C661C6 /* mem_pass.h */,
-				A94A681B22B17BBB00C661C6 /* loop_descriptor.cpp */,
-				A94A681C22B17BBB00C661C6 /* local_ssa_elim_pass.cpp */,
-				A94A681D22B17BBB00C661C6 /* eliminate_dead_members_pass.h */,
-				A94A681E22B17BBB00C661C6 /* function.cpp */,
-				A94A681F22B17BBB00C661C6 /* instruction_list.cpp */,
-				A94A682022B17BBB00C661C6 /* composite.cpp */,
-				A94A682122B17BBB00C661C6 /* process_lines_pass.cpp */,
-				A94A682222B17BBB00C661C6 /* inline_pass.h */,
-				A94A682322B17BBB00C661C6 /* loop_dependence.h */,
-				A94A682422B17BBB00C661C6 /* value_number_table.h */,
-				A94A682522B17BBB00C661C6 /* flatten_decoration_pass.h */,
-				A94A682622B17BBB00C661C6 /* if_conversion.cpp */,
-				A94A682722B17BBB00C661C6 /* inline_exhaustive_pass.h */,
-				A94A682822B17BBB00C661C6 /* constants.h */,
-				A94A682922B17BBB00C661C6 /* eliminate_dead_members_pass.cpp */,
-				A94A682A22B17BBB00C661C6 /* strength_reduction_pass.cpp */,
-				A94A682B22B17BBB00C661C6 /* block_merge_util.cpp */,
-				A94A682C22B17BBB00C661C6 /* upgrade_memory_model.h */,
-				A94A682D22B17BBB00C661C6 /* copy_prop_arrays.cpp */,
-				A94A682E22B17BBB00C661C6 /* pass_manager.cpp */,
-				A94A682F22B17BBB00C661C6 /* inline_exhaustive_pass.cpp */,
-				A94A683022B17BBB00C661C6 /* loop_fission.h */,
-				A94A683122B17BBB00C661C6 /* workaround1209.h */,
-				A94A683222B17BBB00C661C6 /* loop_fusion_pass.cpp */,
-				A94A683322B17BBB00C661C6 /* log.h */,
-				A94A683422B17BBB00C661C6 /* split_invalid_unreachable_pass.h */,
-				A94A683522B17BBB00C661C6 /* copy_prop_arrays.h */,
-				A94A683622B17BBB00C661C6 /* eliminate_dead_constant_pass.h */,
-				A94A683722B17BBB00C661C6 /* dead_insert_elim_pass.cpp */,
-				A94A683822B17BBB00C661C6 /* ssa_rewrite_pass.h */,
-				A94A683922B17BBB00C661C6 /* scalar_analysis.cpp */,
-				A94A683A22B17BBB00C661C6 /* dead_variable_elimination.h */,
-				A94A683B22B17BBB00C661C6 /* block_merge_pass.cpp */,
-				A94A683C22B17BBB00C661C6 /* dominator_analysis.h */,
-				A94A683D22B17BBB00C661C6 /* pass.h */,
-				A94A683E22B17BBB00C661C6 /* folding_rules.h */,
-				A94A683F22B17BBB00C661C6 /* eliminate_dead_functions_pass.h */,
-				A94A684022B17BBB00C661C6 /* common_uniform_elim_pass.h */,
-				A94A684122B17BBB00C661C6 /* eliminate_dead_functions_util.h */,
-				A94A684222B17BBB00C661C6 /* fold.h */,
-				A94A684322B17BBB00C661C6 /* local_single_store_elim_pass.cpp */,
-				A94A684422B17BBB00C661C6 /* dead_branch_elim_pass.h */,
-				A94A684522B17BBB00C661C6 /* private_to_local_pass.cpp */,
-				A94A684622B17BBB00C661C6 /* scalar_analysis_nodes.h */,
-				A94A684722B17BBB00C661C6 /* propagator.cpp */,
-				A94A684822B17BBB00C661C6 /* fix_storage_class.h */,
-				A94A684922B17BBB00C661C6 /* loop_dependence_helpers.cpp */,
-				A94A684A22B17BBB00C661C6 /* set_spec_constant_default_value_pass.cpp */,
-				A94A684B22B17BBB00C661C6 /* passes.h */,
-				A94A684C22B17BBB00C661C6 /* fold.cpp */,
-				A94A684D22B17BBB00C661C6 /* strip_reflect_info_pass.h */,
-				A94A684E22B17BBB00C661C6 /* scalar_replacement_pass.cpp */,
-				A94A684F22B17BBB00C661C6 /* simplification_pass.h */,
-				A94A685022B17BBB00C661C6 /* remove_duplicates_pass.h */,
-				A94A685122B17BBB00C661C6 /* redundancy_elimination.cpp */,
-				A94A685222B17BBB00C661C6 /* reflect.h */,
-				A94A685322B17BBB00C661C6 /* workaround1209.cpp */,
-				A94A685422B17BBB00C661C6 /* null_pass.h */,
-				A94A685522B17BBB00C661C6 /* const_folding_rules.h */,
-				A94A685622B17BBB00C661C6 /* scalar_replacement_pass.h */,
-				A94A685722B17BBB00C661C6 /* instruction.cpp */,
-				A94A685822B17BBB00C661C6 /* pch_source_opt.h */,
-				A94A685922B17BBB00C661C6 /* reduce_load_size.cpp */,
-				A94A685A22B17BBB00C661C6 /* redundancy_elimination.h */,
-				A94A685B22B17BBB00C661C6 /* fix_storage_class.cpp */,
-				A94A685C22B17BBB00C661C6 /* value_number_table.cpp */,
-				A94A685D22B17BBB00C661C6 /* local_ssa_elim_pass.h */,
-				A94A685E22B17BBB00C661C6 /* inline_opaque_pass.cpp */,
-				A94A685F22B17BBB00C661C6 /* replace_invalid_opc.cpp */,
-				A94A686022B17BBB00C661C6 /* loop_utils.h */,
-				A94A686122B17BBB00C661C6 /* module.h */,
-				A94A686222B17BBB00C661C6 /* dominator_analysis.cpp */,
-				A94A686322B17BBB00C661C6 /* decompose_initialized_variables_pass.cpp */,
-				A94A686422B17BBB00C661C6 /* ir_builder.h */,
-				A94A686522B17BBB00C661C6 /* loop_unswitch_pass.h */,
-				A94A686622B17BBB00C661C6 /* cfg.h */,
-				A94A686722B17BBB00C661C6 /* code_sink.h */,
-				A94A686822B17BBB00C661C6 /* loop_descriptor.h */,
-				A94A686922B17BBB00C661C6 /* generate_webgpu_initializers_pass.h */,
-				A94A686A22B17BBB00C661C6 /* instruction.h */,
-				A94A686B22B17BBB00C661C6 /* aggressive_dead_code_elim_pass.h */,
-				A94A686C22B17BBB00C661C6 /* struct_cfg_analysis.cpp */,
-				A94A686D22B17BBB00C661C6 /* vector_dce.h */,
-				A94A686E22B17BBB00C661C6 /* combine_access_chains.h */,
-				A94A686F22B17BBB00C661C6 /* pass_manager.h */,
-				A94A687022B17BBB00C661C6 /* local_access_chain_convert_pass.cpp */,
-				A94A687122B17BBB00C661C6 /* basic_block.cpp */,
-				A94A687222B17BBB00C661C6 /* iterator.h */,
-				A94A687322B17BBB00C661C6 /* licm_pass.h */,
-				A94A687422B17BBB00C661C6 /* build_module.h */,
-				A94A687522B17BBB00C661C6 /* ccp_pass.h */,
-				A94A687622B17BBB00C661C6 /* decompose_initialized_variables_pass.h */,
-				A94A687722B17BBB00C661C6 /* function.h */,
-				A94A687822B17BBB00C661C6 /* loop_fusion.cpp */,
-				A94A687922B17BBB00C661C6 /* upgrade_memory_model.cpp */,
-				A94A687A22B17BBB00C661C6 /* feature_manager.h */,
-				A94A687B22B17BBB00C661C6 /* inst_bindless_check_pass.h */,
-				A94A687C22B17BBB00C661C6 /* scalar_analysis_simplification.cpp */,
-				A94A687D22B17BBB00C661C6 /* set_spec_constant_default_value_pass.h */,
-				A94A687E22B17BBB00C661C6 /* dominator_tree.h */,
-				A94A687F22B17BBB00C661C6 /* legalize_vector_shuffle_pass.cpp */,
-				A94A688022B17BBB00C661C6 /* type_manager.h */,
-				A94A688122B17BBB00C661C6 /* compact_ids_pass.cpp */,
-				A94A688222B17BBB00C661C6 /* loop_peeling.cpp */,
-			);
-			path = opt;
-			sourceTree = "<group>";
-		};
-		A94A68BC22B17BBB00C661C6 /* val */ = {
-			isa = PBXGroup;
-			children = (
-				A94A68BD22B17BBB00C661C6 /* validate_annotation.cpp */,
-				A94A68BE22B17BBB00C661C6 /* validate_misc.cpp */,
-				A94A68BF22B17BBB00C661C6 /* validate_cfg.cpp */,
-				A94A68C022B17BBB00C661C6 /* validate_capability.cpp */,
-				A94A68C122B17BBB00C661C6 /* construct.h */,
-				A94A68C222B17BBB00C661C6 /* validate_barriers.cpp */,
-				A94A68C322B17BBB00C661C6 /* validate_non_uniform.cpp */,
-				A94A68C422B17BBB00C661C6 /* validate_scopes.cpp */,
-				A94A68C522B17BBB00C661C6 /* validate_atomics.cpp */,
-				A94A68C622B17BBB00C661C6 /* basic_block.h */,
-				A94A68C722B17BBB00C661C6 /* validate_instruction.cpp */,
-				A94A68C822B17BBB00C661C6 /* validate_decorations.cpp */,
-				A94A68C922B17BBB00C661C6 /* validate_debug.cpp */,
-				A94A68CA22B17BBB00C661C6 /* validate_builtins.cpp */,
-				A94A68CB22B17BBB00C661C6 /* validate_interfaces.cpp */,
-				A94A68CC22B17BBB00C661C6 /* validate.cpp */,
-				A94A68CD22B17BBB00C661C6 /* validation_state.h */,
-				A94A68CE22B17BBB00C661C6 /* validate_constants.cpp */,
-				A94A68CF22B17BBB00C661C6 /* validate_bitwise.cpp */,
-				A94A68D022B17BBB00C661C6 /* validate_extensions.cpp */,
-				A94A68D122B17BBB00C661C6 /* construct.cpp */,
-				A94A68D222B17BBB00C661C6 /* function.cpp */,
-				A94A68D322B17BBB00C661C6 /* validate.h */,
-				A94A68D422B17BBB00C661C6 /* validate_adjacency.cpp */,
-				A94A68D522B17BBB00C661C6 /* validate_conversion.cpp */,
-				A94A68D622B17BBB00C661C6 /* validate_datarules.cpp */,
-				A94A68D722B17BBB00C661C6 /* validate_scopes.h */,
-				A94A68D822B17BBB00C661C6 /* validate_id.cpp */,
-				A94A68D922B17BBB00C661C6 /* validate_memory_semantics.h */,
-				A94A68DA22B17BBB00C661C6 /* validate_arithmetics.cpp */,
-				A94A68DB22B17BBB00C661C6 /* validate_mode_setting.cpp */,
-				A94A68DC22B17BBB00C661C6 /* validate_memory_semantics.cpp */,
-				A94A68DD22B17BBB00C661C6 /* validate_logicals.cpp */,
-				A94A68DE22B17BBB00C661C6 /* validate_derivatives.cpp */,
-				A94A68DF22B17BBB00C661C6 /* validate_memory.cpp */,
-				A94A68E022B17BBB00C661C6 /* validate_image.cpp */,
-				A94A68E122B17BBB00C661C6 /* validate_literals.cpp */,
-				A94A68E222B17BBB00C661C6 /* instruction.cpp */,
-				A94A68E322B17BBB00C661C6 /* validate_type.cpp */,
-				A94A68E422B17BBB00C661C6 /* instruction.h */,
-				A94A68E522B17BBB00C661C6 /* validate_execution_limitations.cpp */,
-				A94A68E622B17BBB00C661C6 /* validate_layout.cpp */,
-				A94A68E722B17BBB00C661C6 /* basic_block.cpp */,
-				A94A68E822B17BBB00C661C6 /* validate_function.cpp */,
-				A94A68E922B17BBB00C661C6 /* function.h */,
-				A94A68EA22B17BBB00C661C6 /* validate_composites.cpp */,
-				A94A68EB22B17BBB00C661C6 /* validation_state.cpp */,
-				A94A68EC22B17BBB00C661C6 /* validate_primitives.cpp */,
-				A94A68ED22B17BBB00C661C6 /* decoration.h */,
-			);
-			path = val;
-			sourceTree = "<group>";
-		};
 		A9679AAB21D2699800856BF7 /* Scripts */ = {
 			isa = PBXGroup;
 			children = (
@@ -2038,7 +1604,7 @@
 		A972A82421CECC410013AB25 /* SPIRV-Tools */ = {
 			isa = PBXGroup;
 			children = (
-				A94A673D22B17BBB00C661C6 /* source */,
+				A9C2EF7722E7833C001763CE /* source */,
 			);
 			name = "SPIRV-Tools";
 			path = "glslang/External/spirv-tools";
@@ -2263,6 +1829,436 @@
 			path = "SPIRV-Cross";
 			sourceTree = "<group>";
 		};
+		A9C2EF7722E7833C001763CE /* source */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2EF7822E7833C001763CE /* spirv_target_env.cpp */,
+				A9C2EF7922E7833C001763CE /* extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json */,
+				A9C2EF7A22E7833C001763CE /* spirv_fuzzer_options.h */,
+				A9C2EF7B22E7833C001763CE /* assembly_grammar.h */,
+				A9C2EF7C22E7833C001763CE /* enum_set.h */,
+				A9C2EF7D22E7833C001763CE /* CMakeLists.txt */,
+				A9C2EF7E22E7833C001763CE /* extinst.spv-amd-shader-ballot.grammar.json */,
+				A9C2EF7F22E7833C001763CE /* text.cpp */,
+				A9C2EF8022E7833C001763CE /* assembly_grammar.cpp */,
+				A9C2EF8122E7833C001763CE /* text.h */,
+				A9C2EF8222E7833C001763CE /* extensions.cpp */,
+				A9C2EF8322E7833C001763CE /* pch_source.cpp */,
+				A9C2EF8422E7833C001763CE /* util */,
+				A9C2EF9322E7833C001763CE /* spirv_target_env.h */,
+				A9C2EF9422E7833C001763CE /* table.cpp */,
+				A9C2EF9522E7833C001763CE /* reduce */,
+				A9C2EFCE22E7833C001763CE /* latest_version_opencl_std_header.h */,
+				A9C2EFCF22E7833C001763CE /* spirv_optimizer_options.cpp */,
+				A9C2EFD022E7833C001763CE /* cfa.h */,
+				A9C2EFD122E7833C001763CE /* pch_source.h */,
+				A9C2EFD222E7833C001763CE /* enum_string_mapping.h */,
+				A9C2EFD322E7833C001763CE /* spirv_fuzzer_options.cpp */,
+				A9C2EFD422E7833C001763CE /* spirv_reducer_options.h */,
+				A9C2EFD522E7833C001763CE /* spirv_validator_options.cpp */,
+				A9C2EFD622E7833C001763CE /* extinst.spv-amd-shader-trinary-minmax.grammar.json */,
+				A9C2EFD722E7833C001763CE /* print.cpp */,
+				A9C2EFD822E7833C001763CE /* spirv_definition.h */,
+				A9C2EFD922E7833C001763CE /* operand.h */,
+				A9C2EFDA22E7833C001763CE /* spirv_endian.cpp */,
+				A9C2EFDB22E7833C001763CE /* macro.h */,
+				A9C2EFDC22E7833C001763CE /* spirv_constant.h */,
+				A9C2EFDD22E7833C001763CE /* extinst.spv-amd-gcn-shader.grammar.json */,
+				A9C2EFDE22E7833C001763CE /* binary.cpp */,
+				A9C2EFDF22E7833C001763CE /* spirv_validator_options.h */,
+				A9C2EFE022E7833C001763CE /* enum_string_mapping.cpp */,
+				A9C2EFE122E7833C001763CE /* text_handler.h */,
+				A9C2EFE222E7833C001763CE /* parsed_operand.h */,
+				A9C2EFE322E7833C001763CE /* name_mapper.h */,
+				A9C2EFE422E7833C001763CE /* spirv_reducer_options.cpp */,
+				A9C2EFE522E7833C001763CE /* parsed_operand.cpp */,
+				A9C2EFE622E7833C001763CE /* diagnostic.h */,
+				A9C2EFE722E7833C001763CE /* spirv_endian.h */,
+				A9C2EFE822E7833C001763CE /* name_mapper.cpp */,
+				A9C2EFE922E7833C001763CE /* extinst.debuginfo.grammar.json */,
+				A9C2EFEA22E7833C001763CE /* link */,
+				A9C2EFED22E7833C001763CE /* software_version.cpp */,
+				A9C2EFEE22E7833C001763CE /* opcode.cpp */,
+				A9C2EFEF22E7833C001763CE /* print.h */,
+				A9C2EFF022E7833C001763CE /* ext_inst.cpp */,
+				A9C2EFF122E7833C001763CE /* disassemble.h */,
+				A9C2EFF222E7833C001763CE /* opt */,
+				A9C2F0BB22E7833C001763CE /* table.h */,
+				A9C2F0F922E7833D001763CE /* ext_inst.h */,
+				A9C2F0FA22E7833D001763CE /* diagnostic.cpp */,
+				A9C2F0FB22E7833D001763CE /* latest_version_spirv_header.h */,
+				A9C2F0FC22E7833D001763CE /* libspirv.cpp */,
+				A9C2F0FD22E7833D001763CE /* instruction.h */,
+				A9C2F0FE22E7833D001763CE /* spirv_optimizer_options.h */,
+				A9C2F0FF22E7833D001763CE /* opcode.h */,
+				A9C2F10022E7833D001763CE /* operand.cpp */,
+				A9C2F10122E7833D001763CE /* latest_version_glsl_std_450_header.h */,
+				A9C2F10222E7833D001763CE /* extensions.h */,
+				A9C2F10322E7833D001763CE /* disassemble.cpp */,
+				A9C2F10422E7833D001763CE /* binary.h */,
+				A9C2F10522E7833D001763CE /* text_handler.cpp */,
+				A9C2F10622E7833D001763CE /* val */,
+			);
+			path = source;
+			sourceTree = "<group>";
+		};
+		A9C2EF8422E7833C001763CE /* util */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2EF8522E7833C001763CE /* parse_number.h */,
+				A9C2EF8622E7833C001763CE /* ilist_node.h */,
+				A9C2EF8722E7833C001763CE /* make_unique.h */,
+				A9C2EF8822E7833C001763CE /* string_utils.h */,
+				A9C2EF8922E7833C001763CE /* small_vector.h */,
+				A9C2EF8A22E7833C001763CE /* timer.cpp */,
+				A9C2EF8B22E7833C001763CE /* timer.h */,
+				A9C2EF8C22E7833C001763CE /* string_utils.cpp */,
+				A9C2EF8D22E7833C001763CE /* bit_vector.h */,
+				A9C2EF8E22E7833C001763CE /* bitutils.h */,
+				A9C2EF8F22E7833C001763CE /* hex_float.h */,
+				A9C2EF9022E7833C001763CE /* parse_number.cpp */,
+				A9C2EF9122E7833C001763CE /* bit_vector.cpp */,
+				A9C2EF9222E7833C001763CE /* ilist.h */,
+			);
+			path = util;
+			sourceTree = "<group>";
+		};
+		A9C2EF9522E7833C001763CE /* reduce */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2EF9622E7833C001763CE /* operand_to_undef_reduction_opportunity_finder.h */,
+				A9C2EF9722E7833C001763CE /* remove_selection_reduction_opportunity.cpp */,
+				A9C2EF9822E7833C001763CE /* remove_block_reduction_opportunity.h */,
+				A9C2EF9922E7833C001763CE /* operand_to_dominating_id_reduction_opportunity_finder.h */,
+				A9C2EF9A22E7833C001763CE /* reduction_pass.cpp */,
+				A9C2EF9B22E7833C001763CE /* operand_to_const_reduction_opportunity_finder.cpp */,
+				A9C2EF9C22E7833C001763CE /* operand_to_const_reduction_opportunity_finder.h */,
+				A9C2EF9D22E7833C001763CE /* CMakeLists.txt */,
+				A9C2EF9E22E7833C001763CE /* reduction_util.cpp */,
+				A9C2EF9F22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity_finder.cpp */,
+				A9C2EFA022E7833C001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.h */,
+				A9C2EFA122E7833C001763CE /* remove_function_reduction_opportunity_finder.cpp */,
+				A9C2EFA222E7833C001763CE /* remove_instruction_reduction_opportunity.h */,
+				A9C2EFA322E7833C001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h */,
+				A9C2EFA422E7833C001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.cpp */,
+				A9C2EFA522E7833C001763CE /* remove_function_reduction_opportunity.cpp */,
+				A9C2EFA622E7833C001763CE /* remove_opname_instruction_reduction_opportunity_finder.h */,
+				A9C2EFA722E7833C001763CE /* simple_conditional_branch_to_branch_opportunity_finder.cpp */,
+				A9C2EFA822E7833C001763CE /* remove_selection_reduction_opportunity_finder.cpp */,
+				A9C2EFA922E7833C001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp */,
+				A9C2EFAA22E7833C001763CE /* simple_conditional_branch_to_branch_opportunity_finder.h */,
+				A9C2EFAB22E7833C001763CE /* merge_blocks_reduction_opportunity.cpp */,
+				A9C2EFAC22E7833C001763CE /* change_operand_reduction_opportunity.cpp */,
+				A9C2EFAD22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity.h */,
+				A9C2EFAE22E7833C001763CE /* remove_function_reduction_opportunity.h */,
+				A9C2EFAF22E7833C001763CE /* change_operand_to_undef_reduction_opportunity.h */,
+				A9C2EFB022E7833C001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp */,
+				A9C2EFB122E7833C001763CE /* structured_loop_to_selection_reduction_opportunity_finder.h */,
+				A9C2EFB222E7833C001763CE /* remove_selection_reduction_opportunity.h */,
+				A9C2EFB322E7833C001763CE /* remove_instruction_reduction_opportunity.cpp */,
+				A9C2EFB422E7833C001763CE /* remove_selection_reduction_opportunity_finder.h */,
+				A9C2EFB522E7833C001763CE /* merge_blocks_reduction_opportunity_finder.h */,
+				A9C2EFB622E7833C001763CE /* remove_opname_instruction_reduction_opportunity_finder.cpp */,
+				A9C2EFB722E7833C001763CE /* pch_source_reduce.cpp */,
+				A9C2EFB822E7833C001763CE /* reducer.cpp */,
+				A9C2EFB922E7833C001763CE /* operand_to_undef_reduction_opportunity_finder.cpp */,
+				A9C2EFBA22E7833C001763CE /* remove_function_reduction_opportunity_finder.h */,
+				A9C2EFBB22E7833C001763CE /* pch_source_reduce.h */,
+				A9C2EFBC22E7833C001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.h */,
+				A9C2EFBD22E7833C001763CE /* merge_blocks_reduction_opportunity_finder.cpp */,
+				A9C2EFBE22E7833C001763CE /* reduction_opportunity.cpp */,
+				A9C2EFBF22E7833C001763CE /* reducer.h */,
+				A9C2EFC022E7833C001763CE /* change_operand_to_undef_reduction_opportunity.cpp */,
+				A9C2EFC122E7833C001763CE /* reduction_opportunity.h */,
+				A9C2EFC222E7833C001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h */,
+				A9C2EFC322E7833C001763CE /* operand_to_dominating_id_reduction_opportunity_finder.cpp */,
+				A9C2EFC422E7833C001763CE /* reduction_opportunity_finder.h */,
+				A9C2EFC522E7833C001763CE /* change_operand_reduction_opportunity.h */,
+				A9C2EFC622E7833C001763CE /* remove_block_reduction_opportunity_finder.h */,
+				A9C2EFC722E7833C001763CE /* remove_block_reduction_opportunity_finder.cpp */,
+				A9C2EFC822E7833C001763CE /* reduction_util.h */,
+				A9C2EFC922E7833C001763CE /* merge_blocks_reduction_opportunity.h */,
+				A9C2EFCA22E7833C001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp */,
+				A9C2EFCB22E7833C001763CE /* structured_loop_to_selection_reduction_opportunity.cpp */,
+				A9C2EFCC22E7833C001763CE /* remove_block_reduction_opportunity.cpp */,
+				A9C2EFCD22E7833C001763CE /* reduction_pass.h */,
+			);
+			path = reduce;
+			sourceTree = "<group>";
+		};
+		A9C2EFEA22E7833C001763CE /* link */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2EFEB22E7833C001763CE /* CMakeLists.txt */,
+				A9C2EFEC22E7833C001763CE /* linker.cpp */,
+			);
+			path = link;
+			sourceTree = "<group>";
+		};
+		A9C2EFF222E7833C001763CE /* opt */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2EFF322E7833C001763CE /* optimizer.cpp */,
+				A9C2EFF422E7833C001763CE /* if_conversion.h */,
+				A9C2EFF522E7833C001763CE /* register_pressure.cpp */,
+				A9C2EFF622E7833C001763CE /* loop_utils.cpp */,
+				A9C2EFF722E7833C001763CE /* merge_return_pass.h */,
+				A9C2EFF822E7833C001763CE /* inline_opaque_pass.h */,
+				A9C2EFF922E7833C001763CE /* loop_fusion.h */,
+				A9C2EFFA22E7833C001763CE /* combine_access_chains.cpp */,
+				A9C2EFFB22E7833C001763CE /* build_module.cpp */,
+				A9C2EFFC22E7833C001763CE /* composite.h */,
+				A9C2EFFD22E7833C001763CE /* compact_ids_pass.h */,
+				A9C2EFFE22E7833C001763CE /* register_pressure.h */,
+				A9C2EFFF22E7833C001763CE /* tree_iterator.h */,
+				A9C2F00022E7833C001763CE /* strip_atomic_counter_memory_pass.h */,
+				A9C2F00122E7833C001763CE /* legalize_vector_shuffle_pass.h */,
+				A9C2F00222E7833C001763CE /* local_single_store_elim_pass.h */,
+				A9C2F00322E7833C001763CE /* reduce_load_size.h */,
+				A9C2F00422E7833C001763CE /* code_sink.cpp */,
+				A9C2F00522E7833C001763CE /* types.cpp */,
+				A9C2F00622E7833C001763CE /* scalar_analysis.h */,
+				A9C2F00722E7833C001763CE /* strip_debug_info_pass.h */,
+				A9C2F00822E7833C001763CE /* cfg.cpp */,
+				A9C2F00922E7833C001763CE /* strip_atomic_counter_memory_pass.cpp */,
+				A9C2F00A22E7833C001763CE /* decoration_manager.cpp */,
+				A9C2F00B22E7833C001763CE /* local_single_block_elim_pass.cpp */,
+				A9C2F00C22E7833C001763CE /* freeze_spec_constant_value_pass.cpp */,
+				A9C2F00D22E7833C001763CE /* replace_invalid_opc.h */,
+				A9C2F00E22E7833C001763CE /* local_access_chain_convert_pass.h */,
+				A9C2F00F22E7833C001763CE /* inst_bindless_check_pass.cpp */,
+				A9C2F01022E7833C001763CE /* local_redundancy_elimination.cpp */,
+				A9C2F01122E7833C001763CE /* CMakeLists.txt */,
+				A9C2F01222E7833C001763CE /* instrument_pass.cpp */,
+				A9C2F01322E7833C001763CE /* propagator.h */,
+				A9C2F01422E7833C001763CE /* instruction_list.h */,
+				A9C2F01522E7833C001763CE /* feature_manager.cpp */,
+				A9C2F01622E7833C001763CE /* pass.cpp */,
+				A9C2F01722E7833C001763CE /* loop_fission.cpp */,
+				A9C2F01822E7833C001763CE /* dominator_tree.cpp */,
+				A9C2F01922E7833C001763CE /* merge_return_pass.cpp */,
+				A9C2F01A22E7833C001763CE /* ir_context.h */,
+				A9C2F01B22E7833C001763CE /* eliminate_dead_constant_pass.cpp */,
+				A9C2F01C22E7833C001763CE /* cfg_cleanup_pass.cpp */,
+				A9C2F01D22E7833C001763CE /* const_folding_rules.cpp */,
+				A9C2F01E22E7833C001763CE /* loop_unroller.h */,
+				A9C2F01F22E7833C001763CE /* strip_debug_info_pass.cpp */,
+				A9C2F02022E7833C001763CE /* ssa_rewrite_pass.cpp */,
+				A9C2F02122E7833C001763CE /* loop_dependence.cpp */,
+				A9C2F02222E7833C001763CE /* unify_const_pass.h */,
+				A9C2F02322E7833C001763CE /* ir_loader.h */,
+				A9C2F02422E7833C001763CE /* types.h */,
+				A9C2F02522E7833C001763CE /* fold_spec_constant_op_and_composite_pass.h */,
+				A9C2F02622E7833C001763CE /* mem_pass.cpp */,
+				A9C2F02722E7833C001763CE /* basic_block.h */,
+				A9C2F02822E7833C001763CE /* remove_duplicates_pass.cpp */,
+				A9C2F02922E7833C001763CE /* dead_variable_elimination.cpp */,
+				A9C2F02A22E7833C001763CE /* block_merge_pass.h */,
+				A9C2F02B22E7833C001763CE /* module.cpp */,
+				A9C2F02C22E7833C001763CE /* fold_spec_constant_op_and_composite_pass.cpp */,
+				A9C2F02D22E7833C001763CE /* loop_unswitch_pass.cpp */,
+				A9C2F02E22E7833C001763CE /* unify_const_pass.cpp */,
+				A9C2F02F22E7833C001763CE /* type_manager.cpp */,
+				A9C2F03022E7833C001763CE /* generate_webgpu_initializers_pass.cpp */,
+				A9C2F03122E7833C001763CE /* private_to_local_pass.h */,
+				A9C2F03222E7833C001763CE /* inline_pass.cpp */,
+				A9C2F03322E7833C001763CE /* def_use_manager.h */,
+				A9C2F03422E7833C001763CE /* ir_loader.cpp */,
+				A9C2F03522E7833C001763CE /* cfg_cleanup_pass.h */,
+				A9C2F03622E7833C001763CE /* licm_pass.cpp */,
+				A9C2F03722E7833C001763CE /* eliminate_dead_functions_pass.cpp */,
+				A9C2F03822E7833C001763CE /* local_redundancy_elimination.h */,
+				A9C2F03922E7833C001763CE /* split_invalid_unreachable_pass.cpp */,
+				A9C2F03A22E7833C001763CE /* loop_peeling.h */,
+				A9C2F03B22E7833C001763CE /* vector_dce.cpp */,
+				A9C2F03C22E7833C001763CE /* block_merge_util.h */,
+				A9C2F03D22E7833C001763CE /* loop_unroller.cpp */,
+				A9C2F03E22E7833C001763CE /* constants.cpp */,
+				A9C2F03F22E7833C001763CE /* loop_fusion_pass.h */,
+				A9C2F04022E7833C001763CE /* struct_cfg_analysis.h */,
+				A9C2F04122E7833C001763CE /* def_use_manager.cpp */,
+				A9C2F04222E7833C001763CE /* strip_reflect_info_pass.cpp */,
+				A9C2F04322E7833C001763CE /* decoration_manager.h */,
+				A9C2F04422E7833C001763CE /* ccp_pass.cpp */,
+				A9C2F04522E7833C001763CE /* process_lines_pass.h */,
+				A9C2F04622E7833C001763CE /* local_single_block_elim_pass.h */,
+				A9C2F04722E7833C001763CE /* pch_source_opt.cpp */,
+				A9C2F04822E7833C001763CE /* strength_reduction_pass.h */,
+				A9C2F04922E7833C001763CE /* aggressive_dead_code_elim_pass.cpp */,
+				A9C2F04A22E7833C001763CE /* eliminate_dead_functions_util.cpp */,
+				A9C2F04B22E7833C001763CE /* simplification_pass.cpp */,
+				A9C2F04C22E7833C001763CE /* dead_branch_elim_pass.cpp */,
+				A9C2F04D22E7833C001763CE /* flatten_decoration_pass.cpp */,
+				A9C2F04E22E7833C001763CE /* dead_insert_elim_pass.h */,
+				A9C2F04F22E7833C001763CE /* folding_rules.cpp */,
+				A9C2F05022E7833C001763CE /* freeze_spec_constant_value_pass.h */,
+				A9C2F05122E7833C001763CE /* ir_context.cpp */,
+				A9C2F05222E7833C001763CE /* instrument_pass.h */,
+				A9C2F05322E7833C001763CE /* mem_pass.h */,
+				A9C2F05422E7833C001763CE /* loop_descriptor.cpp */,
+				A9C2F05522E7833C001763CE /* local_ssa_elim_pass.cpp */,
+				A9C2F05622E7833C001763CE /* eliminate_dead_members_pass.h */,
+				A9C2F05722E7833C001763CE /* function.cpp */,
+				A9C2F05822E7833C001763CE /* instruction_list.cpp */,
+				A9C2F05922E7833C001763CE /* composite.cpp */,
+				A9C2F05A22E7833C001763CE /* process_lines_pass.cpp */,
+				A9C2F05B22E7833C001763CE /* inline_pass.h */,
+				A9C2F05C22E7833C001763CE /* loop_dependence.h */,
+				A9C2F05D22E7833C001763CE /* value_number_table.h */,
+				A9C2F05E22E7833C001763CE /* flatten_decoration_pass.h */,
+				A9C2F05F22E7833C001763CE /* if_conversion.cpp */,
+				A9C2F06022E7833C001763CE /* inline_exhaustive_pass.h */,
+				A9C2F06122E7833C001763CE /* constants.h */,
+				A9C2F06222E7833C001763CE /* eliminate_dead_members_pass.cpp */,
+				A9C2F06322E7833C001763CE /* strength_reduction_pass.cpp */,
+				A9C2F06422E7833C001763CE /* block_merge_util.cpp */,
+				A9C2F06522E7833C001763CE /* upgrade_memory_model.h */,
+				A9C2F06622E7833C001763CE /* copy_prop_arrays.cpp */,
+				A9C2F06722E7833C001763CE /* pass_manager.cpp */,
+				A9C2F06822E7833C001763CE /* inline_exhaustive_pass.cpp */,
+				A9C2F06922E7833C001763CE /* loop_fission.h */,
+				A9C2F06A22E7833C001763CE /* workaround1209.h */,
+				A9C2F06B22E7833C001763CE /* loop_fusion_pass.cpp */,
+				A9C2F06C22E7833C001763CE /* log.h */,
+				A9C2F06D22E7833C001763CE /* split_invalid_unreachable_pass.h */,
+				A9C2F06E22E7833C001763CE /* copy_prop_arrays.h */,
+				A9C2F06F22E7833C001763CE /* eliminate_dead_constant_pass.h */,
+				A9C2F07022E7833C001763CE /* dead_insert_elim_pass.cpp */,
+				A9C2F07122E7833C001763CE /* ssa_rewrite_pass.h */,
+				A9C2F07222E7833C001763CE /* scalar_analysis.cpp */,
+				A9C2F07322E7833C001763CE /* dead_variable_elimination.h */,
+				A9C2F07422E7833C001763CE /* block_merge_pass.cpp */,
+				A9C2F07522E7833C001763CE /* dominator_analysis.h */,
+				A9C2F07622E7833C001763CE /* pass.h */,
+				A9C2F07722E7833C001763CE /* folding_rules.h */,
+				A9C2F07822E7833C001763CE /* eliminate_dead_functions_pass.h */,
+				A9C2F07922E7833C001763CE /* eliminate_dead_functions_util.h */,
+				A9C2F07A22E7833C001763CE /* fold.h */,
+				A9C2F07B22E7833C001763CE /* local_single_store_elim_pass.cpp */,
+				A9C2F07C22E7833C001763CE /* dead_branch_elim_pass.h */,
+				A9C2F07D22E7833C001763CE /* private_to_local_pass.cpp */,
+				A9C2F07E22E7833C001763CE /* scalar_analysis_nodes.h */,
+				A9C2F07F22E7833C001763CE /* propagator.cpp */,
+				A9C2F08022E7833C001763CE /* fix_storage_class.h */,
+				A9C2F08122E7833C001763CE /* loop_dependence_helpers.cpp */,
+				A9C2F08222E7833C001763CE /* set_spec_constant_default_value_pass.cpp */,
+				A9C2F08322E7833C001763CE /* passes.h */,
+				A9C2F08422E7833C001763CE /* fold.cpp */,
+				A9C2F08522E7833C001763CE /* strip_reflect_info_pass.h */,
+				A9C2F08622E7833C001763CE /* scalar_replacement_pass.cpp */,
+				A9C2F08722E7833C001763CE /* simplification_pass.h */,
+				A9C2F08822E7833C001763CE /* remove_duplicates_pass.h */,
+				A9C2F08922E7833C001763CE /* redundancy_elimination.cpp */,
+				A9C2F08A22E7833C001763CE /* reflect.h */,
+				A9C2F08B22E7833C001763CE /* workaround1209.cpp */,
+				A9C2F08C22E7833C001763CE /* null_pass.h */,
+				A9C2F08D22E7833C001763CE /* const_folding_rules.h */,
+				A9C2F08E22E7833C001763CE /* scalar_replacement_pass.h */,
+				A9C2F08F22E7833C001763CE /* instruction.cpp */,
+				A9C2F09022E7833C001763CE /* pch_source_opt.h */,
+				A9C2F09122E7833C001763CE /* reduce_load_size.cpp */,
+				A9C2F09222E7833C001763CE /* redundancy_elimination.h */,
+				A9C2F09322E7833C001763CE /* fix_storage_class.cpp */,
+				A9C2F09422E7833C001763CE /* value_number_table.cpp */,
+				A9C2F09522E7833C001763CE /* local_ssa_elim_pass.h */,
+				A9C2F09622E7833C001763CE /* inline_opaque_pass.cpp */,
+				A9C2F09722E7833C001763CE /* replace_invalid_opc.cpp */,
+				A9C2F09822E7833C001763CE /* loop_utils.h */,
+				A9C2F09922E7833C001763CE /* module.h */,
+				A9C2F09A22E7833C001763CE /* dominator_analysis.cpp */,
+				A9C2F09B22E7833C001763CE /* decompose_initialized_variables_pass.cpp */,
+				A9C2F09C22E7833C001763CE /* ir_builder.h */,
+				A9C2F09D22E7833C001763CE /* loop_unswitch_pass.h */,
+				A9C2F09E22E7833C001763CE /* cfg.h */,
+				A9C2F09F22E7833C001763CE /* code_sink.h */,
+				A9C2F0A022E7833C001763CE /* loop_descriptor.h */,
+				A9C2F0A122E7833C001763CE /* generate_webgpu_initializers_pass.h */,
+				A9C2F0A222E7833C001763CE /* instruction.h */,
+				A9C2F0A322E7833C001763CE /* aggressive_dead_code_elim_pass.h */,
+				A9C2F0A422E7833C001763CE /* struct_cfg_analysis.cpp */,
+				A9C2F0A522E7833C001763CE /* vector_dce.h */,
+				A9C2F0A622E7833C001763CE /* combine_access_chains.h */,
+				A9C2F0A722E7833C001763CE /* pass_manager.h */,
+				A9C2F0A822E7833C001763CE /* local_access_chain_convert_pass.cpp */,
+				A9C2F0A922E7833C001763CE /* basic_block.cpp */,
+				A9C2F0AA22E7833C001763CE /* iterator.h */,
+				A9C2F0AB22E7833C001763CE /* licm_pass.h */,
+				A9C2F0AC22E7833C001763CE /* build_module.h */,
+				A9C2F0AD22E7833C001763CE /* ccp_pass.h */,
+				A9C2F0AE22E7833C001763CE /* decompose_initialized_variables_pass.h */,
+				A9C2F0AF22E7833C001763CE /* function.h */,
+				A9C2F0B022E7833C001763CE /* loop_fusion.cpp */,
+				A9C2F0B122E7833C001763CE /* upgrade_memory_model.cpp */,
+				A9C2F0B222E7833C001763CE /* feature_manager.h */,
+				A9C2F0B322E7833C001763CE /* inst_bindless_check_pass.h */,
+				A9C2F0B422E7833C001763CE /* scalar_analysis_simplification.cpp */,
+				A9C2F0B522E7833C001763CE /* set_spec_constant_default_value_pass.h */,
+				A9C2F0B622E7833C001763CE /* dominator_tree.h */,
+				A9C2F0B722E7833C001763CE /* legalize_vector_shuffle_pass.cpp */,
+				A9C2F0B822E7833C001763CE /* type_manager.h */,
+				A9C2F0B922E7833C001763CE /* compact_ids_pass.cpp */,
+				A9C2F0BA22E7833C001763CE /* loop_peeling.cpp */,
+			);
+			path = opt;
+			sourceTree = "<group>";
+		};
+		A9C2F10622E7833D001763CE /* val */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2F10722E7833D001763CE /* validate_annotation.cpp */,
+				A9C2F10822E7833D001763CE /* validate_misc.cpp */,
+				A9C2F10922E7833D001763CE /* validate_cfg.cpp */,
+				A9C2F10A22E7833D001763CE /* validate_capability.cpp */,
+				A9C2F10B22E7833D001763CE /* construct.h */,
+				A9C2F10C22E7833D001763CE /* validate_barriers.cpp */,
+				A9C2F10D22E7833D001763CE /* validate_non_uniform.cpp */,
+				A9C2F10E22E7833D001763CE /* validate_scopes.cpp */,
+				A9C2F10F22E7833D001763CE /* validate_atomics.cpp */,
+				A9C2F11022E7833D001763CE /* basic_block.h */,
+				A9C2F11122E7833D001763CE /* validate_instruction.cpp */,
+				A9C2F11222E7833D001763CE /* validate_decorations.cpp */,
+				A9C2F11322E7833D001763CE /* validate_debug.cpp */,
+				A9C2F11422E7833D001763CE /* validate_builtins.cpp */,
+				A9C2F11522E7833D001763CE /* validate_interfaces.cpp */,
+				A9C2F11622E7833D001763CE /* validate.cpp */,
+				A9C2F11722E7833D001763CE /* validation_state.h */,
+				A9C2F11822E7833D001763CE /* validate_constants.cpp */,
+				A9C2F11922E7833D001763CE /* validate_bitwise.cpp */,
+				A9C2F11A22E7833D001763CE /* validate_extensions.cpp */,
+				A9C2F11B22E7833D001763CE /* construct.cpp */,
+				A9C2F11C22E7833D001763CE /* function.cpp */,
+				A9C2F11D22E7833D001763CE /* validate.h */,
+				A9C2F11E22E7833D001763CE /* validate_adjacency.cpp */,
+				A9C2F11F22E7833D001763CE /* validate_conversion.cpp */,
+				A9C2F12022E7833D001763CE /* validate_small_type_uses.cpp */,
+				A9C2F12122E7833D001763CE /* validate_datarules.cpp */,
+				A9C2F12222E7833D001763CE /* validate_scopes.h */,
+				A9C2F12322E7833D001763CE /* validate_id.cpp */,
+				A9C2F12422E7833D001763CE /* validate_memory_semantics.h */,
+				A9C2F12522E7833D001763CE /* validate_arithmetics.cpp */,
+				A9C2F12622E7833D001763CE /* validate_mode_setting.cpp */,
+				A9C2F12722E7833D001763CE /* validate_memory_semantics.cpp */,
+				A9C2F12822E7833D001763CE /* validate_logicals.cpp */,
+				A9C2F12922E7833D001763CE /* validate_derivatives.cpp */,
+				A9C2F12A22E7833D001763CE /* validate_memory.cpp */,
+				A9C2F12B22E7833D001763CE /* validate_image.cpp */,
+				A9C2F12C22E7833D001763CE /* validate_literals.cpp */,
+				A9C2F12D22E7833D001763CE /* instruction.cpp */,
+				A9C2F12E22E7833D001763CE /* validate_type.cpp */,
+				A9C2F12F22E7833D001763CE /* instruction.h */,
+				A9C2F13022E7833D001763CE /* validate_execution_limitations.cpp */,
+				A9C2F13122E7833D001763CE /* validate_layout.cpp */,
+				A9C2F13222E7833D001763CE /* basic_block.cpp */,
+				A9C2F13322E7833D001763CE /* validate_function.cpp */,
+				A9C2F13422E7833D001763CE /* function.h */,
+				A9C2F13522E7833D001763CE /* validate_composites.cpp */,
+				A9C2F13622E7833D001763CE /* validation_state.cpp */,
+				A9C2F13722E7833D001763CE /* validate_primitives.cpp */,
+				A9C2F13822E7833D001763CE /* decoration.h */,
+			);
+			path = val;
+			sourceTree = "<group>";
+		};
 		A9F55D24198BE6A7004EC31B = {
 			isa = PBXGroup;
 			children = (
@@ -2281,187 +2277,186 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A94A6A2C22B17BBC00C661C6 /* types.h in Headers */,
-				A94A69F422B17BBC00C661C6 /* strip_debug_info_pass.h in Headers */,
-				A94A6AD422B17BBC00C661C6 /* folding_rules.h in Headers */,
-				A94A692022B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.h in Headers */,
-				A94A695422B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.h in Headers */,
-				A94A69F222B17BBC00C661C6 /* scalar_analysis.h in Headers */,
-				A94A6B0022B17BBC00C661C6 /* null_pass.h in Headers */,
-				A94A6A9E22B17BBC00C661C6 /* loop_dependence.h in Headers */,
-				A94A6B3222B17BBC00C661C6 /* vector_dce.h in Headers */,
-				A94A6A2A22B17BBC00C661C6 /* ir_loader.h in Headers */,
-				A94A6B5422B17BBC00C661C6 /* dominator_tree.h in Headers */,
-				A94A697A22B17BBB00C661C6 /* reduction_opportunity_finder.h in Headers */,
-				A94A6A8C22B17BBC00C661C6 /* mem_pass.h in Headers */,
-				A94A69CA22B17BBC00C661C6 /* disassemble.h in Headers */,
-				A94A693822B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h in Headers */,
-				A94A694622B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.h in Headers */,
-				A94A6A6222B17BBC00C661C6 /* loop_fusion_pass.h in Headers */,
-				A94A6A3222B17BBC00C661C6 /* basic_block.h in Headers */,
-				A94A69D422B17BBC00C661C6 /* merge_return_pass.h in Headers */,
-				A94A6B3422B17BBC00C661C6 /* combine_access_chains.h in Headers */,
-				A94A699A22B17BBB00C661C6 /* spirv_reducer_options.h in Headers */,
-				A94A69DE22B17BBC00C661C6 /* composite.h in Headers */,
-				A94A6AD022B17BBC00C661C6 /* dominator_analysis.h in Headers */,
-				A94A6AA222B17BBC00C661C6 /* flatten_decoration_pass.h in Headers */,
-				A94A69BC22B17BBB00C661C6 /* spirv_endian.h in Headers */,
-				A94A693E22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.h in Headers */,
-				A94A69A822B17BBB00C661C6 /* spirv_constant.h in Headers */,
-				A94A69CE22B17BBC00C661C6 /* if_conversion.h in Headers */,
-				A94A6B2C22B17BBC00C661C6 /* instruction.h in Headers */,
-				A94A696A22B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.h in Headers */,
-				A94A6B4022B17BBC00C661C6 /* build_module.h in Headers */,
-				A94A6BC622B17BBC00C661C6 /* binary.h in Headers */,
-				A94A691222B17BBB00C661C6 /* bitutils.h in Headers */,
-				A94A6A2022B17BBC00C661C6 /* loop_unroller.h in Headers */,
-				A94A6B2E22B17BBC00C661C6 /* aggressive_dead_code_elim_pass.h in Headers */,
-				A94A697E22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.h in Headers */,
-				A94A691C22B17BBB00C661C6 /* spirv_target_env.h in Headers */,
-				A94A69E622B17BBC00C661C6 /* strip_atomic_counter_memory_pass.h in Headers */,
-				A94A6B4222B17BBC00C661C6 /* ccp_pass.h in Headers */,
-				A94A6A8A22B17BBC00C661C6 /* instrument_pass.h in Headers */,
-				A94A6A6C22B17BBC00C661C6 /* decoration_manager.h in Headers */,
-				A94A6AC022B17BBC00C661C6 /* split_invalid_unreachable_pass.h in Headers */,
-				A94A6AC222B17BBC00C661C6 /* copy_prop_arrays.h in Headers */,
-				A94A6B2822B17BBC00C661C6 /* loop_descriptor.h in Headers */,
-				A94A6B3E22B17BBC00C661C6 /* licm_pass.h in Headers */,
-				A94A69D822B17BBC00C661C6 /* loop_fusion.h in Headers */,
-				A94A690422B17BBB00C661C6 /* make_unique.h in Headers */,
-				A94A6AD222B17BBC00C661C6 /* pass.h in Headers */,
-				A94A6A7222B17BBC00C661C6 /* local_single_block_elim_pass.h in Headers */,
-				A94A6A5822B17BBC00C661C6 /* loop_peeling.h in Headers */,
-				A94A694C22B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.h in Headers */,
-				A94A699222B17BBB00C661C6 /* cfa.h in Headers */,
-				A94A6A7622B17BBC00C661C6 /* strength_reduction_pass.h in Headers */,
-				A94A6A3822B17BBC00C661C6 /* block_merge_pass.h in Headers */,
-				A94A6B4E22B17BBC00C661C6 /* inst_bindless_check_pass.h in Headers */,
-				A94A69E222B17BBC00C661C6 /* register_pressure.h in Headers */,
-				A94A697422B17BBB00C661C6 /* reduction_opportunity.h in Headers */,
-				A94A6AFC22B17BBC00C661C6 /* reflect.h in Headers */,
-				A94A695A22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.h in Headers */,
-				A94A6B3622B17BBC00C661C6 /* pass_manager.h in Headers */,
-				A94A6A6422B17BBC00C661C6 /* struct_cfg_analysis.h in Headers */,
-				A94A698222B17BBB00C661C6 /* reduction_util.h in Headers */,
-				A94A69EA22B17BBC00C661C6 /* local_single_store_elim_pass.h in Headers */,
-				A94A6BB822B17BBC00C661C6 /* instruction.h in Headers */,
-				A94A693622B17BBB00C661C6 /* remove_instruction_reduction_opportunity.h in Headers */,
-				A94A6B4422B17BBC00C661C6 /* decompose_initialized_variables_pass.h in Headers */,
-				A94A6AE022B17BBC00C661C6 /* dead_branch_elim_pass.h in Headers */,
-				A94A6B0222B17BBC00C661C6 /* const_folding_rules.h in Headers */,
-				A94A68F222B17BBB00C661C6 /* assembly_grammar.h in Headers */,
-				A94A69BA22B17BBB00C661C6 /* diagnostic.h in Headers */,
-				A94A69A022B17BBB00C661C6 /* spirv_definition.h in Headers */,
-				A94A6B0C22B17BBC00C661C6 /* redundancy_elimination.h in Headers */,
-				A94A6A0C22B17BBC00C661C6 /* instruction_list.h in Headers */,
-				A94A6BFE22B17BBD00C661C6 /* validate_scopes.h in Headers */,
-				A94A6B5822B17BBC00C661C6 /* type_manager.h in Headers */,
-				A94A6AF822B17BBC00C661C6 /* remove_duplicates_pass.h in Headers */,
-				A94A6BBC22B17BBC00C661C6 /* opcode.h in Headers */,
-				A94A6AB822B17BBC00C661C6 /* loop_fission.h in Headers */,
-				A94A692422B17BBB00C661C6 /* remove_block_reduction_opportunity.h in Headers */,
-				A94A6AE822B17BBC00C661C6 /* fix_storage_class.h in Headers */,
-				A94A6AA822B17BBC00C661C6 /* constants.h in Headers */,
-				A94A69A622B17BBB00C661C6 /* macro.h in Headers */,
-				A94A6A0A22B17BBC00C661C6 /* propagator.h in Headers */,
-				A94A6A8222B17BBC00C661C6 /* dead_insert_elim_pass.h in Headers */,
-				A94A6A2E22B17BBC00C661C6 /* fold_spec_constant_op_and_composite_pass.h in Headers */,
-				A94A693222B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.h in Headers */,
-				A94A6ABE22B17BBC00C661C6 /* log.h in Headers */,
-				A94A6AB022B17BBC00C661C6 /* upgrade_memory_model.h in Headers */,
-				A94A69B422B17BBB00C661C6 /* name_mapper.h in Headers */,
-				A94A6BBA22B17BBC00C661C6 /* spirv_optimizer_options.h in Headers */,
-				A94A694E22B17BBB00C661C6 /* remove_function_reduction_opportunity.h in Headers */,
-				A94A69E422B17BBC00C661C6 /* tree_iterator.h in Headers */,
-				A94A6A9C22B17BBC00C661C6 /* inline_pass.h in Headers */,
-				A94A6B2422B17BBC00C661C6 /* cfg.h in Headers */,
-				A94A6AD622B17BBC00C661C6 /* eliminate_dead_functions_pass.h in Headers */,
-				A94A6BB422B17BBC00C661C6 /* latest_version_spirv_header.h in Headers */,
-				A94A6AC822B17BBC00C661C6 /* ssa_rewrite_pass.h in Headers */,
-				A94A6B0822B17BBC00C661C6 /* pch_source_opt.h in Headers */,
-				A94A6BC222B17BBC00C661C6 /* extensions.h in Headers */,
-				A94A6C2222B17BBD00C661C6 /* function.h in Headers */,
-				A94A690C22B17BBB00C661C6 /* timer.h in Headers */,
-				A94A695C22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.h in Headers */,
-				A94A69AC22B17BBB00C661C6 /* spirv_validator_options.h in Headers */,
-				A94A6BEA22B17BBC00C661C6 /* validation_state.h in Headers */,
-				A94A691A22B17BBB00C661C6 /* ilist.h in Headers */,
-				A94A6BDC22B17BBC00C661C6 /* basic_block.h in Headers */,
-				A94A6B3C22B17BBC00C661C6 /* iterator.h in Headers */,
-				A94A6AF222B17BBC00C661C6 /* strip_reflect_info_pass.h in Headers */,
-				A94A690822B17BBB00C661C6 /* small_vector.h in Headers */,
-				A94A691422B17BBB00C661C6 /* hex_float.h in Headers */,
-				A94A6B2022B17BBC00C661C6 /* ir_builder.h in Headers */,
-				A94A6A7022B17BBC00C661C6 /* process_lines_pass.h in Headers */,
-				A94A68FA22B17BBB00C661C6 /* text.h in Headers */,
-				A94A697C22B17BBB00C661C6 /* change_operand_reduction_opportunity.h in Headers */,
-				A94A6ADA22B17BBC00C661C6 /* eliminate_dead_functions_util.h in Headers */,
-				A94A6AF622B17BBC00C661C6 /* simplification_pass.h in Headers */,
-				A94A690622B17BBB00C661C6 /* string_utils.h in Headers */,
-				A94A698E22B17BBB00C661C6 /* latest_version_opencl_std_header.h in Headers */,
-				A94A6B2A22B17BBC00C661C6 /* generate_webgpu_initializers_pass.h in Headers */,
-				A94A6AC422B17BBC00C661C6 /* eliminate_dead_constant_pass.h in Headers */,
-				A94A697022B17BBB00C661C6 /* reducer.h in Headers */,
-				A94A69E822B17BBC00C661C6 /* legalize_vector_shuffle_pass.h in Headers */,
-				A94A6A5422B17BBC00C661C6 /* local_redundancy_elimination.h in Headers */,
-				A94A69E022B17BBC00C661C6 /* compact_ids_pass.h in Headers */,
-				A94A6B1A22B17BBC00C661C6 /* module.h in Headers */,
-				A94A696622B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.h in Headers */,
-				A94A6ABA22B17BBC00C661C6 /* workaround1209.h in Headers */,
-				A94A6B5E22B17BBC00C661C6 /* table.h in Headers */,
-				A94A696822B17BBB00C661C6 /* pch_source_reduce.h in Headers */,
-				A94A6AE422B17BBC00C661C6 /* scalar_analysis_nodes.h in Headers */,
-				A94A69B022B17BBB00C661C6 /* text_handler.h in Headers */,
-				A94A6B5222B17BBC00C661C6 /* set_spec_constant_default_value_pass.h in Headers */,
-				A94A699622B17BBB00C661C6 /* enum_string_mapping.h in Headers */,
-				A94A692622B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.h in Headers */,
-				A94A6A2822B17BBC00C661C6 /* unify_const_pass.h in Headers */,
-				A94A6B4622B17BBC00C661C6 /* function.h in Headers */,
-				A94A6AD822B17BBC00C661C6 /* common_uniform_elim_pass.h in Headers */,
-				A94A6C0222B17BBD00C661C6 /* validate_memory_semantics.h in Headers */,
-				A94A690022B17BBB00C661C6 /* parse_number.h in Headers */,
-				A94A6AA022B17BBC00C661C6 /* value_number_table.h in Headers */,
-				A94A6B1822B17BBC00C661C6 /* loop_utils.h in Headers */,
-				A94A6AEE22B17BBC00C661C6 /* passes.h in Headers */,
-				A94A6C2A22B17BBD00C661C6 /* decoration.h in Headers */,
-				A94A6BB022B17BBC00C661C6 /* ext_inst.h in Headers */,
-				A94A697622B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h in Headers */,
-				A94A6A0022B17BBC00C661C6 /* replace_invalid_opc.h in Headers */,
-				A94A6B4C22B17BBC00C661C6 /* feature_manager.h in Headers */,
-				A94A6BF622B17BBD00C661C6 /* validate.h in Headers */,
-				A94A6A5C22B17BBC00C661C6 /* block_merge_util.h in Headers */,
-				A94A6ADC22B17BBC00C661C6 /* fold.h in Headers */,
-				A94A6A8622B17BBC00C661C6 /* freeze_spec_constant_value_pass.h in Headers */,
-				A94A69EC22B17BBC00C661C6 /* reduce_load_size.h in Headers */,
-				A94A68F022B17BBB00C661C6 /* spirv_fuzzer_options.h in Headers */,
-				A94A6B0422B17BBC00C661C6 /* scalar_replacement_pass.h in Headers */,
-				A94A690222B17BBB00C661C6 /* ilist_node.h in Headers */,
-				A94A6C1822B17BBD00C661C6 /* instruction.h in Headers */,
-				A94A68F422B17BBB00C661C6 /* enum_set.h in Headers */,
-				A94A69B222B17BBB00C661C6 /* parsed_operand.h in Headers */,
-				A94A6A1822B17BBC00C661C6 /* ir_context.h in Headers */,
-				A94A6AA622B17BBC00C661C6 /* inline_exhaustive_pass.h in Headers */,
-				A94A6B1222B17BBC00C661C6 /* local_ssa_elim_pass.h in Headers */,
-				A94A6B2622B17BBC00C661C6 /* code_sink.h in Headers */,
-				A94A698422B17BBB00C661C6 /* merge_blocks_reduction_opportunity.h in Headers */,
-				A94A6A4A22B17BBC00C661C6 /* def_use_manager.h in Headers */,
-				A94A6A4E22B17BBC00C661C6 /* cfg_cleanup_pass.h in Headers */,
-				A94A69C622B17BBC00C661C6 /* print.h in Headers */,
-				A94A69D622B17BBC00C661C6 /* inline_opaque_pass.h in Headers */,
-				A94A695022B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.h in Headers */,
-				A94A6A0222B17BBC00C661C6 /* local_access_chain_convert_pass.h in Headers */,
-				A94A6BC022B17BBC00C661C6 /* latest_version_glsl_std_450_header.h in Headers */,
-				A94A69A222B17BBB00C661C6 /* operand.h in Headers */,
-				A94A6BD222B17BBC00C661C6 /* construct.h in Headers */,
-				A94A6ACC22B17BBC00C661C6 /* dead_variable_elimination.h in Headers */,
-				A94A692C22B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.h in Headers */,
-				A94A698C22B17BBB00C661C6 /* reduction_pass.h in Headers */,
-				A94A6B2222B17BBC00C661C6 /* loop_unswitch_pass.h in Headers */,
-				A94A695622B17BBB00C661C6 /* remove_selection_reduction_opportunity.h in Headers */,
-				A94A6A4622B17BBC00C661C6 /* private_to_local_pass.h in Headers */,
-				A94A691022B17BBB00C661C6 /* bit_vector.h in Headers */,
-				A94A6A9222B17BBC00C661C6 /* eliminate_dead_members_pass.h in Headers */,
-				A94A699422B17BBB00C661C6 /* pch_source.h in Headers */,
+				A9C2F37922E7833D001763CE /* vector_dce.h in Headers */,
+				A9C2F42B22E7833D001763CE /* latest_version_glsl_std_450_header.h in Headers */,
+				A9C2F27722E7833D001763CE /* types.h in Headers */,
+				A9C2F23F22E7833D001763CE /* strip_debug_info_pass.h in Headers */,
+				A9C2F31D22E7833D001763CE /* folding_rules.h in Headers */,
+				A9C2F16B22E7833D001763CE /* operand_to_undef_reduction_opportunity_finder.h in Headers */,
+				A9C2F48F22E7833D001763CE /* function.h in Headers */,
+				A9C2F38522E7833D001763CE /* licm_pass.h in Headers */,
+				A9C2F32B22E7833D001763CE /* scalar_analysis_nodes.h in Headers */,
+				A9C2F19F22E7833D001763CE /* structured_loop_to_selection_reduction_opportunity_finder.h in Headers */,
+				A9C2F23D22E7833D001763CE /* scalar_analysis.h in Headers */,
+				A9C2F2E722E7833D001763CE /* loop_dependence.h in Headers */,
+				A9C2F27522E7833D001763CE /* ir_loader.h in Headers */,
+				A9C2F1C522E7833D001763CE /* reduction_opportunity_finder.h in Headers */,
+				A9C2F42722E7833D001763CE /* opcode.h in Headers */,
+				A9C2F2D522E7833D001763CE /* mem_pass.h in Headers */,
+				A9C2F44722E7833D001763CE /* basic_block.h in Headers */,
+				A9C2F21522E7833D001763CE /* disassemble.h in Headers */,
+				A9C2F46F22E7833D001763CE /* validate_memory_semantics.h in Headers */,
+				A9C2F18322E7833D001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h in Headers */,
+				A9C2F34B22E7833D001763CE /* scalar_replacement_pass.h in Headers */,
+				A9C2F19122E7833D001763CE /* simple_conditional_branch_to_branch_opportunity_finder.h in Headers */,
+				A9C2F2AD22E7833D001763CE /* loop_fusion_pass.h in Headers */,
+				A9C2F49722E7833D001763CE /* decoration.h in Headers */,
+				A9C2F36122E7833D001763CE /* module.h in Headers */,
+				A9C2F27D22E7833D001763CE /* basic_block.h in Headers */,
+				A9C2F43122E7833D001763CE /* binary.h in Headers */,
+				A9C2F37522E7833D001763CE /* aggressive_dead_code_elim_pass.h in Headers */,
+				A9C2F37D22E7833D001763CE /* pass_manager.h in Headers */,
+				A9C2F21F22E7833D001763CE /* merge_return_pass.h in Headers */,
+				A9C2F1E522E7833D001763CE /* spirv_reducer_options.h in Headers */,
+				A9C2F22922E7833D001763CE /* composite.h in Headers */,
+				A9C2F31922E7833D001763CE /* dominator_analysis.h in Headers */,
+				A9C2F38922E7833D001763CE /* ccp_pass.h in Headers */,
+				A9C2F2EB22E7833D001763CE /* flatten_decoration_pass.h in Headers */,
+				A9C2F20722E7833D001763CE /* spirv_endian.h in Headers */,
+				A9C2F18922E7833D001763CE /* remove_opname_instruction_reduction_opportunity_finder.h in Headers */,
+				A9C2F1F322E7833D001763CE /* spirv_constant.h in Headers */,
+				A9C2F21922E7833D001763CE /* if_conversion.h in Headers */,
+				A9C2F1B522E7833D001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.h in Headers */,
+				A9C2F15D22E7833D001763CE /* bitutils.h in Headers */,
+				A9C2F26B22E7833D001763CE /* loop_unroller.h in Headers */,
+				A9C2F1C922E7833D001763CE /* remove_block_reduction_opportunity_finder.h in Headers */,
+				A9C2F16722E7833D001763CE /* spirv_target_env.h in Headers */,
+				A9C2F36D22E7833D001763CE /* code_sink.h in Headers */,
+				A9C2F23122E7833D001763CE /* strip_atomic_counter_memory_pass.h in Headers */,
+				A9C2F2D322E7833D001763CE /* instrument_pass.h in Headers */,
+				A9C2F38722E7833D001763CE /* build_module.h in Headers */,
+				A9C2F42D22E7833D001763CE /* extensions.h in Headers */,
+				A9C2F48522E7833D001763CE /* instruction.h in Headers */,
+				A9C2F32F22E7833D001763CE /* fix_storage_class.h in Headers */,
+				A9C2F36722E7833D001763CE /* ir_builder.h in Headers */,
+				A9C2F2B522E7833D001763CE /* decoration_manager.h in Headers */,
+				A9C2F33922E7833D001763CE /* strip_reflect_info_pass.h in Headers */,
+				A9C2F38322E7833D001763CE /* iterator.h in Headers */,
+				A9C2F38B22E7833D001763CE /* decompose_initialized_variables_pass.h in Headers */,
+				A9C2F34722E7833D001763CE /* null_pass.h in Headers */,
+				A9C2F30922E7833D001763CE /* split_invalid_unreachable_pass.h in Headers */,
+				A9C2F30B22E7833D001763CE /* copy_prop_arrays.h in Headers */,
+				A9C2F22322E7833D001763CE /* loop_fusion.h in Headers */,
+				A9C2F3A522E7833D001763CE /* table.h in Headers */,
+				A9C2F14F22E7833D001763CE /* make_unique.h in Headers */,
+				A9C2F31B22E7833D001763CE /* pass.h in Headers */,
+				A9C2F2BB22E7833D001763CE /* local_single_block_elim_pass.h in Headers */,
+				A9C2F2A322E7833D001763CE /* loop_peeling.h in Headers */,
+				A9C2F19722E7833D001763CE /* structured_loop_to_selection_reduction_opportunity.h in Headers */,
+				A9C2F1DD22E7833D001763CE /* cfa.h in Headers */,
+				A9C2F2BF22E7833D001763CE /* strength_reduction_pass.h in Headers */,
+				A9C2F28322E7833D001763CE /* block_merge_pass.h in Headers */,
+				A9C2F33522E7833D001763CE /* passes.h in Headers */,
+				A9C2F46122E7833D001763CE /* validate.h in Headers */,
+				A9C2F22D22E7833D001763CE /* register_pressure.h in Headers */,
+				A9C2F1BF22E7833D001763CE /* reduction_opportunity.h in Headers */,
+				A9C2F1A522E7833D001763CE /* remove_selection_reduction_opportunity_finder.h in Headers */,
+				A9C2F2AF22E7833D001763CE /* struct_cfg_analysis.h in Headers */,
+				A9C2F1CD22E7833D001763CE /* reduction_util.h in Headers */,
+				A9C2F23522E7833D001763CE /* local_single_store_elim_pass.h in Headers */,
+				A9C2F18122E7833D001763CE /* remove_instruction_reduction_opportunity.h in Headers */,
+				A9C2F13D22E7833D001763CE /* assembly_grammar.h in Headers */,
+				A9C2F20522E7833D001763CE /* diagnostic.h in Headers */,
+				A9C2F45522E7833D001763CE /* validation_state.h in Headers */,
+				A9C2F1EB22E7833D001763CE /* spirv_definition.h in Headers */,
+				A9C2F34F22E7833D001763CE /* pch_source_opt.h in Headers */,
+				A9C2F25722E7833D001763CE /* instruction_list.h in Headers */,
+				A9C2F30122E7833D001763CE /* loop_fission.h in Headers */,
+				A9C2F16F22E7833D001763CE /* remove_block_reduction_opportunity.h in Headers */,
+				A9C2F39522E7833D001763CE /* inst_bindless_check_pass.h in Headers */,
+				A9C2F2F122E7833D001763CE /* constants.h in Headers */,
+				A9C2F1F122E7833D001763CE /* macro.h in Headers */,
+				A9C2F42522E7833D001763CE /* spirv_optimizer_options.h in Headers */,
+				A9C2F43D22E7833D001763CE /* construct.h in Headers */,
+				A9C2F25522E7833D001763CE /* propagator.h in Headers */,
+				A9C2F39322E7833D001763CE /* feature_manager.h in Headers */,
+				A9C2F2CB22E7833D001763CE /* dead_insert_elim_pass.h in Headers */,
+				A9C2F41F22E7833D001763CE /* latest_version_spirv_header.h in Headers */,
+				A9C2F39F22E7833D001763CE /* type_manager.h in Headers */,
+				A9C2F27922E7833D001763CE /* fold_spec_constant_op_and_composite_pass.h in Headers */,
+				A9C2F17D22E7833D001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.h in Headers */,
+				A9C2F30722E7833D001763CE /* log.h in Headers */,
+				A9C2F39B22E7833D001763CE /* dominator_tree.h in Headers */,
+				A9C2F2F922E7833D001763CE /* upgrade_memory_model.h in Headers */,
+				A9C2F1FF22E7833D001763CE /* name_mapper.h in Headers */,
+				A9C2F19922E7833D001763CE /* remove_function_reduction_opportunity.h in Headers */,
+				A9C2F22F22E7833D001763CE /* tree_iterator.h in Headers */,
+				A9C2F34922E7833D001763CE /* const_folding_rules.h in Headers */,
+				A9C2F33F22E7833D001763CE /* remove_duplicates_pass.h in Headers */,
+				A9C2F41B22E7833D001763CE /* ext_inst.h in Headers */,
+				A9C2F2E522E7833D001763CE /* inline_pass.h in Headers */,
+				A9C2F37B22E7833D001763CE /* combine_access_chains.h in Headers */,
+				A9C2F31F22E7833D001763CE /* eliminate_dead_functions_pass.h in Headers */,
+				A9C2F31122E7833D001763CE /* ssa_rewrite_pass.h in Headers */,
+				A9C2F15722E7833D001763CE /* timer.h in Headers */,
+				A9C2F42322E7833D001763CE /* instruction.h in Headers */,
+				A9C2F35922E7833D001763CE /* local_ssa_elim_pass.h in Headers */,
+				A9C2F34322E7833D001763CE /* reflect.h in Headers */,
+				A9C2F1A722E7833D001763CE /* merge_blocks_reduction_opportunity_finder.h in Headers */,
+				A9C2F1F722E7833D001763CE /* spirv_validator_options.h in Headers */,
+				A9C2F32322E7833D001763CE /* fold.h in Headers */,
+				A9C2F16522E7833D001763CE /* ilist.h in Headers */,
+				A9C2F15322E7833D001763CE /* small_vector.h in Headers */,
+				A9C2F15F22E7833D001763CE /* hex_float.h in Headers */,
+				A9C2F2B922E7833D001763CE /* process_lines_pass.h in Headers */,
+				A9C2F14522E7833D001763CE /* text.h in Headers */,
+				A9C2F1C722E7833D001763CE /* change_operand_reduction_opportunity.h in Headers */,
+				A9C2F38D22E7833D001763CE /* function.h in Headers */,
+				A9C2F15122E7833D001763CE /* string_utils.h in Headers */,
+				A9C2F1D922E7833D001763CE /* latest_version_opencl_std_header.h in Headers */,
+				A9C2F30D22E7833D001763CE /* eliminate_dead_constant_pass.h in Headers */,
+				A9C2F1BB22E7833D001763CE /* reducer.h in Headers */,
+				A9C2F35F22E7833D001763CE /* loop_utils.h in Headers */,
+				A9C2F23322E7833D001763CE /* legalize_vector_shuffle_pass.h in Headers */,
+				A9C2F29F22E7833D001763CE /* local_redundancy_elimination.h in Headers */,
+				A9C2F22B22E7833D001763CE /* compact_ids_pass.h in Headers */,
+				A9C2F1B122E7833D001763CE /* remove_function_reduction_opportunity_finder.h in Headers */,
+				A9C2F30322E7833D001763CE /* workaround1209.h in Headers */,
+				A9C2F1B322E7833D001763CE /* pch_source_reduce.h in Headers */,
+				A9C2F1FB22E7833D001763CE /* text_handler.h in Headers */,
+				A9C2F1E122E7833D001763CE /* enum_string_mapping.h in Headers */,
+				A9C2F17122E7833D001763CE /* operand_to_dominating_id_reduction_opportunity_finder.h in Headers */,
+				A9C2F27322E7833D001763CE /* unify_const_pass.h in Headers */,
+				A9C2F14B22E7833D001763CE /* parse_number.h in Headers */,
+				A9C2F2E922E7833D001763CE /* value_number_table.h in Headers */,
+				A9C2F1C122E7833D001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h in Headers */,
+				A9C2F24B22E7833D001763CE /* replace_invalid_opc.h in Headers */,
+				A9C2F2A722E7833D001763CE /* block_merge_util.h in Headers */,
+				A9C2F35322E7833D001763CE /* redundancy_elimination.h in Headers */,
+				A9C2F37122E7833D001763CE /* generate_webgpu_initializers_pass.h in Headers */,
+				A9C2F2CF22E7833D001763CE /* freeze_spec_constant_value_pass.h in Headers */,
+				A9C2F23722E7833D001763CE /* reduce_load_size.h in Headers */,
+				A9C2F37322E7833D001763CE /* instruction.h in Headers */,
+				A9C2F13B22E7833D001763CE /* spirv_fuzzer_options.h in Headers */,
+				A9C2F46B22E7833D001763CE /* validate_scopes.h in Headers */,
+				A9C2F14D22E7833D001763CE /* ilist_node.h in Headers */,
+				A9C2F13F22E7833D001763CE /* enum_set.h in Headers */,
+				A9C2F1FD22E7833D001763CE /* parsed_operand.h in Headers */,
+				A9C2F26322E7833D001763CE /* ir_context.h in Headers */,
+				A9C2F36B22E7833D001763CE /* cfg.h in Headers */,
+				A9C2F2EF22E7833D001763CE /* inline_exhaustive_pass.h in Headers */,
+				A9C2F1CF22E7833D001763CE /* merge_blocks_reduction_opportunity.h in Headers */,
+				A9C2F33D22E7833D001763CE /* simplification_pass.h in Headers */,
+				A9C2F29522E7833D001763CE /* def_use_manager.h in Headers */,
+				A9C2F29922E7833D001763CE /* cfg_cleanup_pass.h in Headers */,
+				A9C2F21122E7833D001763CE /* print.h in Headers */,
+				A9C2F22122E7833D001763CE /* inline_opaque_pass.h in Headers */,
+				A9C2F19B22E7833D001763CE /* change_operand_to_undef_reduction_opportunity.h in Headers */,
+				A9C2F39922E7833D001763CE /* set_spec_constant_default_value_pass.h in Headers */,
+				A9C2F24D22E7833D001763CE /* local_access_chain_convert_pass.h in Headers */,
+				A9C2F1ED22E7833D001763CE /* operand.h in Headers */,
+				A9C2F31522E7833D001763CE /* dead_variable_elimination.h in Headers */,
+				A9C2F32122E7833D001763CE /* eliminate_dead_functions_util.h in Headers */,
+				A9C2F17722E7833D001763CE /* operand_to_const_reduction_opportunity_finder.h in Headers */,
+				A9C2F36F22E7833D001763CE /* loop_descriptor.h in Headers */,
+				A9C2F1D722E7833D001763CE /* reduction_pass.h in Headers */,
+				A9C2F1A122E7833D001763CE /* remove_selection_reduction_opportunity.h in Headers */,
+				A9C2F29122E7833D001763CE /* private_to_local_pass.h in Headers */,
+				A9C2F15B22E7833D001763CE /* bit_vector.h in Headers */,
+				A9C2F36922E7833D001763CE /* loop_unswitch_pass.h in Headers */,
+				A9C2F2DB22E7833D001763CE /* eliminate_dead_members_pass.h in Headers */,
+				A9C2F1DF22E7833D001763CE /* pch_source.h in Headers */,
+				A9C2F32722E7833D001763CE /* dead_branch_elim_pass.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2469,187 +2464,186 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A94A6A2D22B17BBC00C661C6 /* types.h in Headers */,
-				A94A69F522B17BBC00C661C6 /* strip_debug_info_pass.h in Headers */,
-				A94A6AD522B17BBC00C661C6 /* folding_rules.h in Headers */,
-				A94A692122B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.h in Headers */,
-				A94A695522B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.h in Headers */,
-				A94A69F322B17BBC00C661C6 /* scalar_analysis.h in Headers */,
-				A94A6B0122B17BBC00C661C6 /* null_pass.h in Headers */,
-				A94A6A9F22B17BBC00C661C6 /* loop_dependence.h in Headers */,
-				A94A6B3322B17BBC00C661C6 /* vector_dce.h in Headers */,
-				A94A6A2B22B17BBC00C661C6 /* ir_loader.h in Headers */,
-				A94A6B5522B17BBC00C661C6 /* dominator_tree.h in Headers */,
-				A94A697B22B17BBB00C661C6 /* reduction_opportunity_finder.h in Headers */,
-				A94A6A8D22B17BBC00C661C6 /* mem_pass.h in Headers */,
-				A94A69CB22B17BBC00C661C6 /* disassemble.h in Headers */,
-				A94A693922B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h in Headers */,
-				A94A694722B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.h in Headers */,
-				A94A6A6322B17BBC00C661C6 /* loop_fusion_pass.h in Headers */,
-				A94A6A3322B17BBC00C661C6 /* basic_block.h in Headers */,
-				A94A69D522B17BBC00C661C6 /* merge_return_pass.h in Headers */,
-				A94A6B3522B17BBC00C661C6 /* combine_access_chains.h in Headers */,
-				A94A699B22B17BBB00C661C6 /* spirv_reducer_options.h in Headers */,
-				A94A69DF22B17BBC00C661C6 /* composite.h in Headers */,
-				A94A6AD122B17BBC00C661C6 /* dominator_analysis.h in Headers */,
-				A94A6AA322B17BBC00C661C6 /* flatten_decoration_pass.h in Headers */,
-				A94A69BD22B17BBB00C661C6 /* spirv_endian.h in Headers */,
-				A94A693F22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.h in Headers */,
-				A94A69A922B17BBB00C661C6 /* spirv_constant.h in Headers */,
-				A94A69CF22B17BBC00C661C6 /* if_conversion.h in Headers */,
-				A94A6B2D22B17BBC00C661C6 /* instruction.h in Headers */,
-				A94A696B22B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.h in Headers */,
-				A94A6B4122B17BBC00C661C6 /* build_module.h in Headers */,
-				A94A6BC722B17BBC00C661C6 /* binary.h in Headers */,
-				A94A691322B17BBB00C661C6 /* bitutils.h in Headers */,
-				A94A6A2122B17BBC00C661C6 /* loop_unroller.h in Headers */,
-				A94A6B2F22B17BBC00C661C6 /* aggressive_dead_code_elim_pass.h in Headers */,
-				A94A697F22B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.h in Headers */,
-				A94A691D22B17BBB00C661C6 /* spirv_target_env.h in Headers */,
-				A94A69E722B17BBC00C661C6 /* strip_atomic_counter_memory_pass.h in Headers */,
-				A94A6B4322B17BBC00C661C6 /* ccp_pass.h in Headers */,
-				A94A6A8B22B17BBC00C661C6 /* instrument_pass.h in Headers */,
-				A94A6A6D22B17BBC00C661C6 /* decoration_manager.h in Headers */,
-				A94A6AC122B17BBC00C661C6 /* split_invalid_unreachable_pass.h in Headers */,
-				A94A6AC322B17BBC00C661C6 /* copy_prop_arrays.h in Headers */,
-				A94A6B2922B17BBC00C661C6 /* loop_descriptor.h in Headers */,
-				A94A6B3F22B17BBC00C661C6 /* licm_pass.h in Headers */,
-				A94A69D922B17BBC00C661C6 /* loop_fusion.h in Headers */,
-				A94A690522B17BBB00C661C6 /* make_unique.h in Headers */,
-				A94A6AD322B17BBC00C661C6 /* pass.h in Headers */,
-				A94A6A7322B17BBC00C661C6 /* local_single_block_elim_pass.h in Headers */,
-				A94A6A5922B17BBC00C661C6 /* loop_peeling.h in Headers */,
-				A94A694D22B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.h in Headers */,
-				A94A699322B17BBB00C661C6 /* cfa.h in Headers */,
-				A94A6A7722B17BBC00C661C6 /* strength_reduction_pass.h in Headers */,
-				A94A6A3922B17BBC00C661C6 /* block_merge_pass.h in Headers */,
-				A94A6B4F22B17BBC00C661C6 /* inst_bindless_check_pass.h in Headers */,
-				A94A69E322B17BBC00C661C6 /* register_pressure.h in Headers */,
-				A94A697522B17BBB00C661C6 /* reduction_opportunity.h in Headers */,
-				A94A6AFD22B17BBC00C661C6 /* reflect.h in Headers */,
-				A94A695B22B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.h in Headers */,
-				A94A6B3722B17BBC00C661C6 /* pass_manager.h in Headers */,
-				A94A6A6522B17BBC00C661C6 /* struct_cfg_analysis.h in Headers */,
-				A94A698322B17BBB00C661C6 /* reduction_util.h in Headers */,
-				A94A69EB22B17BBC00C661C6 /* local_single_store_elim_pass.h in Headers */,
-				A94A6BB922B17BBC00C661C6 /* instruction.h in Headers */,
-				A94A693722B17BBB00C661C6 /* remove_instruction_reduction_opportunity.h in Headers */,
-				A94A6B4522B17BBC00C661C6 /* decompose_initialized_variables_pass.h in Headers */,
-				A94A6AE122B17BBC00C661C6 /* dead_branch_elim_pass.h in Headers */,
-				A94A6B0322B17BBC00C661C6 /* const_folding_rules.h in Headers */,
-				A94A68F322B17BBB00C661C6 /* assembly_grammar.h in Headers */,
-				A94A69BB22B17BBB00C661C6 /* diagnostic.h in Headers */,
-				A94A69A122B17BBB00C661C6 /* spirv_definition.h in Headers */,
-				A94A6B0D22B17BBC00C661C6 /* redundancy_elimination.h in Headers */,
-				A94A6A0D22B17BBC00C661C6 /* instruction_list.h in Headers */,
-				A94A6BFF22B17BBD00C661C6 /* validate_scopes.h in Headers */,
-				A94A6B5922B17BBC00C661C6 /* type_manager.h in Headers */,
-				A94A6AF922B17BBC00C661C6 /* remove_duplicates_pass.h in Headers */,
-				A94A6BBD22B17BBC00C661C6 /* opcode.h in Headers */,
-				A94A6AB922B17BBC00C661C6 /* loop_fission.h in Headers */,
-				A94A692522B17BBB00C661C6 /* remove_block_reduction_opportunity.h in Headers */,
-				A94A6AE922B17BBC00C661C6 /* fix_storage_class.h in Headers */,
-				A94A6AA922B17BBC00C661C6 /* constants.h in Headers */,
-				A94A69A722B17BBB00C661C6 /* macro.h in Headers */,
-				A94A6A0B22B17BBC00C661C6 /* propagator.h in Headers */,
-				A94A6A8322B17BBC00C661C6 /* dead_insert_elim_pass.h in Headers */,
-				A94A6A2F22B17BBC00C661C6 /* fold_spec_constant_op_and_composite_pass.h in Headers */,
-				A94A693322B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.h in Headers */,
-				A94A6ABF22B17BBC00C661C6 /* log.h in Headers */,
-				A94A6AB122B17BBC00C661C6 /* upgrade_memory_model.h in Headers */,
-				A94A69B522B17BBB00C661C6 /* name_mapper.h in Headers */,
-				A94A6BBB22B17BBC00C661C6 /* spirv_optimizer_options.h in Headers */,
-				A94A694F22B17BBB00C661C6 /* remove_function_reduction_opportunity.h in Headers */,
-				A94A69E522B17BBC00C661C6 /* tree_iterator.h in Headers */,
-				A94A6A9D22B17BBC00C661C6 /* inline_pass.h in Headers */,
-				A94A6B2522B17BBC00C661C6 /* cfg.h in Headers */,
-				A94A6AD722B17BBC00C661C6 /* eliminate_dead_functions_pass.h in Headers */,
-				A94A6BB522B17BBC00C661C6 /* latest_version_spirv_header.h in Headers */,
-				A94A6AC922B17BBC00C661C6 /* ssa_rewrite_pass.h in Headers */,
-				A94A6B0922B17BBC00C661C6 /* pch_source_opt.h in Headers */,
-				A94A6BC322B17BBC00C661C6 /* extensions.h in Headers */,
-				A94A6C2322B17BBD00C661C6 /* function.h in Headers */,
-				A94A690D22B17BBB00C661C6 /* timer.h in Headers */,
-				A94A695D22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.h in Headers */,
-				A94A69AD22B17BBB00C661C6 /* spirv_validator_options.h in Headers */,
-				A94A6BEB22B17BBC00C661C6 /* validation_state.h in Headers */,
-				A94A691B22B17BBB00C661C6 /* ilist.h in Headers */,
-				A94A6BDD22B17BBC00C661C6 /* basic_block.h in Headers */,
-				A94A6B3D22B17BBC00C661C6 /* iterator.h in Headers */,
-				A94A6AF322B17BBC00C661C6 /* strip_reflect_info_pass.h in Headers */,
-				A94A690922B17BBB00C661C6 /* small_vector.h in Headers */,
-				A94A691522B17BBB00C661C6 /* hex_float.h in Headers */,
-				A94A6B2122B17BBC00C661C6 /* ir_builder.h in Headers */,
-				A94A6A7122B17BBC00C661C6 /* process_lines_pass.h in Headers */,
-				A94A68FB22B17BBB00C661C6 /* text.h in Headers */,
-				A94A697D22B17BBB00C661C6 /* change_operand_reduction_opportunity.h in Headers */,
-				A94A6ADB22B17BBC00C661C6 /* eliminate_dead_functions_util.h in Headers */,
-				A94A6AF722B17BBC00C661C6 /* simplification_pass.h in Headers */,
-				A94A690722B17BBB00C661C6 /* string_utils.h in Headers */,
-				A94A698F22B17BBB00C661C6 /* latest_version_opencl_std_header.h in Headers */,
-				A94A6B2B22B17BBC00C661C6 /* generate_webgpu_initializers_pass.h in Headers */,
-				A94A6AC522B17BBC00C661C6 /* eliminate_dead_constant_pass.h in Headers */,
-				A94A697122B17BBB00C661C6 /* reducer.h in Headers */,
-				A94A69E922B17BBC00C661C6 /* legalize_vector_shuffle_pass.h in Headers */,
-				A94A6A5522B17BBC00C661C6 /* local_redundancy_elimination.h in Headers */,
-				A94A69E122B17BBC00C661C6 /* compact_ids_pass.h in Headers */,
-				A94A6B1B22B17BBC00C661C6 /* module.h in Headers */,
-				A94A696722B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.h in Headers */,
-				A94A6ABB22B17BBC00C661C6 /* workaround1209.h in Headers */,
-				A94A6B5F22B17BBC00C661C6 /* table.h in Headers */,
-				A94A696922B17BBB00C661C6 /* pch_source_reduce.h in Headers */,
-				A94A6AE522B17BBC00C661C6 /* scalar_analysis_nodes.h in Headers */,
-				A94A69B122B17BBB00C661C6 /* text_handler.h in Headers */,
-				A94A6B5322B17BBC00C661C6 /* set_spec_constant_default_value_pass.h in Headers */,
-				A94A699722B17BBB00C661C6 /* enum_string_mapping.h in Headers */,
-				A94A692722B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.h in Headers */,
-				A94A6A2922B17BBC00C661C6 /* unify_const_pass.h in Headers */,
-				A94A6B4722B17BBC00C661C6 /* function.h in Headers */,
-				A94A6AD922B17BBC00C661C6 /* common_uniform_elim_pass.h in Headers */,
-				A94A6C0322B17BBD00C661C6 /* validate_memory_semantics.h in Headers */,
-				A94A690122B17BBB00C661C6 /* parse_number.h in Headers */,
-				A94A6AA122B17BBC00C661C6 /* value_number_table.h in Headers */,
-				A94A6B1922B17BBC00C661C6 /* loop_utils.h in Headers */,
-				A94A6AEF22B17BBC00C661C6 /* passes.h in Headers */,
-				A94A6C2B22B17BBD00C661C6 /* decoration.h in Headers */,
-				A94A6BB122B17BBC00C661C6 /* ext_inst.h in Headers */,
-				A94A697722B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h in Headers */,
-				A94A6A0122B17BBC00C661C6 /* replace_invalid_opc.h in Headers */,
-				A94A6B4D22B17BBC00C661C6 /* feature_manager.h in Headers */,
-				A94A6BF722B17BBD00C661C6 /* validate.h in Headers */,
-				A94A6A5D22B17BBC00C661C6 /* block_merge_util.h in Headers */,
-				A94A6ADD22B17BBC00C661C6 /* fold.h in Headers */,
-				A94A6A8722B17BBC00C661C6 /* freeze_spec_constant_value_pass.h in Headers */,
-				A94A69ED22B17BBC00C661C6 /* reduce_load_size.h in Headers */,
-				A94A68F122B17BBB00C661C6 /* spirv_fuzzer_options.h in Headers */,
-				A94A6B0522B17BBC00C661C6 /* scalar_replacement_pass.h in Headers */,
-				A94A690322B17BBB00C661C6 /* ilist_node.h in Headers */,
-				A94A6C1922B17BBD00C661C6 /* instruction.h in Headers */,
-				A94A68F522B17BBB00C661C6 /* enum_set.h in Headers */,
-				A94A69B322B17BBB00C661C6 /* parsed_operand.h in Headers */,
-				A94A6A1922B17BBC00C661C6 /* ir_context.h in Headers */,
-				A94A6AA722B17BBC00C661C6 /* inline_exhaustive_pass.h in Headers */,
-				A94A6B1322B17BBC00C661C6 /* local_ssa_elim_pass.h in Headers */,
-				A94A6B2722B17BBC00C661C6 /* code_sink.h in Headers */,
-				A94A698522B17BBB00C661C6 /* merge_blocks_reduction_opportunity.h in Headers */,
-				A94A6A4B22B17BBC00C661C6 /* def_use_manager.h in Headers */,
-				A94A6A4F22B17BBC00C661C6 /* cfg_cleanup_pass.h in Headers */,
-				A94A69C722B17BBC00C661C6 /* print.h in Headers */,
-				A94A69D722B17BBC00C661C6 /* inline_opaque_pass.h in Headers */,
-				A94A695122B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.h in Headers */,
-				A94A6A0322B17BBC00C661C6 /* local_access_chain_convert_pass.h in Headers */,
-				A94A6BC122B17BBC00C661C6 /* latest_version_glsl_std_450_header.h in Headers */,
-				A94A69A322B17BBB00C661C6 /* operand.h in Headers */,
-				A94A6BD322B17BBC00C661C6 /* construct.h in Headers */,
-				A94A6ACD22B17BBC00C661C6 /* dead_variable_elimination.h in Headers */,
-				A94A692D22B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.h in Headers */,
-				A94A698D22B17BBB00C661C6 /* reduction_pass.h in Headers */,
-				A94A6B2322B17BBC00C661C6 /* loop_unswitch_pass.h in Headers */,
-				A94A695722B17BBB00C661C6 /* remove_selection_reduction_opportunity.h in Headers */,
-				A94A6A4722B17BBC00C661C6 /* private_to_local_pass.h in Headers */,
-				A94A691122B17BBB00C661C6 /* bit_vector.h in Headers */,
-				A94A6A9322B17BBC00C661C6 /* eliminate_dead_members_pass.h in Headers */,
-				A94A699522B17BBB00C661C6 /* pch_source.h in Headers */,
+				A9C2F37A22E7833D001763CE /* vector_dce.h in Headers */,
+				A9C2F42C22E7833D001763CE /* latest_version_glsl_std_450_header.h in Headers */,
+				A9C2F27822E7833D001763CE /* types.h in Headers */,
+				A9C2F24022E7833D001763CE /* strip_debug_info_pass.h in Headers */,
+				A9C2F31E22E7833D001763CE /* folding_rules.h in Headers */,
+				A9C2F16C22E7833D001763CE /* operand_to_undef_reduction_opportunity_finder.h in Headers */,
+				A9C2F49022E7833D001763CE /* function.h in Headers */,
+				A9C2F38622E7833D001763CE /* licm_pass.h in Headers */,
+				A9C2F32C22E7833D001763CE /* scalar_analysis_nodes.h in Headers */,
+				A9C2F1A022E7833D001763CE /* structured_loop_to_selection_reduction_opportunity_finder.h in Headers */,
+				A9C2F23E22E7833D001763CE /* scalar_analysis.h in Headers */,
+				A9C2F2E822E7833D001763CE /* loop_dependence.h in Headers */,
+				A9C2F27622E7833D001763CE /* ir_loader.h in Headers */,
+				A9C2F1C622E7833D001763CE /* reduction_opportunity_finder.h in Headers */,
+				A9C2F42822E7833D001763CE /* opcode.h in Headers */,
+				A9C2F2D622E7833D001763CE /* mem_pass.h in Headers */,
+				A9C2F44822E7833D001763CE /* basic_block.h in Headers */,
+				A9C2F21622E7833D001763CE /* disassemble.h in Headers */,
+				A9C2F47022E7833D001763CE /* validate_memory_semantics.h in Headers */,
+				A9C2F18422E7833D001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.h in Headers */,
+				A9C2F34C22E7833D001763CE /* scalar_replacement_pass.h in Headers */,
+				A9C2F19222E7833D001763CE /* simple_conditional_branch_to_branch_opportunity_finder.h in Headers */,
+				A9C2F2AE22E7833D001763CE /* loop_fusion_pass.h in Headers */,
+				A9C2F49822E7833D001763CE /* decoration.h in Headers */,
+				A9C2F36222E7833D001763CE /* module.h in Headers */,
+				A9C2F27E22E7833D001763CE /* basic_block.h in Headers */,
+				A9C2F43222E7833D001763CE /* binary.h in Headers */,
+				A9C2F37622E7833D001763CE /* aggressive_dead_code_elim_pass.h in Headers */,
+				A9C2F37E22E7833D001763CE /* pass_manager.h in Headers */,
+				A9C2F22022E7833D001763CE /* merge_return_pass.h in Headers */,
+				A9C2F1E622E7833D001763CE /* spirv_reducer_options.h in Headers */,
+				A9C2F22A22E7833D001763CE /* composite.h in Headers */,
+				A9C2F31A22E7833D001763CE /* dominator_analysis.h in Headers */,
+				A9C2F38A22E7833D001763CE /* ccp_pass.h in Headers */,
+				A9C2F2EC22E7833D001763CE /* flatten_decoration_pass.h in Headers */,
+				A9C2F20822E7833D001763CE /* spirv_endian.h in Headers */,
+				A9C2F18A22E7833D001763CE /* remove_opname_instruction_reduction_opportunity_finder.h in Headers */,
+				A9C2F1F422E7833D001763CE /* spirv_constant.h in Headers */,
+				A9C2F21A22E7833D001763CE /* if_conversion.h in Headers */,
+				A9C2F1B622E7833D001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.h in Headers */,
+				A9C2F15E22E7833D001763CE /* bitutils.h in Headers */,
+				A9C2F26C22E7833D001763CE /* loop_unroller.h in Headers */,
+				A9C2F1CA22E7833D001763CE /* remove_block_reduction_opportunity_finder.h in Headers */,
+				A9C2F16822E7833D001763CE /* spirv_target_env.h in Headers */,
+				A9C2F36E22E7833D001763CE /* code_sink.h in Headers */,
+				A9C2F23222E7833D001763CE /* strip_atomic_counter_memory_pass.h in Headers */,
+				A9C2F2D422E7833D001763CE /* instrument_pass.h in Headers */,
+				A9C2F38822E7833D001763CE /* build_module.h in Headers */,
+				A9C2F42E22E7833D001763CE /* extensions.h in Headers */,
+				A9C2F48622E7833D001763CE /* instruction.h in Headers */,
+				A9C2F33022E7833D001763CE /* fix_storage_class.h in Headers */,
+				A9C2F36822E7833D001763CE /* ir_builder.h in Headers */,
+				A9C2F2B622E7833D001763CE /* decoration_manager.h in Headers */,
+				A9C2F33A22E7833D001763CE /* strip_reflect_info_pass.h in Headers */,
+				A9C2F38422E7833D001763CE /* iterator.h in Headers */,
+				A9C2F38C22E7833D001763CE /* decompose_initialized_variables_pass.h in Headers */,
+				A9C2F34822E7833D001763CE /* null_pass.h in Headers */,
+				A9C2F30A22E7833D001763CE /* split_invalid_unreachable_pass.h in Headers */,
+				A9C2F30C22E7833D001763CE /* copy_prop_arrays.h in Headers */,
+				A9C2F22422E7833D001763CE /* loop_fusion.h in Headers */,
+				A9C2F3A622E7833D001763CE /* table.h in Headers */,
+				A9C2F15022E7833D001763CE /* make_unique.h in Headers */,
+				A9C2F31C22E7833D001763CE /* pass.h in Headers */,
+				A9C2F2BC22E7833D001763CE /* local_single_block_elim_pass.h in Headers */,
+				A9C2F2A422E7833D001763CE /* loop_peeling.h in Headers */,
+				A9C2F19822E7833D001763CE /* structured_loop_to_selection_reduction_opportunity.h in Headers */,
+				A9C2F1DE22E7833D001763CE /* cfa.h in Headers */,
+				A9C2F2C022E7833D001763CE /* strength_reduction_pass.h in Headers */,
+				A9C2F28422E7833D001763CE /* block_merge_pass.h in Headers */,
+				A9C2F33622E7833D001763CE /* passes.h in Headers */,
+				A9C2F46222E7833D001763CE /* validate.h in Headers */,
+				A9C2F22E22E7833D001763CE /* register_pressure.h in Headers */,
+				A9C2F1C022E7833D001763CE /* reduction_opportunity.h in Headers */,
+				A9C2F1A622E7833D001763CE /* remove_selection_reduction_opportunity_finder.h in Headers */,
+				A9C2F2B022E7833D001763CE /* struct_cfg_analysis.h in Headers */,
+				A9C2F1CE22E7833D001763CE /* reduction_util.h in Headers */,
+				A9C2F23622E7833D001763CE /* local_single_store_elim_pass.h in Headers */,
+				A9C2F18222E7833D001763CE /* remove_instruction_reduction_opportunity.h in Headers */,
+				A9C2F13E22E7833D001763CE /* assembly_grammar.h in Headers */,
+				A9C2F20622E7833D001763CE /* diagnostic.h in Headers */,
+				A9C2F45622E7833D001763CE /* validation_state.h in Headers */,
+				A9C2F1EC22E7833D001763CE /* spirv_definition.h in Headers */,
+				A9C2F35022E7833D001763CE /* pch_source_opt.h in Headers */,
+				A9C2F25822E7833D001763CE /* instruction_list.h in Headers */,
+				A9C2F30222E7833D001763CE /* loop_fission.h in Headers */,
+				A9C2F17022E7833D001763CE /* remove_block_reduction_opportunity.h in Headers */,
+				A9C2F39622E7833D001763CE /* inst_bindless_check_pass.h in Headers */,
+				A9C2F2F222E7833D001763CE /* constants.h in Headers */,
+				A9C2F1F222E7833D001763CE /* macro.h in Headers */,
+				A9C2F42622E7833D001763CE /* spirv_optimizer_options.h in Headers */,
+				A9C2F43E22E7833D001763CE /* construct.h in Headers */,
+				A9C2F25622E7833D001763CE /* propagator.h in Headers */,
+				A9C2F39422E7833D001763CE /* feature_manager.h in Headers */,
+				A9C2F2CC22E7833D001763CE /* dead_insert_elim_pass.h in Headers */,
+				A9C2F42022E7833D001763CE /* latest_version_spirv_header.h in Headers */,
+				A9C2F3A022E7833D001763CE /* type_manager.h in Headers */,
+				A9C2F27A22E7833D001763CE /* fold_spec_constant_op_and_composite_pass.h in Headers */,
+				A9C2F17E22E7833D001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.h in Headers */,
+				A9C2F30822E7833D001763CE /* log.h in Headers */,
+				A9C2F39C22E7833D001763CE /* dominator_tree.h in Headers */,
+				A9C2F2FA22E7833D001763CE /* upgrade_memory_model.h in Headers */,
+				A9C2F20022E7833D001763CE /* name_mapper.h in Headers */,
+				A9C2F19A22E7833D001763CE /* remove_function_reduction_opportunity.h in Headers */,
+				A9C2F23022E7833D001763CE /* tree_iterator.h in Headers */,
+				A9C2F34A22E7833D001763CE /* const_folding_rules.h in Headers */,
+				A9C2F34022E7833D001763CE /* remove_duplicates_pass.h in Headers */,
+				A9C2F41C22E7833D001763CE /* ext_inst.h in Headers */,
+				A9C2F2E622E7833D001763CE /* inline_pass.h in Headers */,
+				A9C2F37C22E7833D001763CE /* combine_access_chains.h in Headers */,
+				A9C2F32022E7833D001763CE /* eliminate_dead_functions_pass.h in Headers */,
+				A9C2F31222E7833D001763CE /* ssa_rewrite_pass.h in Headers */,
+				A9C2F15822E7833D001763CE /* timer.h in Headers */,
+				A9C2F42422E7833D001763CE /* instruction.h in Headers */,
+				A9C2F35A22E7833D001763CE /* local_ssa_elim_pass.h in Headers */,
+				A9C2F34422E7833D001763CE /* reflect.h in Headers */,
+				A9C2F1A822E7833D001763CE /* merge_blocks_reduction_opportunity_finder.h in Headers */,
+				A9C2F1F822E7833D001763CE /* spirv_validator_options.h in Headers */,
+				A9C2F32422E7833D001763CE /* fold.h in Headers */,
+				A9C2F16622E7833D001763CE /* ilist.h in Headers */,
+				A9C2F15422E7833D001763CE /* small_vector.h in Headers */,
+				A9C2F16022E7833D001763CE /* hex_float.h in Headers */,
+				A9C2F2BA22E7833D001763CE /* process_lines_pass.h in Headers */,
+				A9C2F14622E7833D001763CE /* text.h in Headers */,
+				A9C2F1C822E7833D001763CE /* change_operand_reduction_opportunity.h in Headers */,
+				A9C2F38E22E7833D001763CE /* function.h in Headers */,
+				A9C2F15222E7833D001763CE /* string_utils.h in Headers */,
+				A9C2F1DA22E7833D001763CE /* latest_version_opencl_std_header.h in Headers */,
+				A9C2F30E22E7833D001763CE /* eliminate_dead_constant_pass.h in Headers */,
+				A9C2F1BC22E7833D001763CE /* reducer.h in Headers */,
+				A9C2F36022E7833D001763CE /* loop_utils.h in Headers */,
+				A9C2F23422E7833D001763CE /* legalize_vector_shuffle_pass.h in Headers */,
+				A9C2F2A022E7833D001763CE /* local_redundancy_elimination.h in Headers */,
+				A9C2F22C22E7833D001763CE /* compact_ids_pass.h in Headers */,
+				A9C2F1B222E7833D001763CE /* remove_function_reduction_opportunity_finder.h in Headers */,
+				A9C2F30422E7833D001763CE /* workaround1209.h in Headers */,
+				A9C2F1B422E7833D001763CE /* pch_source_reduce.h in Headers */,
+				A9C2F1FC22E7833D001763CE /* text_handler.h in Headers */,
+				A9C2F1E222E7833D001763CE /* enum_string_mapping.h in Headers */,
+				A9C2F17222E7833D001763CE /* operand_to_dominating_id_reduction_opportunity_finder.h in Headers */,
+				A9C2F27422E7833D001763CE /* unify_const_pass.h in Headers */,
+				A9C2F14C22E7833D001763CE /* parse_number.h in Headers */,
+				A9C2F2EA22E7833D001763CE /* value_number_table.h in Headers */,
+				A9C2F1C222E7833D001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.h in Headers */,
+				A9C2F24C22E7833D001763CE /* replace_invalid_opc.h in Headers */,
+				A9C2F2A822E7833D001763CE /* block_merge_util.h in Headers */,
+				A9C2F35422E7833D001763CE /* redundancy_elimination.h in Headers */,
+				A9C2F37222E7833D001763CE /* generate_webgpu_initializers_pass.h in Headers */,
+				A9C2F2D022E7833D001763CE /* freeze_spec_constant_value_pass.h in Headers */,
+				A9C2F23822E7833D001763CE /* reduce_load_size.h in Headers */,
+				A9C2F37422E7833D001763CE /* instruction.h in Headers */,
+				A9C2F13C22E7833D001763CE /* spirv_fuzzer_options.h in Headers */,
+				A9C2F46C22E7833D001763CE /* validate_scopes.h in Headers */,
+				A9C2F14E22E7833D001763CE /* ilist_node.h in Headers */,
+				A9C2F14022E7833D001763CE /* enum_set.h in Headers */,
+				A9C2F1FE22E7833D001763CE /* parsed_operand.h in Headers */,
+				A9C2F26422E7833D001763CE /* ir_context.h in Headers */,
+				A9C2F36C22E7833D001763CE /* cfg.h in Headers */,
+				A9C2F2F022E7833D001763CE /* inline_exhaustive_pass.h in Headers */,
+				A9C2F1D022E7833D001763CE /* merge_blocks_reduction_opportunity.h in Headers */,
+				A9C2F33E22E7833D001763CE /* simplification_pass.h in Headers */,
+				A9C2F29622E7833D001763CE /* def_use_manager.h in Headers */,
+				A9C2F29A22E7833D001763CE /* cfg_cleanup_pass.h in Headers */,
+				A9C2F21222E7833D001763CE /* print.h in Headers */,
+				A9C2F22222E7833D001763CE /* inline_opaque_pass.h in Headers */,
+				A9C2F19C22E7833D001763CE /* change_operand_to_undef_reduction_opportunity.h in Headers */,
+				A9C2F39A22E7833D001763CE /* set_spec_constant_default_value_pass.h in Headers */,
+				A9C2F24E22E7833D001763CE /* local_access_chain_convert_pass.h in Headers */,
+				A9C2F1EE22E7833D001763CE /* operand.h in Headers */,
+				A9C2F31622E7833D001763CE /* dead_variable_elimination.h in Headers */,
+				A9C2F32222E7833D001763CE /* eliminate_dead_functions_util.h in Headers */,
+				A9C2F17822E7833D001763CE /* operand_to_const_reduction_opportunity_finder.h in Headers */,
+				A9C2F37022E7833D001763CE /* loop_descriptor.h in Headers */,
+				A9C2F1D822E7833D001763CE /* reduction_pass.h in Headers */,
+				A9C2F1A222E7833D001763CE /* remove_selection_reduction_opportunity.h in Headers */,
+				A9C2F29222E7833D001763CE /* private_to_local_pass.h in Headers */,
+				A9C2F15C22E7833D001763CE /* bit_vector.h in Headers */,
+				A9C2F36A22E7833D001763CE /* loop_unswitch_pass.h in Headers */,
+				A9C2F2DC22E7833D001763CE /* eliminate_dead_members_pass.h in Headers */,
+				A9C2F1E022E7833D001763CE /* pch_source.h in Headers */,
+				A9C2F32822E7833D001763CE /* dead_branch_elim_pass.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2987,200 +2981,200 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A94A6A3A22B17BBC00C661C6 /* module.cpp in Sources */,
-				A94A6B5622B17BBC00C661C6 /* legalize_vector_shuffle_pass.cpp in Sources */,
-				A94A6AAA22B17BBC00C661C6 /* eliminate_dead_members_pass.cpp in Sources */,
-				A94A6B1422B17BBC00C661C6 /* inline_opaque_pass.cpp in Sources */,
-				A94A697822B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.cpp in Sources */,
-				A94A693A22B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.cpp in Sources */,
-				A94A6AA422B17BBC00C661C6 /* if_conversion.cpp in Sources */,
-				A94A6A5E22B17BBC00C661C6 /* loop_unroller.cpp in Sources */,
-				A94A6A1C22B17BBC00C661C6 /* cfg_cleanup_pass.cpp in Sources */,
-				A94A6C0A22B17BBD00C661C6 /* validate_logicals.cpp in Sources */,
-				A94A69D022B17BBC00C661C6 /* register_pressure.cpp in Sources */,
-				A94A695822B17BBB00C661C6 /* remove_instruction_reduction_opportunity.cpp in Sources */,
-				A94A6A2622B17BBC00C661C6 /* loop_dependence.cpp in Sources */,
-				A94A6B0E22B17BBC00C661C6 /* fix_storage_class.cpp in Sources */,
-				A94A6A8E22B17BBC00C661C6 /* loop_descriptor.cpp in Sources */,
-				A94A6C1E22B17BBD00C661C6 /* basic_block.cpp in Sources */,
-				A94A6A1622B17BBC00C661C6 /* merge_return_pass.cpp in Sources */,
-				A94A6AB222B17BBC00C661C6 /* copy_prop_arrays.cpp in Sources */,
-				A94A6C1422B17BBD00C661C6 /* instruction.cpp in Sources */,
-				A94A6A4422B17BBC00C661C6 /* generate_webgpu_initializers_pass.cpp in Sources */,
-				A94A6AEC22B17BBC00C661C6 /* set_spec_constant_default_value_pass.cpp in Sources */,
-				A94A696222B17BBB00C661C6 /* reducer.cpp in Sources */,
-				A94A6BFC22B17BBD00C661C6 /* validate_datarules.cpp in Sources */,
-				A94A6BD022B17BBC00C661C6 /* validate_capability.cpp in Sources */,
-				A94A6A4822B17BBC00C661C6 /* inline_pass.cpp in Sources */,
-				A94A6AAC22B17BBC00C661C6 /* strength_reduction_pass.cpp in Sources */,
-				A94A6B1022B17BBC00C661C6 /* value_number_table.cpp in Sources */,
-				A94A6C1022B17BBD00C661C6 /* validate_image.cpp in Sources */,
-				A94A6B0622B17BBC00C661C6 /* instruction.cpp in Sources */,
-				A94A6BC422B17BBC00C661C6 /* disassemble.cpp in Sources */,
-				A94A6A3C22B17BBC00C661C6 /* fold_spec_constant_op_and_composite_pass.cpp in Sources */,
-				A94A6A5622B17BBC00C661C6 /* split_invalid_unreachable_pass.cpp in Sources */,
-				A94A68F622B17BBB00C661C6 /* text.cpp in Sources */,
-				A94A69C822B17BBC00C661C6 /* ext_inst.cpp in Sources */,
-				A94A6C2822B17BBD00C661C6 /* validate_primitives.cpp in Sources */,
-				A94A68FE22B17BBB00C661C6 /* pch_source.cpp in Sources */,
-				A94A69F622B17BBC00C661C6 /* cfg.cpp in Sources */,
-				A94A6A8422B17BBC00C661C6 /* folding_rules.cpp in Sources */,
-				A94A6AE222B17BBC00C661C6 /* private_to_local_pass.cpp in Sources */,
-				A94A6A2422B17BBC00C661C6 /* ssa_rewrite_pass.cpp in Sources */,
-				A94A6B1622B17BBC00C661C6 /* replace_invalid_opc.cpp in Sources */,
-				A94A693C22B17BBB00C661C6 /* remove_function_reduction_opportunity.cpp in Sources */,
-				A94A694222B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.cpp in Sources */,
-				A94A6B0A22B17BBC00C661C6 /* reduce_load_size.cpp in Sources */,
-				A94A6A6022B17BBC00C661C6 /* constants.cpp in Sources */,
-				A94A694422B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp in Sources */,
-				A94A6A8022B17BBC00C661C6 /* flatten_decoration_pass.cpp in Sources */,
-				A94A6A9822B17BBC00C661C6 /* composite.cpp in Sources */,
-				A94A696C22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.cpp in Sources */,
-				A94A6AB622B17BBC00C661C6 /* inline_exhaustive_pass.cpp in Sources */,
-				A94A6C2422B17BBD00C661C6 /* validate_composites.cpp in Sources */,
-				A94A691E22B17BBB00C661C6 /* table.cpp in Sources */,
-				A94A6BE422B17BBC00C661C6 /* validate_builtins.cpp in Sources */,
-				A94A6A6822B17BBC00C661C6 /* def_use_manager.cpp in Sources */,
-				A94A6AB422B17BBC00C661C6 /* pass_manager.cpp in Sources */,
-				A94A69C422B17BBC00C661C6 /* opcode.cpp in Sources */,
-				A94A6A4C22B17BBC00C661C6 /* ir_loader.cpp in Sources */,
-				A94A69FE22B17BBC00C661C6 /* freeze_spec_constant_value_pass.cpp in Sources */,
-				A94A69CC22B17BBC00C661C6 /* optimizer.cpp in Sources */,
-				A94A6BCE22B17BBC00C661C6 /* validate_cfg.cpp in Sources */,
-				A94A699822B17BBB00C661C6 /* spirv_fuzzer_options.cpp in Sources */,
-				A94A69EE22B17BBC00C661C6 /* code_sink.cpp in Sources */,
-				A94A696022B17BBB00C661C6 /* pch_source_reduce.cpp in Sources */,
-				A94A6BC822B17BBC00C661C6 /* text_handler.cpp in Sources */,
-				A94A69FA22B17BBC00C661C6 /* decoration_manager.cpp in Sources */,
-				A94A6A9A22B17BBC00C661C6 /* process_lines_pass.cpp in Sources */,
-				A94A697222B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.cpp in Sources */,
-				A94A693422B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.cpp in Sources */,
-				A94A68EE22B17BBB00C661C6 /* spirv_target_env.cpp in Sources */,
-				A94A6BE022B17BBC00C661C6 /* validate_decorations.cpp in Sources */,
-				A94A6C1A22B17BBD00C661C6 /* validate_execution_limitations.cpp in Sources */,
-				A94A6BF822B17BBD00C661C6 /* validate_adjacency.cpp in Sources */,
-				A94A692222B17BBB00C661C6 /* remove_selection_reduction_opportunity.cpp in Sources */,
-				A94A696E22B17BBB00C661C6 /* reduction_opportunity.cpp in Sources */,
-				A94A6A2222B17BBC00C661C6 /* strip_debug_info_pass.cpp in Sources */,
-				A94A6AFA22B17BBC00C661C6 /* redundancy_elimination.cpp in Sources */,
-				A94A6A5A22B17BBC00C661C6 /* vector_dce.cpp in Sources */,
-				A94A69B622B17BBB00C661C6 /* spirv_reducer_options.cpp in Sources */,
-				A94A6A6A22B17BBC00C661C6 /* strip_reflect_info_pass.cpp in Sources */,
-				A94A6BD822B17BBC00C661C6 /* validate_scopes.cpp in Sources */,
-				A94A6BB222B17BBC00C661C6 /* diagnostic.cpp in Sources */,
-				A94A6ACE22B17BBC00C661C6 /* block_merge_pass.cpp in Sources */,
-				A94A69C222B17BBC00C661C6 /* software_version.cpp in Sources */,
-				A94A6C0022B17BBD00C661C6 /* validate_id.cpp in Sources */,
-				A94A6BDA22B17BBC00C661C6 /* validate_atomics.cpp in Sources */,
-				A94A690E22B17BBB00C661C6 /* string_utils.cpp in Sources */,
-				A94A6A1422B17BBC00C661C6 /* dominator_tree.cpp in Sources */,
-				A94A69FC22B17BBC00C661C6 /* local_single_block_elim_pass.cpp in Sources */,
-				A94A6A6E22B17BBC00C661C6 /* ccp_pass.cpp in Sources */,
-				A94A6AAE22B17BBC00C661C6 /* block_merge_util.cpp in Sources */,
-				A94A6B3A22B17BBC00C661C6 /* basic_block.cpp in Sources */,
-				A94A6BE222B17BBC00C661C6 /* validate_debug.cpp in Sources */,
-				A94A691622B17BBB00C661C6 /* parse_number.cpp in Sources */,
-				A94A6BFA22B17BBD00C661C6 /* validate_conversion.cpp in Sources */,
-				A94A6C2622B17BBD00C661C6 /* validation_state.cpp in Sources */,
-				A94A6B5022B17BBC00C661C6 /* scalar_analysis_simplification.cpp in Sources */,
-				A94A6B1E22B17BBC00C661C6 /* decompose_initialized_variables_pass.cpp in Sources */,
-				A94A6BEE22B17BBD00C661C6 /* validate_bitwise.cpp in Sources */,
-				A94A696422B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.cpp in Sources */,
-				A94A6BF222B17BBD00C661C6 /* construct.cpp in Sources */,
-				A94A69BE22B17BBB00C661C6 /* name_mapper.cpp in Sources */,
-				A94A692E22B17BBB00C661C6 /* reduction_util.cpp in Sources */,
-				A94A698A22B17BBB00C661C6 /* remove_block_reduction_opportunity.cpp in Sources */,
-				A94A6B3022B17BBC00C661C6 /* struct_cfg_analysis.cpp in Sources */,
-				A94A6A3622B17BBC00C661C6 /* dead_variable_elimination.cpp in Sources */,
-				A94A6BB622B17BBC00C661C6 /* libspirv.cpp in Sources */,
-				A94A6A6622B17BBC00C661C6 /* common_uniform_elim_pass.cpp in Sources */,
-				A94A6AFE22B17BBC00C661C6 /* workaround1209.cpp in Sources */,
-				A94A6C0622B17BBD00C661C6 /* validate_mode_setting.cpp in Sources */,
-				A94A6B3822B17BBC00C661C6 /* local_access_chain_convert_pass.cpp in Sources */,
-				A94A69F022B17BBC00C661C6 /* types.cpp in Sources */,
-				A94A6C1222B17BBD00C661C6 /* validate_literals.cpp in Sources */,
-				A94A6A3022B17BBC00C661C6 /* mem_pass.cpp in Sources */,
-				A94A68F822B17BBB00C661C6 /* assembly_grammar.cpp in Sources */,
-				A94A6BF022B17BBD00C661C6 /* validate_extensions.cpp in Sources */,
-				A94A6BEC22B17BBD00C661C6 /* validate_constants.cpp in Sources */,
-				A94A69D222B17BBC00C661C6 /* loop_utils.cpp in Sources */,
-				A94A6A1222B17BBC00C661C6 /* loop_fission.cpp in Sources */,
-				A94A698622B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp in Sources */,
-				A94A694A22B17BBB00C661C6 /* change_operand_reduction_opportunity.cpp in Sources */,
-				A94A69DA22B17BBC00C661C6 /* combine_access_chains.cpp in Sources */,
-				A94A6A9622B17BBC00C661C6 /* instruction_list.cpp in Sources */,
-				A94A6A7422B17BBC00C661C6 /* pch_source_opt.cpp in Sources */,
-				A94A694022B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.cpp in Sources */,
-				A94A69B822B17BBB00C661C6 /* parsed_operand.cpp in Sources */,
-				A94A6A5222B17BBC00C661C6 /* eliminate_dead_functions_pass.cpp in Sources */,
-				A94A6A1E22B17BBC00C661C6 /* const_folding_rules.cpp in Sources */,
-				A94A6BD622B17BBC00C661C6 /* validate_non_uniform.cpp in Sources */,
-				A94A6AEA22B17BBC00C661C6 /* loop_dependence_helpers.cpp in Sources */,
-				A94A6C0E22B17BBD00C661C6 /* validate_memory.cpp in Sources */,
-				A94A6AF422B17BBC00C661C6 /* scalar_replacement_pass.cpp in Sources */,
-				A94A695222B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp in Sources */,
-				A94A691822B17BBB00C661C6 /* bit_vector.cpp in Sources */,
-				A94A6ACA22B17BBC00C661C6 /* scalar_analysis.cpp in Sources */,
-				A94A6C1C22B17BBD00C661C6 /* validate_layout.cpp in Sources */,
-				A94A6AE622B17BBC00C661C6 /* propagator.cpp in Sources */,
-				A94A6A9422B17BBC00C661C6 /* function.cpp in Sources */,
-				A94A69C022B17BBB00C661C6 /* linker.cpp in Sources */,
-				A94A6B1C22B17BBC00C661C6 /* dominator_analysis.cpp in Sources */,
-				A94A6A7A22B17BBC00C661C6 /* eliminate_dead_functions_util.cpp in Sources */,
-				A94A68FC22B17BBB00C661C6 /* extensions.cpp in Sources */,
-				A94A6BE822B17BBC00C661C6 /* validate.cpp in Sources */,
-				A94A6A1A22B17BBC00C661C6 /* eliminate_dead_constant_pass.cpp in Sources */,
-				A94A693022B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.cpp in Sources */,
-				A94A694822B17BBB00C661C6 /* merge_blocks_reduction_opportunity.cpp in Sources */,
-				A94A6B4A22B17BBC00C661C6 /* upgrade_memory_model.cpp in Sources */,
-				A94A6BCC22B17BBC00C661C6 /* validate_misc.cpp in Sources */,
-				A94A6A0422B17BBC00C661C6 /* inst_bindless_check_pass.cpp in Sources */,
-				A94A699E22B17BBB00C661C6 /* print.cpp in Sources */,
-				A94A699C22B17BBB00C661C6 /* spirv_validator_options.cpp in Sources */,
-				A94A692822B17BBB00C661C6 /* reduction_pass.cpp in Sources */,
-				A94A69DC22B17BBC00C661C6 /* build_module.cpp in Sources */,
-				A94A6AF022B17BBC00C661C6 /* fold.cpp in Sources */,
-				A94A6A0622B17BBC00C661C6 /* local_redundancy_elimination.cpp in Sources */,
-				A94A690A22B17BBB00C661C6 /* timer.cpp in Sources */,
-				A94A6A7822B17BBC00C661C6 /* aggressive_dead_code_elim_pass.cpp in Sources */,
-				A94A6BD422B17BBC00C661C6 /* validate_barriers.cpp in Sources */,
-				A94A699022B17BBB00C661C6 /* spirv_optimizer_options.cpp in Sources */,
-				A94A6A0E22B17BBC00C661C6 /* feature_manager.cpp in Sources */,
-				A94A6C1622B17BBD00C661C6 /* validate_type.cpp in Sources */,
-				A94A698822B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.cpp in Sources */,
-				A94A6B5A22B17BBC00C661C6 /* compact_ids_pass.cpp in Sources */,
-				A94A6A4222B17BBC00C661C6 /* type_manager.cpp in Sources */,
-				A94A695E22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.cpp in Sources */,
-				A94A6BDE22B17BBC00C661C6 /* validate_instruction.cpp in Sources */,
-				A94A6A0822B17BBC00C661C6 /* instrument_pass.cpp in Sources */,
-				A94A6B5C22B17BBC00C661C6 /* loop_peeling.cpp in Sources */,
-				A94A6ABC22B17BBC00C661C6 /* loop_fusion_pass.cpp in Sources */,
-				A94A6A3E22B17BBC00C661C6 /* loop_unswitch_pass.cpp in Sources */,
-				A94A6C0422B17BBD00C661C6 /* validate_arithmetics.cpp in Sources */,
-				A94A69AA22B17BBB00C661C6 /* binary.cpp in Sources */,
-				A94A6AC622B17BBC00C661C6 /* dead_insert_elim_pass.cpp in Sources */,
-				A94A6BF422B17BBD00C661C6 /* function.cpp in Sources */,
-				A94A6ADE22B17BBC00C661C6 /* local_single_store_elim_pass.cpp in Sources */,
-				A94A6BCA22B17BBC00C661C6 /* validate_annotation.cpp in Sources */,
-				A94A6A5022B17BBC00C661C6 /* licm_pass.cpp in Sources */,
-				A94A692A22B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.cpp in Sources */,
-				A94A6BE622B17BBC00C661C6 /* validate_interfaces.cpp in Sources */,
-				A94A6A3422B17BBC00C661C6 /* remove_duplicates_pass.cpp in Sources */,
-				A94A69F822B17BBC00C661C6 /* strip_atomic_counter_memory_pass.cpp in Sources */,
-				A94A6C0C22B17BBD00C661C6 /* validate_derivatives.cpp in Sources */,
-				A94A6A8822B17BBC00C661C6 /* ir_context.cpp in Sources */,
-				A94A6A7E22B17BBC00C661C6 /* dead_branch_elim_pass.cpp in Sources */,
-				A94A6A9022B17BBC00C661C6 /* local_ssa_elim_pass.cpp in Sources */,
-				A94A6A1022B17BBC00C661C6 /* pass.cpp in Sources */,
-				A94A6A4022B17BBC00C661C6 /* unify_const_pass.cpp in Sources */,
-				A94A6BBE22B17BBC00C661C6 /* operand.cpp in Sources */,
-				A94A6C2022B17BBD00C661C6 /* validate_function.cpp in Sources */,
-				A94A698022B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.cpp in Sources */,
-				A94A6A7C22B17BBC00C661C6 /* simplification_pass.cpp in Sources */,
-				A94A6B4822B17BBC00C661C6 /* loop_fusion.cpp in Sources */,
-				A94A69AE22B17BBB00C661C6 /* enum_string_mapping.cpp in Sources */,
-				A94A6C0822B17BBD00C661C6 /* validate_memory_semantics.cpp in Sources */,
-				A94A69A422B17BBB00C661C6 /* spirv_endian.cpp in Sources */,
+				A9C2F30F22E7833D001763CE /* dead_insert_elim_pass.cpp in Sources */,
+				A9C2F2BD22E7833D001763CE /* pch_source_opt.cpp in Sources */,
+				A9C2F28522E7833D001763CE /* module.cpp in Sources */,
+				A9C2F30522E7833D001763CE /* loop_fusion_pass.cpp in Sources */,
+				A9C2F33122E7833D001763CE /* loop_dependence_helpers.cpp in Sources */,
+				A9C2F44F22E7833D001763CE /* validate_builtins.cpp in Sources */,
+				A9C2F1C322E7833D001763CE /* operand_to_dominating_id_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F18522E7833D001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.cpp in Sources */,
+				A9C2F44122E7833D001763CE /* validate_non_uniform.cpp in Sources */,
+				A9C2F2B322E7833D001763CE /* strip_reflect_info_pass.cpp in Sources */,
+				A9C2F2A922E7833D001763CE /* loop_unroller.cpp in Sources */,
+				A9C2F47122E7833D001763CE /* validate_arithmetics.cpp in Sources */,
+				A9C2F26722E7833D001763CE /* cfg_cleanup_pass.cpp in Sources */,
+				A9C2F44B22E7833D001763CE /* validate_decorations.cpp in Sources */,
+				A9C2F3A322E7833D001763CE /* loop_peeling.cpp in Sources */,
+				A9C2F21B22E7833D001763CE /* register_pressure.cpp in Sources */,
+				A9C2F1A322E7833D001763CE /* remove_instruction_reduction_opportunity.cpp in Sources */,
+				A9C2F27122E7833D001763CE /* loop_dependence.cpp in Sources */,
+				A9C2F36322E7833D001763CE /* dominator_analysis.cpp in Sources */,
+				A9C2F26122E7833D001763CE /* merge_return_pass.cpp in Sources */,
+				A9C2F28F22E7833D001763CE /* generate_webgpu_initializers_pass.cpp in Sources */,
+				A9C2F47522E7833D001763CE /* validate_memory_semantics.cpp in Sources */,
+				A9C2F1AD22E7833D001763CE /* reducer.cpp in Sources */,
+				A9C2F46722E7833D001763CE /* validate_small_type_uses.cpp in Sources */,
+				A9C2F2C722E7833D001763CE /* dead_branch_elim_pass.cpp in Sources */,
+				A9C2F2C522E7833D001763CE /* simplification_pass.cpp in Sources */,
+				A9C2F38F22E7833D001763CE /* loop_fusion.cpp in Sources */,
+				A9C2F29322E7833D001763CE /* inline_pass.cpp in Sources */,
+				A9C2F28722E7833D001763CE /* fold_spec_constant_op_and_composite_pass.cpp in Sources */,
+				A9C2F2F522E7833D001763CE /* strength_reduction_pass.cpp in Sources */,
+				A9C2F2A122E7833D001763CE /* split_invalid_unreachable_pass.cpp in Sources */,
+				A9C2F35B22E7833D001763CE /* inline_opaque_pass.cpp in Sources */,
+				A9C2F14122E7833D001763CE /* text.cpp in Sources */,
+				A9C2F48322E7833D001763CE /* validate_type.cpp in Sources */,
+				A9C2F42F22E7833D001763CE /* disassemble.cpp in Sources */,
+				A9C2F2C922E7833D001763CE /* flatten_decoration_pass.cpp in Sources */,
+				A9C2F21322E7833D001763CE /* ext_inst.cpp in Sources */,
+				A9C2F14922E7833D001763CE /* pch_source.cpp in Sources */,
+				A9C2F2ED22E7833D001763CE /* if_conversion.cpp in Sources */,
+				A9C2F24122E7833D001763CE /* cfg.cpp in Sources */,
+				A9C2F31722E7833D001763CE /* block_merge_pass.cpp in Sources */,
+				A9C2F45D22E7833D001763CE /* construct.cpp in Sources */,
+				A9C2F2DD22E7833D001763CE /* function.cpp in Sources */,
+				A9C2F33722E7833D001763CE /* fold.cpp in Sources */,
+				A9C2F26F22E7833D001763CE /* ssa_rewrite_pass.cpp in Sources */,
+				A9C2F2D722E7833D001763CE /* loop_descriptor.cpp in Sources */,
+				A9C2F18722E7833D001763CE /* remove_function_reduction_opportunity.cpp in Sources */,
+				A9C2F18D22E7833D001763CE /* remove_selection_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F49322E7833D001763CE /* validation_state.cpp in Sources */,
+				A9C2F2AB22E7833D001763CE /* constants.cpp in Sources */,
+				A9C2F35722E7833D001763CE /* value_number_table.cpp in Sources */,
+				A9C2F18F22E7833D001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp in Sources */,
+				A9C2F39122E7833D001763CE /* upgrade_memory_model.cpp in Sources */,
+				A9C2F1B722E7833D001763CE /* merge_blocks_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F16922E7833D001763CE /* table.cpp in Sources */,
+				A9C2F20F22E7833D001763CE /* opcode.cpp in Sources */,
+				A9C2F29722E7833D001763CE /* ir_loader.cpp in Sources */,
+				A9C2F43922E7833D001763CE /* validate_cfg.cpp in Sources */,
+				A9C2F3A122E7833D001763CE /* compact_ids_pass.cpp in Sources */,
+				A9C2F2F722E7833D001763CE /* block_merge_util.cpp in Sources */,
+				A9C2F24922E7833D001763CE /* freeze_spec_constant_value_pass.cpp in Sources */,
+				A9C2F33322E7833D001763CE /* set_spec_constant_default_value_pass.cpp in Sources */,
+				A9C2F21722E7833D001763CE /* optimizer.cpp in Sources */,
+				A9C2F37F22E7833D001763CE /* local_access_chain_convert_pass.cpp in Sources */,
+				A9C2F32D22E7833D001763CE /* propagator.cpp in Sources */,
+				A9C2F48922E7833D001763CE /* validate_layout.cpp in Sources */,
+				A9C2F47B22E7833D001763CE /* validate_memory.cpp in Sources */,
+				A9C2F48B22E7833D001763CE /* basic_block.cpp in Sources */,
+				A9C2F1E322E7833D001763CE /* spirv_fuzzer_options.cpp in Sources */,
+				A9C2F47D22E7833D001763CE /* validate_image.cpp in Sources */,
+				A9C2F45122E7833D001763CE /* validate_interfaces.cpp in Sources */,
+				A9C2F48722E7833D001763CE /* validate_execution_limitations.cpp in Sources */,
+				A9C2F23922E7833D001763CE /* code_sink.cpp in Sources */,
+				A9C2F1AB22E7833D001763CE /* pch_source_reduce.cpp in Sources */,
+				A9C2F24522E7833D001763CE /* decoration_manager.cpp in Sources */,
+				A9C2F31322E7833D001763CE /* scalar_analysis.cpp in Sources */,
+				A9C2F1BD22E7833D001763CE /* change_operand_to_undef_reduction_opportunity.cpp in Sources */,
+				A9C2F33B22E7833D001763CE /* scalar_replacement_pass.cpp in Sources */,
+				A9C2F17F22E7833D001763CE /* remove_function_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F13922E7833D001763CE /* spirv_target_env.cpp in Sources */,
+				A9C2F16D22E7833D001763CE /* remove_selection_reduction_opportunity.cpp in Sources */,
+				A9C2F1B922E7833D001763CE /* reduction_opportunity.cpp in Sources */,
+				A9C2F26D22E7833D001763CE /* strip_debug_info_pass.cpp in Sources */,
+				A9C2F2FB22E7833D001763CE /* copy_prop_arrays.cpp in Sources */,
+				A9C2F47322E7833D001763CE /* validate_mode_setting.cpp in Sources */,
+				A9C2F46D22E7833D001763CE /* validate_id.cpp in Sources */,
+				A9C2F39722E7833D001763CE /* scalar_analysis_simplification.cpp in Sources */,
+				A9C2F45322E7833D001763CE /* validate.cpp in Sources */,
+				A9C2F43522E7833D001763CE /* validate_annotation.cpp in Sources */,
+				A9C2F2A522E7833D001763CE /* vector_dce.cpp in Sources */,
+				A9C2F20122E7833D001763CE /* spirv_reducer_options.cpp in Sources */,
+				A9C2F20D22E7833D001763CE /* software_version.cpp in Sources */,
+				A9C2F15922E7833D001763CE /* string_utils.cpp in Sources */,
+				A9C2F25F22E7833D001763CE /* dominator_tree.cpp in Sources */,
+				A9C2F43F22E7833D001763CE /* validate_barriers.cpp in Sources */,
+				A9C2F37722E7833D001763CE /* struct_cfg_analysis.cpp in Sources */,
+				A9C2F24722E7833D001763CE /* local_single_block_elim_pass.cpp in Sources */,
+				A9C2F16122E7833D001763CE /* parse_number.cpp in Sources */,
+				A9C2F1AF22E7833D001763CE /* operand_to_undef_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F20922E7833D001763CE /* name_mapper.cpp in Sources */,
+				A9C2F2DF22E7833D001763CE /* instruction_list.cpp in Sources */,
+				A9C2F44D22E7833D001763CE /* validate_debug.cpp in Sources */,
+				A9C2F35122E7833D001763CE /* reduce_load_size.cpp in Sources */,
+				A9C2F17922E7833D001763CE /* reduction_util.cpp in Sources */,
+				A9C2F41D22E7833D001763CE /* diagnostic.cpp in Sources */,
+				A9C2F2C122E7833D001763CE /* aggressive_dead_code_elim_pass.cpp in Sources */,
+				A9C2F1D522E7833D001763CE /* remove_block_reduction_opportunity.cpp in Sources */,
+				A9C2F28122E7833D001763CE /* dead_variable_elimination.cpp in Sources */,
+				A9C2F23B22E7833D001763CE /* types.cpp in Sources */,
+				A9C2F27B22E7833D001763CE /* mem_pass.cpp in Sources */,
+				A9C2F14322E7833D001763CE /* assembly_grammar.cpp in Sources */,
+				A9C2F47922E7833D001763CE /* validate_derivatives.cpp in Sources */,
+				A9C2F21D22E7833D001763CE /* loop_utils.cpp in Sources */,
+				A9C2F44922E7833D001763CE /* validate_instruction.cpp in Sources */,
+				A9C2F25D22E7833D001763CE /* loop_fission.cpp in Sources */,
+				A9C2F44322E7833D001763CE /* validate_scopes.cpp in Sources */,
+				A9C2F49122E7833D001763CE /* validate_composites.cpp in Sources */,
+				A9C2F45F22E7833D001763CE /* function.cpp in Sources */,
+				A9C2F1D122E7833D001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp in Sources */,
+				A9C2F19522E7833D001763CE /* change_operand_reduction_opportunity.cpp in Sources */,
+				A9C2F48122E7833D001763CE /* instruction.cpp in Sources */,
+				A9C2F35D22E7833D001763CE /* replace_invalid_opc.cpp in Sources */,
+				A9C2F22522E7833D001763CE /* combine_access_chains.cpp in Sources */,
+				A9C2F18B22E7833D001763CE /* simple_conditional_branch_to_branch_opportunity_finder.cpp in Sources */,
+				A9C2F20322E7833D001763CE /* parsed_operand.cpp in Sources */,
+				A9C2F29D22E7833D001763CE /* eliminate_dead_functions_pass.cpp in Sources */,
+				A9C2F2FD22E7833D001763CE /* pass_manager.cpp in Sources */,
+				A9C2F26922E7833D001763CE /* const_folding_rules.cpp in Sources */,
+				A9C2F42922E7833D001763CE /* operand.cpp in Sources */,
+				A9C2F19D22E7833D001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F36522E7833D001763CE /* decompose_initialized_variables_pass.cpp in Sources */,
+				A9C2F34522E7833D001763CE /* workaround1209.cpp in Sources */,
+				A9C2F16322E7833D001763CE /* bit_vector.cpp in Sources */,
+				A9C2F20B22E7833D001763CE /* linker.cpp in Sources */,
+				A9C2F14722E7833D001763CE /* extensions.cpp in Sources */,
+				A9C2F46922E7833D001763CE /* validate_datarules.cpp in Sources */,
+				A9C2F43722E7833D001763CE /* validate_misc.cpp in Sources */,
+				A9C2F2FF22E7833D001763CE /* inline_exhaustive_pass.cpp in Sources */,
+				A9C2F26522E7833D001763CE /* eliminate_dead_constant_pass.cpp in Sources */,
+				A9C2F17B22E7833D001763CE /* structured_loop_to_selection_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F19322E7833D001763CE /* merge_blocks_reduction_opportunity.cpp in Sources */,
+				A9C2F2E322E7833D001763CE /* process_lines_pass.cpp in Sources */,
+				A9C2F24F22E7833D001763CE /* inst_bindless_check_pass.cpp in Sources */,
+				A9C2F1E922E7833D001763CE /* print.cpp in Sources */,
+				A9C2F1E722E7833D001763CE /* spirv_validator_options.cpp in Sources */,
+				A9C2F44522E7833D001763CE /* validate_atomics.cpp in Sources */,
+				A9C2F17322E7833D001763CE /* reduction_pass.cpp in Sources */,
+				A9C2F46522E7833D001763CE /* validate_conversion.cpp in Sources */,
+				A9C2F22722E7833D001763CE /* build_module.cpp in Sources */,
+				A9C2F39D22E7833D001763CE /* legalize_vector_shuffle_pass.cpp in Sources */,
+				A9C2F25122E7833D001763CE /* local_redundancy_elimination.cpp in Sources */,
+				A9C2F15522E7833D001763CE /* timer.cpp in Sources */,
+				A9C2F2F322E7833D001763CE /* eliminate_dead_members_pass.cpp in Sources */,
+				A9C2F45922E7833D001763CE /* validate_bitwise.cpp in Sources */,
+				A9C2F2D922E7833D001763CE /* local_ssa_elim_pass.cpp in Sources */,
+				A9C2F2E122E7833D001763CE /* composite.cpp in Sources */,
+				A9C2F42122E7833D001763CE /* libspirv.cpp in Sources */,
+				A9C2F1DB22E7833D001763CE /* spirv_optimizer_options.cpp in Sources */,
+				A9C2F25922E7833D001763CE /* feature_manager.cpp in Sources */,
+				A9C2F1D322E7833D001763CE /* structured_loop_to_selection_reduction_opportunity.cpp in Sources */,
+				A9C2F28D22E7833D001763CE /* type_manager.cpp in Sources */,
+				A9C2F2B722E7833D001763CE /* ccp_pass.cpp in Sources */,
+				A9C2F46322E7833D001763CE /* validate_adjacency.cpp in Sources */,
+				A9C2F1A922E7833D001763CE /* remove_opname_instruction_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F25322E7833D001763CE /* instrument_pass.cpp in Sources */,
+				A9C2F43B22E7833D001763CE /* validate_capability.cpp in Sources */,
+				A9C2F47F22E7833D001763CE /* validate_literals.cpp in Sources */,
+				A9C2F34122E7833D001763CE /* redundancy_elimination.cpp in Sources */,
+				A9C2F45722E7833D001763CE /* validate_constants.cpp in Sources */,
+				A9C2F34D22E7833D001763CE /* instruction.cpp in Sources */,
+				A9C2F28922E7833D001763CE /* loop_unswitch_pass.cpp in Sources */,
+				A9C2F1F522E7833D001763CE /* binary.cpp in Sources */,
+				A9C2F29B22E7833D001763CE /* licm_pass.cpp in Sources */,
+				A9C2F17522E7833D001763CE /* operand_to_const_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F27F22E7833D001763CE /* remove_duplicates_pass.cpp in Sources */,
+				A9C2F48D22E7833D001763CE /* validate_function.cpp in Sources */,
+				A9C2F24322E7833D001763CE /* strip_atomic_counter_memory_pass.cpp in Sources */,
+				A9C2F49522E7833D001763CE /* validate_primitives.cpp in Sources */,
+				A9C2F43322E7833D001763CE /* text_handler.cpp in Sources */,
+				A9C2F25B22E7833D001763CE /* pass.cpp in Sources */,
+				A9C2F32522E7833D001763CE /* local_single_store_elim_pass.cpp in Sources */,
+				A9C2F45B22E7833D001763CE /* validate_extensions.cpp in Sources */,
+				A9C2F47722E7833D001763CE /* validate_logicals.cpp in Sources */,
+				A9C2F35522E7833D001763CE /* fix_storage_class.cpp in Sources */,
+				A9C2F32922E7833D001763CE /* private_to_local_pass.cpp in Sources */,
+				A9C2F28B22E7833D001763CE /* unify_const_pass.cpp in Sources */,
+				A9C2F38122E7833D001763CE /* basic_block.cpp in Sources */,
+				A9C2F1CB22E7833D001763CE /* remove_block_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F2C322E7833D001763CE /* eliminate_dead_functions_util.cpp in Sources */,
+				A9C2F1F922E7833D001763CE /* enum_string_mapping.cpp in Sources */,
+				A9C2F1EF22E7833D001763CE /* spirv_endian.cpp in Sources */,
+				A9C2F2D122E7833D001763CE /* ir_context.cpp in Sources */,
+				A9C2F2B122E7833D001763CE /* def_use_manager.cpp in Sources */,
+				A9C2F2CD22E7833D001763CE /* folding_rules.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3188,200 +3182,200 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A94A6A3B22B17BBC00C661C6 /* module.cpp in Sources */,
-				A94A6B5722B17BBC00C661C6 /* legalize_vector_shuffle_pass.cpp in Sources */,
-				A94A6AAB22B17BBC00C661C6 /* eliminate_dead_members_pass.cpp in Sources */,
-				A94A6B1522B17BBC00C661C6 /* inline_opaque_pass.cpp in Sources */,
-				A94A697922B17BBB00C661C6 /* operand_to_dominating_id_reduction_opportunity_finder.cpp in Sources */,
-				A94A693B22B17BBB00C661C6 /* simple_conditional_branch_to_branch_reduction_opportunity.cpp in Sources */,
-				A94A6AA522B17BBC00C661C6 /* if_conversion.cpp in Sources */,
-				A94A6A5F22B17BBC00C661C6 /* loop_unroller.cpp in Sources */,
-				A94A6A1D22B17BBC00C661C6 /* cfg_cleanup_pass.cpp in Sources */,
-				A94A6C0B22B17BBD00C661C6 /* validate_logicals.cpp in Sources */,
-				A94A69D122B17BBC00C661C6 /* register_pressure.cpp in Sources */,
-				A94A695922B17BBB00C661C6 /* remove_instruction_reduction_opportunity.cpp in Sources */,
-				A94A6A2722B17BBC00C661C6 /* loop_dependence.cpp in Sources */,
-				A94A6B0F22B17BBC00C661C6 /* fix_storage_class.cpp in Sources */,
-				A94A6A8F22B17BBC00C661C6 /* loop_descriptor.cpp in Sources */,
-				A94A6C1F22B17BBD00C661C6 /* basic_block.cpp in Sources */,
-				A94A6A1722B17BBC00C661C6 /* merge_return_pass.cpp in Sources */,
-				A94A6AB322B17BBC00C661C6 /* copy_prop_arrays.cpp in Sources */,
-				A94A6C1522B17BBD00C661C6 /* instruction.cpp in Sources */,
-				A94A6A4522B17BBC00C661C6 /* generate_webgpu_initializers_pass.cpp in Sources */,
-				A94A6AED22B17BBC00C661C6 /* set_spec_constant_default_value_pass.cpp in Sources */,
-				A94A696322B17BBB00C661C6 /* reducer.cpp in Sources */,
-				A94A6BFD22B17BBD00C661C6 /* validate_datarules.cpp in Sources */,
-				A94A6BD122B17BBC00C661C6 /* validate_capability.cpp in Sources */,
-				A94A6A4922B17BBC00C661C6 /* inline_pass.cpp in Sources */,
-				A94A6AAD22B17BBC00C661C6 /* strength_reduction_pass.cpp in Sources */,
-				A94A6B1122B17BBC00C661C6 /* value_number_table.cpp in Sources */,
-				A94A6C1122B17BBD00C661C6 /* validate_image.cpp in Sources */,
-				A94A6B0722B17BBC00C661C6 /* instruction.cpp in Sources */,
-				A94A6BC522B17BBC00C661C6 /* disassemble.cpp in Sources */,
-				A94A6A3D22B17BBC00C661C6 /* fold_spec_constant_op_and_composite_pass.cpp in Sources */,
-				A94A6A5722B17BBC00C661C6 /* split_invalid_unreachable_pass.cpp in Sources */,
-				A94A68F722B17BBB00C661C6 /* text.cpp in Sources */,
-				A94A69C922B17BBC00C661C6 /* ext_inst.cpp in Sources */,
-				A94A6C2922B17BBD00C661C6 /* validate_primitives.cpp in Sources */,
-				A94A68FF22B17BBB00C661C6 /* pch_source.cpp in Sources */,
-				A94A69F722B17BBC00C661C6 /* cfg.cpp in Sources */,
-				A94A6A8522B17BBC00C661C6 /* folding_rules.cpp in Sources */,
-				A94A6AE322B17BBC00C661C6 /* private_to_local_pass.cpp in Sources */,
-				A94A6A2522B17BBC00C661C6 /* ssa_rewrite_pass.cpp in Sources */,
-				A94A6B1722B17BBC00C661C6 /* replace_invalid_opc.cpp in Sources */,
-				A94A693D22B17BBB00C661C6 /* remove_function_reduction_opportunity.cpp in Sources */,
-				A94A694322B17BBB00C661C6 /* remove_selection_reduction_opportunity_finder.cpp in Sources */,
-				A94A6B0B22B17BBC00C661C6 /* reduce_load_size.cpp in Sources */,
-				A94A6A6122B17BBC00C661C6 /* constants.cpp in Sources */,
-				A94A694522B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp in Sources */,
-				A94A6A8122B17BBC00C661C6 /* flatten_decoration_pass.cpp in Sources */,
-				A94A6A9922B17BBC00C661C6 /* composite.cpp in Sources */,
-				A94A696D22B17BBB00C661C6 /* merge_blocks_reduction_opportunity_finder.cpp in Sources */,
-				A94A6AB722B17BBC00C661C6 /* inline_exhaustive_pass.cpp in Sources */,
-				A94A6C2522B17BBD00C661C6 /* validate_composites.cpp in Sources */,
-				A94A691F22B17BBB00C661C6 /* table.cpp in Sources */,
-				A94A6BE522B17BBC00C661C6 /* validate_builtins.cpp in Sources */,
-				A94A6A6922B17BBC00C661C6 /* def_use_manager.cpp in Sources */,
-				A94A6AB522B17BBC00C661C6 /* pass_manager.cpp in Sources */,
-				A94A69C522B17BBC00C661C6 /* opcode.cpp in Sources */,
-				A94A6A4D22B17BBC00C661C6 /* ir_loader.cpp in Sources */,
-				A94A69FF22B17BBC00C661C6 /* freeze_spec_constant_value_pass.cpp in Sources */,
-				A94A69CD22B17BBC00C661C6 /* optimizer.cpp in Sources */,
-				A94A6BCF22B17BBC00C661C6 /* validate_cfg.cpp in Sources */,
-				A94A699922B17BBB00C661C6 /* spirv_fuzzer_options.cpp in Sources */,
-				A94A69EF22B17BBC00C661C6 /* code_sink.cpp in Sources */,
-				A94A696122B17BBB00C661C6 /* pch_source_reduce.cpp in Sources */,
-				A94A6BC922B17BBC00C661C6 /* text_handler.cpp in Sources */,
-				A94A69FB22B17BBC00C661C6 /* decoration_manager.cpp in Sources */,
-				A94A6A9B22B17BBC00C661C6 /* process_lines_pass.cpp in Sources */,
-				A94A697322B17BBB00C661C6 /* change_operand_to_undef_reduction_opportunity.cpp in Sources */,
-				A94A693522B17BBB00C661C6 /* remove_function_reduction_opportunity_finder.cpp in Sources */,
-				A94A68EF22B17BBB00C661C6 /* spirv_target_env.cpp in Sources */,
-				A94A6BE122B17BBC00C661C6 /* validate_decorations.cpp in Sources */,
-				A94A6C1B22B17BBD00C661C6 /* validate_execution_limitations.cpp in Sources */,
-				A94A6BF922B17BBD00C661C6 /* validate_adjacency.cpp in Sources */,
-				A94A692322B17BBB00C661C6 /* remove_selection_reduction_opportunity.cpp in Sources */,
-				A94A696F22B17BBB00C661C6 /* reduction_opportunity.cpp in Sources */,
-				A94A6A2322B17BBC00C661C6 /* strip_debug_info_pass.cpp in Sources */,
-				A94A6AFB22B17BBC00C661C6 /* redundancy_elimination.cpp in Sources */,
-				A94A6A5B22B17BBC00C661C6 /* vector_dce.cpp in Sources */,
-				A94A69B722B17BBB00C661C6 /* spirv_reducer_options.cpp in Sources */,
-				A94A6A6B22B17BBC00C661C6 /* strip_reflect_info_pass.cpp in Sources */,
-				A94A6BD922B17BBC00C661C6 /* validate_scopes.cpp in Sources */,
-				A94A6BB322B17BBC00C661C6 /* diagnostic.cpp in Sources */,
-				A94A6ACF22B17BBC00C661C6 /* block_merge_pass.cpp in Sources */,
-				A94A69C322B17BBC00C661C6 /* software_version.cpp in Sources */,
-				A94A6C0122B17BBD00C661C6 /* validate_id.cpp in Sources */,
-				A94A6BDB22B17BBC00C661C6 /* validate_atomics.cpp in Sources */,
-				A94A690F22B17BBB00C661C6 /* string_utils.cpp in Sources */,
-				A94A6A1522B17BBC00C661C6 /* dominator_tree.cpp in Sources */,
-				A94A69FD22B17BBC00C661C6 /* local_single_block_elim_pass.cpp in Sources */,
-				A94A6A6F22B17BBC00C661C6 /* ccp_pass.cpp in Sources */,
-				A94A6AAF22B17BBC00C661C6 /* block_merge_util.cpp in Sources */,
-				A94A6B3B22B17BBC00C661C6 /* basic_block.cpp in Sources */,
-				A94A6BE322B17BBC00C661C6 /* validate_debug.cpp in Sources */,
-				A94A691722B17BBB00C661C6 /* parse_number.cpp in Sources */,
-				A94A6BFB22B17BBD00C661C6 /* validate_conversion.cpp in Sources */,
-				A94A6C2722B17BBD00C661C6 /* validation_state.cpp in Sources */,
-				A94A6B5122B17BBC00C661C6 /* scalar_analysis_simplification.cpp in Sources */,
-				A94A6B1F22B17BBC00C661C6 /* decompose_initialized_variables_pass.cpp in Sources */,
-				A94A6BEF22B17BBD00C661C6 /* validate_bitwise.cpp in Sources */,
-				A94A696522B17BBB00C661C6 /* operand_to_undef_reduction_opportunity_finder.cpp in Sources */,
-				A94A6BF322B17BBD00C661C6 /* construct.cpp in Sources */,
-				A94A69BF22B17BBB00C661C6 /* name_mapper.cpp in Sources */,
-				A94A692F22B17BBB00C661C6 /* reduction_util.cpp in Sources */,
-				A94A698B22B17BBB00C661C6 /* remove_block_reduction_opportunity.cpp in Sources */,
-				A94A6B3122B17BBC00C661C6 /* struct_cfg_analysis.cpp in Sources */,
-				A94A6A3722B17BBC00C661C6 /* dead_variable_elimination.cpp in Sources */,
-				A94A6BB722B17BBC00C661C6 /* libspirv.cpp in Sources */,
-				A94A6A6722B17BBC00C661C6 /* common_uniform_elim_pass.cpp in Sources */,
-				A94A6AFF22B17BBC00C661C6 /* workaround1209.cpp in Sources */,
-				A94A6C0722B17BBD00C661C6 /* validate_mode_setting.cpp in Sources */,
-				A94A6B3922B17BBC00C661C6 /* local_access_chain_convert_pass.cpp in Sources */,
-				A94A69F122B17BBC00C661C6 /* types.cpp in Sources */,
-				A94A6C1322B17BBD00C661C6 /* validate_literals.cpp in Sources */,
-				A94A6A3122B17BBC00C661C6 /* mem_pass.cpp in Sources */,
-				A94A68F922B17BBB00C661C6 /* assembly_grammar.cpp in Sources */,
-				A94A6BF122B17BBD00C661C6 /* validate_extensions.cpp in Sources */,
-				A94A6BED22B17BBD00C661C6 /* validate_constants.cpp in Sources */,
-				A94A69D322B17BBC00C661C6 /* loop_utils.cpp in Sources */,
-				A94A6A1322B17BBC00C661C6 /* loop_fission.cpp in Sources */,
-				A94A698722B17BBB00C661C6 /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp in Sources */,
-				A94A694B22B17BBB00C661C6 /* change_operand_reduction_opportunity.cpp in Sources */,
-				A94A69DB22B17BBC00C661C6 /* combine_access_chains.cpp in Sources */,
-				A94A6A9722B17BBC00C661C6 /* instruction_list.cpp in Sources */,
-				A94A6A7522B17BBC00C661C6 /* pch_source_opt.cpp in Sources */,
-				A94A694122B17BBB00C661C6 /* simple_conditional_branch_to_branch_opportunity_finder.cpp in Sources */,
-				A94A69B922B17BBB00C661C6 /* parsed_operand.cpp in Sources */,
-				A94A6A5322B17BBC00C661C6 /* eliminate_dead_functions_pass.cpp in Sources */,
-				A94A6A1F22B17BBC00C661C6 /* const_folding_rules.cpp in Sources */,
-				A94A6BD722B17BBC00C661C6 /* validate_non_uniform.cpp in Sources */,
-				A94A6AEB22B17BBC00C661C6 /* loop_dependence_helpers.cpp in Sources */,
-				A94A6C0F22B17BBD00C661C6 /* validate_memory.cpp in Sources */,
-				A94A6AF522B17BBC00C661C6 /* scalar_replacement_pass.cpp in Sources */,
-				A94A695322B17BBB00C661C6 /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp in Sources */,
-				A94A691922B17BBB00C661C6 /* bit_vector.cpp in Sources */,
-				A94A6ACB22B17BBC00C661C6 /* scalar_analysis.cpp in Sources */,
-				A94A6C1D22B17BBD00C661C6 /* validate_layout.cpp in Sources */,
-				A94A6AE722B17BBC00C661C6 /* propagator.cpp in Sources */,
-				A94A6A9522B17BBC00C661C6 /* function.cpp in Sources */,
-				A94A69C122B17BBB00C661C6 /* linker.cpp in Sources */,
-				A94A6B1D22B17BBC00C661C6 /* dominator_analysis.cpp in Sources */,
-				A94A6A7B22B17BBC00C661C6 /* eliminate_dead_functions_util.cpp in Sources */,
-				A94A68FD22B17BBB00C661C6 /* extensions.cpp in Sources */,
-				A94A6BE922B17BBC00C661C6 /* validate.cpp in Sources */,
-				A94A6A1B22B17BBC00C661C6 /* eliminate_dead_constant_pass.cpp in Sources */,
-				A94A693122B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity_finder.cpp in Sources */,
-				A94A694922B17BBB00C661C6 /* merge_blocks_reduction_opportunity.cpp in Sources */,
-				A94A6B4B22B17BBC00C661C6 /* upgrade_memory_model.cpp in Sources */,
-				A94A6BCD22B17BBC00C661C6 /* validate_misc.cpp in Sources */,
-				A94A6A0522B17BBC00C661C6 /* inst_bindless_check_pass.cpp in Sources */,
-				A94A699F22B17BBB00C661C6 /* print.cpp in Sources */,
-				A94A699D22B17BBB00C661C6 /* spirv_validator_options.cpp in Sources */,
-				A94A692922B17BBB00C661C6 /* reduction_pass.cpp in Sources */,
-				A94A69DD22B17BBC00C661C6 /* build_module.cpp in Sources */,
-				A94A6AF122B17BBC00C661C6 /* fold.cpp in Sources */,
-				A94A6A0722B17BBC00C661C6 /* local_redundancy_elimination.cpp in Sources */,
-				A94A690B22B17BBB00C661C6 /* timer.cpp in Sources */,
-				A94A6A7922B17BBC00C661C6 /* aggressive_dead_code_elim_pass.cpp in Sources */,
-				A94A6BD522B17BBC00C661C6 /* validate_barriers.cpp in Sources */,
-				A94A699122B17BBB00C661C6 /* spirv_optimizer_options.cpp in Sources */,
-				A94A6A0F22B17BBC00C661C6 /* feature_manager.cpp in Sources */,
-				A94A6C1722B17BBD00C661C6 /* validate_type.cpp in Sources */,
-				A94A698922B17BBB00C661C6 /* structured_loop_to_selection_reduction_opportunity.cpp in Sources */,
-				A94A6B5B22B17BBC00C661C6 /* compact_ids_pass.cpp in Sources */,
-				A94A6A4322B17BBC00C661C6 /* type_manager.cpp in Sources */,
-				A94A695F22B17BBB00C661C6 /* remove_opname_instruction_reduction_opportunity_finder.cpp in Sources */,
-				A94A6BDF22B17BBC00C661C6 /* validate_instruction.cpp in Sources */,
-				A94A6A0922B17BBC00C661C6 /* instrument_pass.cpp in Sources */,
-				A94A6B5D22B17BBC00C661C6 /* loop_peeling.cpp in Sources */,
-				A94A6ABD22B17BBC00C661C6 /* loop_fusion_pass.cpp in Sources */,
-				A94A6A3F22B17BBC00C661C6 /* loop_unswitch_pass.cpp in Sources */,
-				A94A6C0522B17BBD00C661C6 /* validate_arithmetics.cpp in Sources */,
-				A94A69AB22B17BBB00C661C6 /* binary.cpp in Sources */,
-				A94A6AC722B17BBC00C661C6 /* dead_insert_elim_pass.cpp in Sources */,
-				A94A6BF522B17BBD00C661C6 /* function.cpp in Sources */,
-				A94A6ADF22B17BBC00C661C6 /* local_single_store_elim_pass.cpp in Sources */,
-				A94A6BCB22B17BBC00C661C6 /* validate_annotation.cpp in Sources */,
-				A94A6A5122B17BBC00C661C6 /* licm_pass.cpp in Sources */,
-				A94A692B22B17BBB00C661C6 /* operand_to_const_reduction_opportunity_finder.cpp in Sources */,
-				A94A6BE722B17BBC00C661C6 /* validate_interfaces.cpp in Sources */,
-				A94A6A3522B17BBC00C661C6 /* remove_duplicates_pass.cpp in Sources */,
-				A94A69F922B17BBC00C661C6 /* strip_atomic_counter_memory_pass.cpp in Sources */,
-				A94A6C0D22B17BBD00C661C6 /* validate_derivatives.cpp in Sources */,
-				A94A6A8922B17BBC00C661C6 /* ir_context.cpp in Sources */,
-				A94A6A7F22B17BBC00C661C6 /* dead_branch_elim_pass.cpp in Sources */,
-				A94A6A9122B17BBC00C661C6 /* local_ssa_elim_pass.cpp in Sources */,
-				A94A6A1122B17BBC00C661C6 /* pass.cpp in Sources */,
-				A94A6A4122B17BBC00C661C6 /* unify_const_pass.cpp in Sources */,
-				A94A6BBF22B17BBC00C661C6 /* operand.cpp in Sources */,
-				A94A6C2122B17BBD00C661C6 /* validate_function.cpp in Sources */,
-				A94A698122B17BBB00C661C6 /* remove_block_reduction_opportunity_finder.cpp in Sources */,
-				A94A6A7D22B17BBC00C661C6 /* simplification_pass.cpp in Sources */,
-				A94A6B4922B17BBC00C661C6 /* loop_fusion.cpp in Sources */,
-				A94A69AF22B17BBB00C661C6 /* enum_string_mapping.cpp in Sources */,
-				A94A6C0922B17BBD00C661C6 /* validate_memory_semantics.cpp in Sources */,
-				A94A69A522B17BBB00C661C6 /* spirv_endian.cpp in Sources */,
+				A9C2F31022E7833D001763CE /* dead_insert_elim_pass.cpp in Sources */,
+				A9C2F2BE22E7833D001763CE /* pch_source_opt.cpp in Sources */,
+				A9C2F28622E7833D001763CE /* module.cpp in Sources */,
+				A9C2F30622E7833D001763CE /* loop_fusion_pass.cpp in Sources */,
+				A9C2F33222E7833D001763CE /* loop_dependence_helpers.cpp in Sources */,
+				A9C2F45022E7833D001763CE /* validate_builtins.cpp in Sources */,
+				A9C2F1C422E7833D001763CE /* operand_to_dominating_id_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F18622E7833D001763CE /* simple_conditional_branch_to_branch_reduction_opportunity.cpp in Sources */,
+				A9C2F44222E7833D001763CE /* validate_non_uniform.cpp in Sources */,
+				A9C2F2B422E7833D001763CE /* strip_reflect_info_pass.cpp in Sources */,
+				A9C2F2AA22E7833D001763CE /* loop_unroller.cpp in Sources */,
+				A9C2F47222E7833D001763CE /* validate_arithmetics.cpp in Sources */,
+				A9C2F26822E7833D001763CE /* cfg_cleanup_pass.cpp in Sources */,
+				A9C2F44C22E7833D001763CE /* validate_decorations.cpp in Sources */,
+				A9C2F3A422E7833D001763CE /* loop_peeling.cpp in Sources */,
+				A9C2F21C22E7833D001763CE /* register_pressure.cpp in Sources */,
+				A9C2F1A422E7833D001763CE /* remove_instruction_reduction_opportunity.cpp in Sources */,
+				A9C2F27222E7833D001763CE /* loop_dependence.cpp in Sources */,
+				A9C2F36422E7833D001763CE /* dominator_analysis.cpp in Sources */,
+				A9C2F26222E7833D001763CE /* merge_return_pass.cpp in Sources */,
+				A9C2F29022E7833D001763CE /* generate_webgpu_initializers_pass.cpp in Sources */,
+				A9C2F47622E7833D001763CE /* validate_memory_semantics.cpp in Sources */,
+				A9C2F1AE22E7833D001763CE /* reducer.cpp in Sources */,
+				A9C2F46822E7833D001763CE /* validate_small_type_uses.cpp in Sources */,
+				A9C2F2C822E7833D001763CE /* dead_branch_elim_pass.cpp in Sources */,
+				A9C2F2C622E7833D001763CE /* simplification_pass.cpp in Sources */,
+				A9C2F39022E7833D001763CE /* loop_fusion.cpp in Sources */,
+				A9C2F29422E7833D001763CE /* inline_pass.cpp in Sources */,
+				A9C2F28822E7833D001763CE /* fold_spec_constant_op_and_composite_pass.cpp in Sources */,
+				A9C2F2F622E7833D001763CE /* strength_reduction_pass.cpp in Sources */,
+				A9C2F2A222E7833D001763CE /* split_invalid_unreachable_pass.cpp in Sources */,
+				A9C2F35C22E7833D001763CE /* inline_opaque_pass.cpp in Sources */,
+				A9C2F14222E7833D001763CE /* text.cpp in Sources */,
+				A9C2F48422E7833D001763CE /* validate_type.cpp in Sources */,
+				A9C2F43022E7833D001763CE /* disassemble.cpp in Sources */,
+				A9C2F2CA22E7833D001763CE /* flatten_decoration_pass.cpp in Sources */,
+				A9C2F21422E7833D001763CE /* ext_inst.cpp in Sources */,
+				A9C2F14A22E7833D001763CE /* pch_source.cpp in Sources */,
+				A9C2F2EE22E7833D001763CE /* if_conversion.cpp in Sources */,
+				A9C2F24222E7833D001763CE /* cfg.cpp in Sources */,
+				A9C2F31822E7833D001763CE /* block_merge_pass.cpp in Sources */,
+				A9C2F45E22E7833D001763CE /* construct.cpp in Sources */,
+				A9C2F2DE22E7833D001763CE /* function.cpp in Sources */,
+				A9C2F33822E7833D001763CE /* fold.cpp in Sources */,
+				A9C2F27022E7833D001763CE /* ssa_rewrite_pass.cpp in Sources */,
+				A9C2F2D822E7833D001763CE /* loop_descriptor.cpp in Sources */,
+				A9C2F18822E7833D001763CE /* remove_function_reduction_opportunity.cpp in Sources */,
+				A9C2F18E22E7833D001763CE /* remove_selection_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F49422E7833D001763CE /* validation_state.cpp in Sources */,
+				A9C2F2AC22E7833D001763CE /* constants.cpp in Sources */,
+				A9C2F35822E7833D001763CE /* value_number_table.cpp in Sources */,
+				A9C2F19022E7833D001763CE /* conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp in Sources */,
+				A9C2F39222E7833D001763CE /* upgrade_memory_model.cpp in Sources */,
+				A9C2F1B822E7833D001763CE /* merge_blocks_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F16A22E7833D001763CE /* table.cpp in Sources */,
+				A9C2F21022E7833D001763CE /* opcode.cpp in Sources */,
+				A9C2F29822E7833D001763CE /* ir_loader.cpp in Sources */,
+				A9C2F43A22E7833D001763CE /* validate_cfg.cpp in Sources */,
+				A9C2F3A222E7833D001763CE /* compact_ids_pass.cpp in Sources */,
+				A9C2F2F822E7833D001763CE /* block_merge_util.cpp in Sources */,
+				A9C2F24A22E7833D001763CE /* freeze_spec_constant_value_pass.cpp in Sources */,
+				A9C2F33422E7833D001763CE /* set_spec_constant_default_value_pass.cpp in Sources */,
+				A9C2F21822E7833D001763CE /* optimizer.cpp in Sources */,
+				A9C2F38022E7833D001763CE /* local_access_chain_convert_pass.cpp in Sources */,
+				A9C2F32E22E7833D001763CE /* propagator.cpp in Sources */,
+				A9C2F48A22E7833D001763CE /* validate_layout.cpp in Sources */,
+				A9C2F47C22E7833D001763CE /* validate_memory.cpp in Sources */,
+				A9C2F48C22E7833D001763CE /* basic_block.cpp in Sources */,
+				A9C2F1E422E7833D001763CE /* spirv_fuzzer_options.cpp in Sources */,
+				A9C2F47E22E7833D001763CE /* validate_image.cpp in Sources */,
+				A9C2F45222E7833D001763CE /* validate_interfaces.cpp in Sources */,
+				A9C2F48822E7833D001763CE /* validate_execution_limitations.cpp in Sources */,
+				A9C2F23A22E7833D001763CE /* code_sink.cpp in Sources */,
+				A9C2F1AC22E7833D001763CE /* pch_source_reduce.cpp in Sources */,
+				A9C2F24622E7833D001763CE /* decoration_manager.cpp in Sources */,
+				A9C2F31422E7833D001763CE /* scalar_analysis.cpp in Sources */,
+				A9C2F1BE22E7833D001763CE /* change_operand_to_undef_reduction_opportunity.cpp in Sources */,
+				A9C2F33C22E7833D001763CE /* scalar_replacement_pass.cpp in Sources */,
+				A9C2F18022E7833D001763CE /* remove_function_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F13A22E7833D001763CE /* spirv_target_env.cpp in Sources */,
+				A9C2F16E22E7833D001763CE /* remove_selection_reduction_opportunity.cpp in Sources */,
+				A9C2F1BA22E7833D001763CE /* reduction_opportunity.cpp in Sources */,
+				A9C2F26E22E7833D001763CE /* strip_debug_info_pass.cpp in Sources */,
+				A9C2F2FC22E7833D001763CE /* copy_prop_arrays.cpp in Sources */,
+				A9C2F47422E7833D001763CE /* validate_mode_setting.cpp in Sources */,
+				A9C2F46E22E7833D001763CE /* validate_id.cpp in Sources */,
+				A9C2F39822E7833D001763CE /* scalar_analysis_simplification.cpp in Sources */,
+				A9C2F45422E7833D001763CE /* validate.cpp in Sources */,
+				A9C2F43622E7833D001763CE /* validate_annotation.cpp in Sources */,
+				A9C2F2A622E7833D001763CE /* vector_dce.cpp in Sources */,
+				A9C2F20222E7833D001763CE /* spirv_reducer_options.cpp in Sources */,
+				A9C2F20E22E7833D001763CE /* software_version.cpp in Sources */,
+				A9C2F15A22E7833D001763CE /* string_utils.cpp in Sources */,
+				A9C2F26022E7833D001763CE /* dominator_tree.cpp in Sources */,
+				A9C2F44022E7833D001763CE /* validate_barriers.cpp in Sources */,
+				A9C2F37822E7833D001763CE /* struct_cfg_analysis.cpp in Sources */,
+				A9C2F24822E7833D001763CE /* local_single_block_elim_pass.cpp in Sources */,
+				A9C2F16222E7833D001763CE /* parse_number.cpp in Sources */,
+				A9C2F1B022E7833D001763CE /* operand_to_undef_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F20A22E7833D001763CE /* name_mapper.cpp in Sources */,
+				A9C2F2E022E7833D001763CE /* instruction_list.cpp in Sources */,
+				A9C2F44E22E7833D001763CE /* validate_debug.cpp in Sources */,
+				A9C2F35222E7833D001763CE /* reduce_load_size.cpp in Sources */,
+				A9C2F17A22E7833D001763CE /* reduction_util.cpp in Sources */,
+				A9C2F41E22E7833D001763CE /* diagnostic.cpp in Sources */,
+				A9C2F2C222E7833D001763CE /* aggressive_dead_code_elim_pass.cpp in Sources */,
+				A9C2F1D622E7833D001763CE /* remove_block_reduction_opportunity.cpp in Sources */,
+				A9C2F28222E7833D001763CE /* dead_variable_elimination.cpp in Sources */,
+				A9C2F23C22E7833D001763CE /* types.cpp in Sources */,
+				A9C2F27C22E7833D001763CE /* mem_pass.cpp in Sources */,
+				A9C2F14422E7833D001763CE /* assembly_grammar.cpp in Sources */,
+				A9C2F47A22E7833D001763CE /* validate_derivatives.cpp in Sources */,
+				A9C2F21E22E7833D001763CE /* loop_utils.cpp in Sources */,
+				A9C2F44A22E7833D001763CE /* validate_instruction.cpp in Sources */,
+				A9C2F25E22E7833D001763CE /* loop_fission.cpp in Sources */,
+				A9C2F44422E7833D001763CE /* validate_scopes.cpp in Sources */,
+				A9C2F49222E7833D001763CE /* validate_composites.cpp in Sources */,
+				A9C2F46022E7833D001763CE /* function.cpp in Sources */,
+				A9C2F1D222E7833D001763CE /* conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp in Sources */,
+				A9C2F19622E7833D001763CE /* change_operand_reduction_opportunity.cpp in Sources */,
+				A9C2F48222E7833D001763CE /* instruction.cpp in Sources */,
+				A9C2F35E22E7833D001763CE /* replace_invalid_opc.cpp in Sources */,
+				A9C2F22622E7833D001763CE /* combine_access_chains.cpp in Sources */,
+				A9C2F18C22E7833D001763CE /* simple_conditional_branch_to_branch_opportunity_finder.cpp in Sources */,
+				A9C2F20422E7833D001763CE /* parsed_operand.cpp in Sources */,
+				A9C2F29E22E7833D001763CE /* eliminate_dead_functions_pass.cpp in Sources */,
+				A9C2F2FE22E7833D001763CE /* pass_manager.cpp in Sources */,
+				A9C2F26A22E7833D001763CE /* const_folding_rules.cpp in Sources */,
+				A9C2F42A22E7833D001763CE /* operand.cpp in Sources */,
+				A9C2F19E22E7833D001763CE /* remove_unreferenced_instruction_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F36622E7833D001763CE /* decompose_initialized_variables_pass.cpp in Sources */,
+				A9C2F34622E7833D001763CE /* workaround1209.cpp in Sources */,
+				A9C2F16422E7833D001763CE /* bit_vector.cpp in Sources */,
+				A9C2F20C22E7833D001763CE /* linker.cpp in Sources */,
+				A9C2F14822E7833D001763CE /* extensions.cpp in Sources */,
+				A9C2F46A22E7833D001763CE /* validate_datarules.cpp in Sources */,
+				A9C2F43822E7833D001763CE /* validate_misc.cpp in Sources */,
+				A9C2F30022E7833D001763CE /* inline_exhaustive_pass.cpp in Sources */,
+				A9C2F26622E7833D001763CE /* eliminate_dead_constant_pass.cpp in Sources */,
+				A9C2F17C22E7833D001763CE /* structured_loop_to_selection_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F19422E7833D001763CE /* merge_blocks_reduction_opportunity.cpp in Sources */,
+				A9C2F2E422E7833D001763CE /* process_lines_pass.cpp in Sources */,
+				A9C2F25022E7833D001763CE /* inst_bindless_check_pass.cpp in Sources */,
+				A9C2F1EA22E7833D001763CE /* print.cpp in Sources */,
+				A9C2F1E822E7833D001763CE /* spirv_validator_options.cpp in Sources */,
+				A9C2F44622E7833D001763CE /* validate_atomics.cpp in Sources */,
+				A9C2F17422E7833D001763CE /* reduction_pass.cpp in Sources */,
+				A9C2F46622E7833D001763CE /* validate_conversion.cpp in Sources */,
+				A9C2F22822E7833D001763CE /* build_module.cpp in Sources */,
+				A9C2F39E22E7833D001763CE /* legalize_vector_shuffle_pass.cpp in Sources */,
+				A9C2F25222E7833D001763CE /* local_redundancy_elimination.cpp in Sources */,
+				A9C2F15622E7833D001763CE /* timer.cpp in Sources */,
+				A9C2F2F422E7833D001763CE /* eliminate_dead_members_pass.cpp in Sources */,
+				A9C2F45A22E7833D001763CE /* validate_bitwise.cpp in Sources */,
+				A9C2F2DA22E7833D001763CE /* local_ssa_elim_pass.cpp in Sources */,
+				A9C2F2E222E7833D001763CE /* composite.cpp in Sources */,
+				A9C2F42222E7833D001763CE /* libspirv.cpp in Sources */,
+				A9C2F1DC22E7833D001763CE /* spirv_optimizer_options.cpp in Sources */,
+				A9C2F25A22E7833D001763CE /* feature_manager.cpp in Sources */,
+				A9C2F1D422E7833D001763CE /* structured_loop_to_selection_reduction_opportunity.cpp in Sources */,
+				A9C2F28E22E7833D001763CE /* type_manager.cpp in Sources */,
+				A9C2F2B822E7833D001763CE /* ccp_pass.cpp in Sources */,
+				A9C2F46422E7833D001763CE /* validate_adjacency.cpp in Sources */,
+				A9C2F1AA22E7833D001763CE /* remove_opname_instruction_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F25422E7833D001763CE /* instrument_pass.cpp in Sources */,
+				A9C2F43C22E7833D001763CE /* validate_capability.cpp in Sources */,
+				A9C2F48022E7833D001763CE /* validate_literals.cpp in Sources */,
+				A9C2F34222E7833D001763CE /* redundancy_elimination.cpp in Sources */,
+				A9C2F45822E7833D001763CE /* validate_constants.cpp in Sources */,
+				A9C2F34E22E7833D001763CE /* instruction.cpp in Sources */,
+				A9C2F28A22E7833D001763CE /* loop_unswitch_pass.cpp in Sources */,
+				A9C2F1F622E7833D001763CE /* binary.cpp in Sources */,
+				A9C2F29C22E7833D001763CE /* licm_pass.cpp in Sources */,
+				A9C2F17622E7833D001763CE /* operand_to_const_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F28022E7833D001763CE /* remove_duplicates_pass.cpp in Sources */,
+				A9C2F48E22E7833D001763CE /* validate_function.cpp in Sources */,
+				A9C2F24422E7833D001763CE /* strip_atomic_counter_memory_pass.cpp in Sources */,
+				A9C2F49622E7833D001763CE /* validate_primitives.cpp in Sources */,
+				A9C2F43422E7833D001763CE /* text_handler.cpp in Sources */,
+				A9C2F25C22E7833D001763CE /* pass.cpp in Sources */,
+				A9C2F32622E7833D001763CE /* local_single_store_elim_pass.cpp in Sources */,
+				A9C2F45C22E7833D001763CE /* validate_extensions.cpp in Sources */,
+				A9C2F47822E7833D001763CE /* validate_logicals.cpp in Sources */,
+				A9C2F35622E7833D001763CE /* fix_storage_class.cpp in Sources */,
+				A9C2F32A22E7833D001763CE /* private_to_local_pass.cpp in Sources */,
+				A9C2F28C22E7833D001763CE /* unify_const_pass.cpp in Sources */,
+				A9C2F38222E7833D001763CE /* basic_block.cpp in Sources */,
+				A9C2F1CC22E7833D001763CE /* remove_block_reduction_opportunity_finder.cpp in Sources */,
+				A9C2F2C422E7833D001763CE /* eliminate_dead_functions_util.cpp in Sources */,
+				A9C2F1FA22E7833D001763CE /* enum_string_mapping.cpp in Sources */,
+				A9C2F1F022E7833D001763CE /* spirv_endian.cpp in Sources */,
+				A9C2F2D222E7833D001763CE /* ir_context.cpp in Sources */,
+				A9C2F2B222E7833D001763CE /* def_use_manager.cpp in Sources */,
+				A9C2F2CE22E7833D001763CE /* folding_rules.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/ExternalRevisions/README.md b/ExternalRevisions/README.md
index bc19d88..c9c70c2 100644
--- a/ExternalRevisions/README.md
+++ b/ExternalRevisions/README.md
@@ -182,12 +182,11 @@
 1. In the *Project Navigator*, remove the *Group* named `source` from under the *Group* named
    `External/SPIRV-Tools`.
 
-2. Drag the `External/glslang/Extermal/spirv-tools/source` file folder to the `External/SPIRV-Tools` 
+2. Drag the `External/glslang/External/spirv-tools/source` file folder to the `External/SPIRV-Tools` 
    group in the *Project Navigator* panel. In the _**Choose options for adding these files**_ dialog 
    that opens, select the _**Create groups**_ option, add the files to *both* the `SPIRV-Tools-macOS` 
    and `SPIRV-Tools-iOS` targets, and click the ***Finish*** button.
 
-
 3. Remove the *Group* named `fuzz` from under the *Group* named `External/SPIRV-Tools/source`.
 
 4. In the *Project Navigator* panel, select the `ExternalDependencies` *Xcode* project, then 
diff --git a/ExternalRevisions/SPIRV-Cross_repo_revision b/ExternalRevisions/SPIRV-Cross_repo_revision
index 30297b1..337aa79 100644
--- a/ExternalRevisions/SPIRV-Cross_repo_revision
+++ b/ExternalRevisions/SPIRV-Cross_repo_revision
@@ -1 +1 @@
-4104e363005a079acc215f0920743a8affb31278
+07bb1a53e0cb86cfb9b116623493df974ad9ccee
diff --git a/ExternalRevisions/Vulkan-Headers_repo_revision b/ExternalRevisions/Vulkan-Headers_repo_revision
index 6dd277b..ddbb6f5 100644
--- a/ExternalRevisions/Vulkan-Headers_repo_revision
+++ b/ExternalRevisions/Vulkan-Headers_repo_revision
@@ -1 +1 @@
-097a1045098213919fd56442f52c716fc78eeb27
+e3f96a9ccab9397481eb81c4d9bce4ea7590dc33
diff --git a/ExternalRevisions/Vulkan-Tools_repo_revision b/ExternalRevisions/Vulkan-Tools_repo_revision
index 8d640f2..b6a15de 100644
--- a/ExternalRevisions/Vulkan-Tools_repo_revision
+++ b/ExternalRevisions/Vulkan-Tools_repo_revision
@@ -1 +1 @@
-d2de4ac0a28766c6fb10968fdcc4d75566eef8d7
+fb1fd1d63eb20cc6f922228f04d8b96cec452b46
diff --git a/ExternalRevisions/VulkanSamples_repo_revision b/ExternalRevisions/VulkanSamples_repo_revision
index bd4a2eb..1f3f4e1 100644
--- a/ExternalRevisions/VulkanSamples_repo_revision
+++ b/ExternalRevisions/VulkanSamples_repo_revision
@@ -1 +1 @@
-c6df494e270b5afad6bf5aaca725a037abe10501
+5a52ebd648b5baf94f2346819b5cf3fdc14b4127
diff --git a/ExternalRevisions/glslang_repo_revision b/ExternalRevisions/glslang_repo_revision
index d04e537..1c370c0 100644
--- a/ExternalRevisions/glslang_repo_revision
+++ b/ExternalRevisions/glslang_repo_revision
@@ -1 +1 @@
-21eebe74214488264bbf0d19323a03c13a9e53a7
+333d1c95792692205472c457d7bec915a94c8000
diff --git a/MoltenVK/MoltenVK/API/mvk_datatypes.h b/MoltenVK/MoltenVK/API/mvk_datatypes.h
index b2c59ba..a3e9792 100644
--- a/MoltenVK/MoltenVK/API/mvk_datatypes.h
+++ b/MoltenVK/MoltenVK/API/mvk_datatypes.h
@@ -464,8 +464,8 @@
 /** Returns the Metal CPU cache mode corresponding to the specified Vulkan memory flags. */
 MTLCPUCacheMode mvkMTLCPUCacheModeFromVkMemoryPropertyFlags(VkMemoryPropertyFlags vkFlags);
 
-/** Returns the Metal resource option flags corresponding to the specified Vulkan memory flags. */
-MTLResourceOptions mvkMTLResourceOptionsFromVkMemoryPropertyFlags(VkMemoryPropertyFlags vkFlags);
+/** Returns the Metal resource option flags corresponding to the Metal storage mode and cache mode. */
+MTLResourceOptions mvkMTLResourceOptions(MTLStorageMode mtlStorageMode, MTLCPUCacheMode mtlCPUCacheMode);
 
 
 #ifdef __cplusplus
diff --git a/MoltenVK/MoltenVK/API/mvk_vulkan.h b/MoltenVK/MoltenVK/API/mvk_vulkan.h
index 1277064..aba9865 100644
--- a/MoltenVK/MoltenVK/API/mvk_vulkan.h
+++ b/MoltenVK/MoltenVK/API/mvk_vulkan.h
@@ -18,11 +18,13 @@
 
 
 /** 
- * This is a convenience header file that loads vulkan.h with the appropriate MoltenVK
- * Vulkan platform extensions automatically enabled for iOS or macOS.
+ * This is a convenience header file that loads vulkan.h with the appropriate Vulkan platform extensions.
  *
- * When building for iOS, this header automatically enables the VK_MVK_ios_surface Vulkan extension.
- * When building for macOS, this header automatically enables the VK_MVK_macos_surface Vulkan extension.
+ * This header automatically enables the VK_EXT_metal_surface Vulkan extension.
+ *
+ * When building for iOS, this header also automatically enables the obsolete VK_MVK_ios_surface Vulkan extension.
+ * When building for macOS, this header also automatically enables the obsolete VK_MVK_macos_surface Vulkan extension.
+ * Both of these extensions are obsolete. Consider using the portable VK_EXT_metal_surface extension instead.
  */
 
 #ifndef __mvk_vulkan_h_
@@ -31,6 +33,8 @@
 
 #include <Availability.h>
 
+#define VK_USE_PLATFORM_METAL_EXT				1
+
 #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED
 #	define VK_USE_PLATFORM_IOS_MVK				1
 #endif
diff --git a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
index 31452e2..f5d029d 100644
--- a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
+++ b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
@@ -55,7 +55,7 @@
 #define MVK_MAKE_VERSION(major, minor, patch)    (((major) * 10000) + ((minor) * 100) + (patch))
 #define MVK_VERSION     MVK_MAKE_VERSION(MVK_VERSION_MAJOR, MVK_VERSION_MINOR, MVK_VERSION_PATCH)
 
-#define VK_MVK_MOLTENVK_SPEC_VERSION            20
+#define VK_MVK_MOLTENVK_SPEC_VERSION            21
 #define VK_MVK_MOLTENVK_EXTENSION_NAME          "VK_MVK_moltenvk"
 
 /**
@@ -102,8 +102,14 @@
  *      2: Log errors and informational messages.
  *    If neither is set, errors and informational messages are logged.
  *
- * 2. Setting the MVK_CONFIG_TRACE_VULKAN_CALLS runtime environment variable or MoltenVK compile-time
- *    build setting to 1 will cause MoltenVK to log the name of each Vulkan call made by the application.
+ * 2. Setting the MVK_CONFIG_TRACE_VULKAN_CALLS runtime environment variable or MoltenVK compile-time build
+ *    setting will cause MoltenVK to log the name of each Vulkan call made by the application. The logging
+ *    format options can be controlled by setting the value of MVK_CONFIG_TRACE_VULKAN_CALLS as follows:
+ *        0: No Vulkan call logging.
+ *        1: Log the name of each Vulkan call when the call is entered.
+ *        2: Log the name of each Vulkan call when the call is entered and exited. This effectively
+ *           brackets any other logging activity within the scope of the Vulkan call.
+ *        3: Same as option 2, plus logs the time spent inside the Vulkan function.
  *
  * 3. Setting the MVK_CONFIG_FORCE_LOW_POWER_GPU runtime environment variable or MoltenVK compile-time
  *    build setting to 1 will force MoltenVK to use a low-power GPU, if one is availble on the device.
@@ -531,6 +537,9 @@
 	VkBool32 events;							/**< If true, Metal synchronization events are supported. */
 	VkBool32 memoryBarriers;					/**< If true, full memory barriers within Metal render passes are supported. */
 	VkBool32 multisampleLayeredRendering;       /**< If true, layered rendering to multiple multi-sampled cube or texture array layers is supported. */
+	VkBool32 stencilFeedback;					/**< If true, fragment shaders that write to [[stencil]] outputs are supported. */
+	VkBool32 textureBuffers;					/**< If true, textures of type MTLTextureTypeBuffer are supported. */
+	VkBool32 postDepthCoverage;					/**< If true, coverage masks in fragment shaders post-depth-test are supported. */
 } MVKPhysicalDeviceMetalFeatures;
 
 /**
@@ -584,7 +593,8 @@
 
 /** MoltenVK performance of queue activities. */
 typedef struct {
-	MVKPerformanceTracker mtlQueueAccess;          	/** Create an MTLCommmandQueue or access an existing cached instance. */
+	MVKPerformanceTracker mtlQueueAccess;               /** Create an MTLCommmandQueue or access an existing cached instance. */
+	MVKPerformanceTracker mtlCommandBufferCompletion;   /** Completion of a MTLCommandBuffer on the GPU, from commit to completion callback. */
 } MVKQueuePerformance;
 
 /**
@@ -659,6 +669,12 @@
  * that MoltenVK expects the size of MVKConfiguration to be by setting the value of pConfiguration
  * to NULL. In that case, this function will set *pConfigurationSize to the size that MoltenVK
  * expects MVKConfiguration to be.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkInstance object you provide here must have been retrieved directly from MoltenVK,
+ * and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan objects
+ * are often changed by layers, and passing them from one layer to another, or from
+ * a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkGetMoltenVKConfigurationMVK(
 	VkInstance                                  instance,
@@ -693,6 +709,12 @@
  * that MoltenVK expects the size of MVKConfiguration to be by setting the value of pConfiguration
  * to NULL. In that case, this function will set *pConfigurationSize to the size that MoltenVK
  * expects MVKConfiguration to be.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkInstance object you provide here must have been retrieved directly from MoltenVK,
+ * and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan objects
+ * are often changed by layers, and passing them from one layer to another, or from
+ * a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkSetMoltenVKConfigurationMVK(
 	VkInstance                                  instance,
@@ -721,6 +743,12 @@
  * expects the size of MVKPhysicalDeviceMetalFeatures to be by setting the value of pMetalFeatures to NULL.
  * In that case, this function will set *pMetalFeaturesSize to the size that MoltenVK expects
  * MVKPhysicalDeviceMetalFeatures to be.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkPhysicalDevice object you provide here must have been retrieved directly from
+ * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceMetalFeaturesMVK(
 	VkPhysicalDevice                            physicalDevice,
@@ -748,6 +776,12 @@
  * that MoltenVK expects the size of MVKSwapchainPerformance to be by setting the value of
  * pSwapchainPerf to NULL. In that case, this function will set *pSwapchainPerfSize to the
  * size that MoltenVK expects MVKSwapchainPerformance to be.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkDevice and VkSwapchainKHR objects you provide here must have been retrieved directly
+ * from MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainPerformanceMVK(
 	VkDevice                                    device,
@@ -776,6 +810,12 @@
  * that MoltenVK expects the size of MVKPerformanceStatistics to be by setting the value of
  * pPerf to NULL. In that case, this function will set *pPerfSize to the size that MoltenVK
  * expects MVKPerformanceStatistics to be.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkDevice object you provide here must have been retrieved directly from
+ * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkGetPerformanceStatisticsMVK(
 	VkDevice                                    device,
@@ -801,6 +841,12 @@
  * This needs to be called if you are creating compute shader modules from MSL
  * source code or MSL compiled code. Workgroup size is determined automatically
  * if you're using SPIR-V.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkShaderModule object you provide here must have been retrieved directly from
+ * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR void VKAPI_CALL vkSetWorkgroupSizeMVK(
     VkShaderModule                              shaderModule,
@@ -810,7 +856,15 @@
 
 #ifdef __OBJC__
 
-/** Returns, in the pMTLDevice pointer, the MTLDevice used by the VkPhysicalDevice. */
+/**
+ * Returns, in the pMTLDevice pointer, the MTLDevice used by the VkPhysicalDevice.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkPhysicalDevice object you provide here must have been retrieved directly from
+ * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ */
 VKAPI_ATTR void VKAPI_CALL vkGetMTLDeviceMVK(
     VkPhysicalDevice                           physicalDevice,
     id<MTLDevice>*                             pMTLDevice);
@@ -824,12 +878,26 @@
  * If a MTLTexture has already been created for this image, it will be destroyed.
  *
  * Returns VK_SUCCESS.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkImage object you provide here must have been retrieved directly from
+ * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkSetMTLTextureMVK(
     VkImage                                     image,
     id<MTLTexture>                              mtlTexture);
 
-/** Returns, in the pMTLTexture pointer, the MTLTexture currently underlaying the VkImage. */
+/**
+ * Returns, in the pMTLTexture pointer, the MTLTexture currently underlaying the VkImage.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkImage object you provide here must have been retrieved directly from
+ * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ */
 VKAPI_ATTR void VKAPI_CALL vkGetMTLTextureMVK(
     VkImage                                     image,
     id<MTLTexture>*                             pMTLTexture);
@@ -857,6 +925,12 @@
  *   - VK_SUCCESS.
  *   - VK_ERROR_FEATURE_NOT_PRESENT if IOSurfaces are not supported on the platform.
  *   - VK_ERROR_INITIALIZATION_FAILED if ioSurface is specified and is not compatible with this VkImage.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkImage object you provide here must have been retrieved directly from
+ * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkUseIOSurfaceMVK(
     VkImage                                     image,
@@ -866,6 +940,12 @@
  * Returns, in the pIOSurface pointer, the IOSurface currently underlaying the VkImage,
  * as set by the useIOSurfaceMVK() function, or returns null if the VkImage is not using
  * an IOSurface, or if the platform does not support IOSurfaces.
+ *
+ * This function is not supported by the Vulkan SDK Loader and Layers framework.
+ * The VkImage object you provide here must have been retrieved directly from
+ * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
+ * objects are often changed by layers, and passing them from one layer to another,
+ * or from a layer directly to MoltenVK, will result in undefined behaviour.
  */
 VKAPI_ATTR void VKAPI_CALL vkGetIOSurfaceMVK(
     VkImage                                     image,
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdDebug.mm b/MoltenVK/MoltenVK/Commands/MVKCmdDebug.mm
index b7eda12..3e15659 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdDebug.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdDebug.mm
@@ -27,7 +27,7 @@
 
 void MVKCmdDebugMarker::setContent(const char* pMarkerName, const float color[4]) {
 	[_markerName release];
-	_markerName = [@(pMarkerName) retain];
+	_markerName = [[NSString alloc] initWithUTF8String: pMarkerName];	// retained
 }
 
 MVKCmdDebugMarker::MVKCmdDebugMarker(MVKCommandTypePool<MVKCmdDebugMarker>* pool)
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.mm b/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.mm
index 5eff3e4..18fe127 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.mm
@@ -197,7 +197,7 @@
 	_offset = offset;
 
 	_pushConstants.resize(size);
-  std::copy_n((char*)pValues, size, _pushConstants.begin());
+	std::copy_n((char*)pValues, size, _pushConstants.begin());
 }
 
 void MVKCmdPushConstants::encode(MVKCommandEncoder* cmdEncoder) {
@@ -209,7 +209,7 @@
         VK_SHADER_STAGE_COMPUTE_BIT
     };
     for (auto stage : stages) {
-        if (mvkAreFlagsEnabled(_stageFlags, stage)) {
+        if (mvkAreAllFlagsEnabled(_stageFlags, stage)) {
             cmdEncoder->getPushConstants(stage)->setPushConstants(_offset, _pushConstants);
         }
     }
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h
index 3e3b007..231924a 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h
@@ -33,17 +33,6 @@
 #pragma mark -
 #pragma mark MVKCmdCopyImage
 
-/** Describes the Metal texture copying parameters. */
-typedef struct {
-	uint32_t	srcLevel;
-	uint32_t	srcSlice;
-	MTLOrigin	srcOrigin;
-	MTLSize		srcSize;
-	uint32_t	dstLevel;
-	uint32_t	dstSlice;
-	MTLOrigin	dstOrigin;
-} MVKMetalCopyTextureRegion;
-
 /** Vulkan command to copy image regions. */
 class MVKCmdCopyImage : public MVKCommand {
 
@@ -62,14 +51,28 @@
 		MVKCommand::MVKCommand((MVKCommandTypePool<MVKCommand>*)pool) {}
 
 protected:
-    void addMetalCopyRegions(const VkImageCopy* pRegion);
+	void setContent(VkImage srcImage, VkImageLayout srcImageLayout,
+					VkImage dstImage, VkImageLayout dstImageLayout, MVKCommandUse commandUse);
+	void addImageCopyRegion(const VkImageCopy& region);
+	void addTempBufferImageCopyRegion(const VkImageCopy& region);
 
 	MVKImage* _srcImage;
 	VkImageLayout _srcLayout;
 	MVKImage* _dstImage;
 	VkImageLayout _dstLayout;
-	std::vector<MVKMetalCopyTextureRegion> _mtlTexCopyRegions;
-    MVKCommandUse _commandUse = kMVKCommandUseNone;
+	MTLPixelFormat _srcMTLPixFmt;
+	MTLPixelFormat _dstMTLPixFmt;
+	uint32_t _srcSampleCount;
+	uint32_t _dstSampleCount;
+	bool _isSrcCompressed;
+	bool _isDstCompressed;
+	bool _canCopyFormats;
+	bool _useTempBuffer;
+	std::vector<VkImageCopy> _imageCopyRegions;
+	std::vector<VkBufferImageCopy> _srcTmpBuffImgCopies;
+	std::vector<VkBufferImageCopy> _dstTmpBuffImgCopies;
+	size_t _tmpBuffSize;
+    MVKCommandUse _commandUse;
 };
 
 
@@ -79,14 +82,11 @@
 /** Number of vertices in a BLIT rectangle. */
 #define kMVKBlitVertexCount		4
 
-/** Describes Metal texture rendering parameters. */
+/** Combines a VkImageBlit with vertices to render it. */
 typedef struct {
-	uint32_t	srcLevel;
-	uint32_t	srcSlice;
-	uint32_t	dstLevel;
-	uint32_t	dstSlice;
+	VkImageBlit region;
 	MVKVertexPosTex vertices[kMVKBlitVertexCount];
-} MVKMetalBlitTextureRender;
+} MVKImageBlitRender;
 
 /** Vulkan command to BLIT image regions. */
 class MVKCmdBlitImage : public MVKCmdCopyImage {
@@ -108,17 +108,16 @@
 	~MVKCmdBlitImage() override;
 
 protected:
-	bool canCopy(const VkImageBlit* pRegion);
-    void addMetalCopyRegions(const VkImageBlit* pRegion);
-    void addMetalBlitRenders(const VkImageBlit* pRegion);
-	void populateVertices(MVKVertexPosTex* vertices, const VkImageBlit* pRegion);
+	bool canCopy(const VkImageBlit& region);
+	void addImageBlitRegion(const VkImageBlit& region);
+	void addImageCopyRegionFromBlitRegion(const VkImageBlit& region);
+	void populateVertices(MVKVertexPosTex* vertices, const VkImageBlit& region);
     void initMTLRenderPassDescriptor();
 
 	MTLRenderPassDescriptor* _mtlRenderPassDescriptor;
 	MTLSamplerMinMagFilter _mtlFilter;
-    MTLPixelFormat _mtlPixFmt;
 	MVKRPSKeyBlitImg _blitKey;
-	std::vector<MVKMetalBlitTextureRender> _mtlTexBlitRenders;
+	std::vector<MVKImageBlitRender> _mvkImageBlitRenders;
 };
 
 
@@ -211,10 +210,12 @@
 		MVKCommand::MVKCommand((MVKCommandTypePool<MVKCommand>*)pool) {}
 
 protected:
+	bool isArrayTexture();
+
     MVKBuffer* _buffer;
     MVKImage* _image;
     VkImageLayout _imageLayout;
-    std::vector<VkBufferImageCopy> _mtlBuffImgCopyRegions;
+    std::vector<VkBufferImageCopy> _bufferImageCopyRegions;
     bool _toImage = false;
 };
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
index db6c561..40c1fa1 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
@@ -38,81 +38,167 @@
 								 VkImage dstImage,
 								 VkImageLayout dstImageLayout,
 								 uint32_t regionCount,
-                                 const VkImageCopy* pRegions,
-                                 MVKCommandUse commandUse) {
-	_srcImage = (MVKImage*)srcImage;
-	_srcLayout = srcImageLayout;
-	_dstImage = (MVKImage*)dstImage;
-	_dstLayout = dstImageLayout;
-    _commandUse = commandUse;
+								 const VkImageCopy* pRegions,
+								 MVKCommandUse commandUse) {
 
-    // Deterine the total number of texture layers being affected
-    uint32_t layerCnt = 0;
-    for (uint32_t i = 0; i < regionCount; i++) {
-        layerCnt += pRegions[i].srcSubresource.layerCount;
-    }
+	setContent(srcImage, srcImageLayout, dstImage, dstImageLayout, commandUse);
 
-	// Add image regions
-    _mtlTexCopyRegions.clear();     // Clear for reuse
-    _mtlTexCopyRegions.reserve(layerCnt);
 	for (uint32_t i = 0; i < regionCount; i++) {
-		addMetalCopyRegions(&pRegions[i]);
+		addImageCopyRegion(pRegions[i]);
 	}
 
-    // Validate
-    if ((_srcImage->getMTLTextureType() == MTLTextureType3D) != (_dstImage->getMTLTextureType() == MTLTextureType3D)) {
-        setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdCopyImage(): Metal does not support copying to or from slices of a 3D texture."));
-    }
+	// Validate
+	if ( !_canCopyFormats ) {
+		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdCopyImage(): Cannot copy between incompatible formats, such as formats of different pixel sizes."));
+	}
+	if ((_srcImage->getMTLTextureType() == MTLTextureType3D) != (_dstImage->getMTLTextureType() == MTLTextureType3D)) {
+		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdCopyImage(): Metal does not support copying to or from slices of a 3D texture."));
+	}
 }
 
-// Adds a Metal copy region structure for each layer in the specified copy region.
-void MVKCmdCopyImage::addMetalCopyRegions(const VkImageCopy* pRegion) {
+// Sets basic content for use by this class and subclasses
+void MVKCmdCopyImage::setContent(VkImage srcImage,
+								 VkImageLayout srcImageLayout,
+								 VkImage dstImage,
+								 VkImageLayout dstImageLayout,
+								 MVKCommandUse commandUse) {
+	_srcImage = (MVKImage*)srcImage;
+	_srcLayout = srcImageLayout;
+	_srcMTLPixFmt = _srcImage->getMTLPixelFormat();
+	_srcSampleCount = mvkSampleCountFromVkSampleCountFlagBits(_srcImage->getSampleCount());
+	_isSrcCompressed = _srcImage->getIsCompressed();
+	uint32_t srcBytesPerBlock = mvkMTLPixelFormatBytesPerBlock(_srcMTLPixFmt);
 
-    MVKMetalCopyTextureRegion mtlImgRgn;
-    mtlImgRgn.srcOrigin = mvkMTLOriginFromVkOffset3D(pRegion->srcOffset);
-    mtlImgRgn.dstOrigin = mvkMTLOriginFromVkOffset3D(pRegion->dstOffset);
-    mtlImgRgn.srcSize = mvkMTLSizeFromVkExtent3D(pRegion->extent);
-    mtlImgRgn.srcLevel = pRegion->srcSubresource.mipLevel;
-    mtlImgRgn.dstLevel = pRegion->dstSubresource.mipLevel;
+	_dstImage = (MVKImage*)dstImage;
+	_dstLayout = dstImageLayout;
+	_dstMTLPixFmt = _dstImage->getMTLPixelFormat();
+	_dstSampleCount = mvkSampleCountFromVkSampleCountFlagBits(_dstImage->getSampleCount());
+	_isDstCompressed = _dstImage->getIsCompressed();
+	uint32_t dstBytesPerBlock = mvkMTLPixelFormatBytesPerBlock(_dstMTLPixFmt);
 
-    uint32_t srcBaseLayer = pRegion->srcSubresource.baseArrayLayer;
-    uint32_t dstBaseLayer = pRegion->dstSubresource.baseArrayLayer;
-    uint32_t layCnt = pRegion->srcSubresource.layerCount;
+	_canCopyFormats = (srcBytesPerBlock == dstBytesPerBlock) && (_srcSampleCount == _dstSampleCount);
+	_useTempBuffer = (_srcMTLPixFmt != _dstMTLPixFmt) && (_isSrcCompressed || _isDstCompressed);	// Different formats and at least one is compressed
 
-    for (uint32_t layIdx = 0; layIdx < layCnt; layIdx++) {
-		mtlImgRgn.srcSlice = srcBaseLayer + layIdx;
-		mtlImgRgn.dstSlice = dstBaseLayer + layIdx;
-        _mtlTexCopyRegions.push_back(mtlImgRgn);
+	_commandUse = commandUse;
+	_tmpBuffSize = 0;
+
+	_imageCopyRegions.clear();		// Clear for reuse
+	_srcTmpBuffImgCopies.clear();	// Clear for reuse
+	_dstTmpBuffImgCopies.clear();	// Clear for reuse
+}
+
+void MVKCmdCopyImage::addImageCopyRegion(const VkImageCopy& region) {
+	if (_useTempBuffer) {
+		addTempBufferImageCopyRegion(region);	// Convert to image->buffer->image copies
+	} else {
+		_imageCopyRegions.push_back(region);
 	}
 }
 
+// Add an image->buffer copy and buffer->image copy to replace the image->image copy
+void MVKCmdCopyImage::addTempBufferImageCopyRegion(const VkImageCopy& region) {
+	VkBufferImageCopy buffImgCpy;
+
+	// Add copy from source image to temp buffer.
+	buffImgCpy.bufferOffset = _tmpBuffSize;
+	buffImgCpy.bufferRowLength = 0;
+	buffImgCpy.bufferImageHeight = 0;
+	buffImgCpy.imageSubresource = region.srcSubresource;
+	buffImgCpy.imageOffset = region.srcOffset;
+	buffImgCpy.imageExtent = region.extent;
+	_srcTmpBuffImgCopies.push_back(buffImgCpy);
+
+	// Add copy from temp buffer to destination image.
+	// Extent is provided in source texels. If the source is compressed but the
+	// destination is not, each destination pixel will consume an entire source block,
+	// so we must downscale the destination extent by the size of the source block.
+	VkExtent3D dstExtent = region.extent;
+	if (_isSrcCompressed && !_isDstCompressed) {
+		VkExtent2D srcBlockExtent = mvkMTLPixelFormatBlockTexelSize(_srcMTLPixFmt);
+		dstExtent.width /= srcBlockExtent.width;
+		dstExtent.height /= srcBlockExtent.height;
+	}
+	buffImgCpy.bufferOffset = _tmpBuffSize;
+	buffImgCpy.bufferRowLength = 0;
+	buffImgCpy.bufferImageHeight = 0;
+	buffImgCpy.imageSubresource = region.dstSubresource;
+	buffImgCpy.imageOffset = region.dstOffset;
+	buffImgCpy.imageExtent = dstExtent;
+	_dstTmpBuffImgCopies.push_back(buffImgCpy);
+
+	NSUInteger bytesPerRow = mvkMTLPixelFormatBytesPerRow(_srcMTLPixFmt, region.extent.width);
+	NSUInteger bytesPerRegion = mvkMTLPixelFormatBytesPerLayer(_srcMTLPixFmt, bytesPerRow, region.extent.height);
+	_tmpBuffSize += bytesPerRegion;
+}
+
 void MVKCmdCopyImage::encode(MVKCommandEncoder* cmdEncoder) {
-    id<MTLTexture> srcMTLTex = _srcImage->getMTLTexture();
-    id<MTLTexture> dstMTLTex = _dstImage->getMTLTexture();
-    if ( !srcMTLTex || !dstMTLTex ) { return; }
+	// Unless we need to use an intermediary buffer copy, map the source pixel format to the
+	// dest pixel format through a texture view on the source texture. If the source and dest
+	// pixel formats are the same, this will simply degenerate to the source texture itself.
+	MTLPixelFormat mapSrcMTLPixFmt = _useTempBuffer ? _srcMTLPixFmt : _dstMTLPixFmt;
+	id<MTLTexture> srcMTLTex = _srcImage->getMTLTexture(mapSrcMTLPixFmt);
+	id<MTLTexture> dstMTLTex = _dstImage->getMTLTexture();
+	if ( !srcMTLTex || !dstMTLTex ) { return; }
 
-    if (srcMTLTex.pixelFormat != dstMTLTex.pixelFormat &&
-        mvkFormatTypeFromVkFormat(_dstImage->getVkFormat()) != kMVKFormatCompressed &&
-        mvkFormatTypeFromVkFormat(_srcImage->getVkFormat()) != kMVKFormatCompressed) {
-        // If the pixel formats don't match, Metal won't abort, but it won't
-        // do the copy either. But we can easily work around that... unless the
-        // source format is compressed.
-        srcMTLTex = [[srcMTLTex newTextureViewWithPixelFormat: dstMTLTex.pixelFormat] autorelease];
-    }
+	id<MTLBlitCommandEncoder> mtlBlitEnc = cmdEncoder->getMTLBlitEncoder(_commandUse);
 
-    id<MTLBlitCommandEncoder> mtlBlitEnc = cmdEncoder->getMTLBlitEncoder(_commandUse);
+	// If copies can be performed using direct texture-texture copying, do so
+	for (auto& cpyRgn : _imageCopyRegions) {
+		uint32_t	srcLevel = cpyRgn.srcSubresource.mipLevel;;
+		MTLOrigin	srcOrigin = mvkMTLOriginFromVkOffset3D(cpyRgn.srcOffset);;
+		MTLSize		srcSize = mvkMTLSizeFromVkExtent3D(cpyRgn.extent);
+		uint32_t	dstLevel = cpyRgn.dstSubresource.mipLevel;
+		MTLOrigin	dstOrigin = mvkMTLOriginFromVkOffset3D(cpyRgn.dstOffset);
 
-    for (auto& cpyRgn : _mtlTexCopyRegions) {
-        [mtlBlitEnc copyFromTexture: srcMTLTex
-                        sourceSlice: cpyRgn.srcSlice
-                        sourceLevel: cpyRgn.srcLevel
-                       sourceOrigin: cpyRgn.srcOrigin
-                         sourceSize: cpyRgn.srcSize
-                          toTexture: dstMTLTex
-                   destinationSlice: cpyRgn.dstSlice
-                   destinationLevel: cpyRgn.dstLevel
-                  destinationOrigin: cpyRgn.dstOrigin];
-    }
+		uint32_t srcBaseLayer = cpyRgn.srcSubresource.baseArrayLayer;
+		uint32_t dstBaseLayer = cpyRgn.dstSubresource.baseArrayLayer;
+		uint32_t layCnt = cpyRgn.srcSubresource.layerCount;
+
+		for (uint32_t layIdx = 0; layIdx < layCnt; layIdx++) {
+			[mtlBlitEnc copyFromTexture: srcMTLTex
+							sourceSlice: srcBaseLayer + layIdx
+							sourceLevel: srcLevel
+						   sourceOrigin: srcOrigin
+							 sourceSize: srcSize
+							  toTexture: dstMTLTex
+					   destinationSlice: dstBaseLayer + layIdx
+					   destinationLevel: dstLevel
+					  destinationOrigin: dstOrigin];
+		}
+	}
+
+	// If copies could not be performed directly between images,
+	// use a temporary buffer acting as a waystation between the images.
+	if ( !_srcTmpBuffImgCopies.empty() ) {
+		MVKBufferDescriptorData tempBuffData;
+		tempBuffData.size = _tmpBuffSize;
+		tempBuffData.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+		MVKBuffer* tempBuff = getCommandEncodingPool()->getTransferMVKBuffer(tempBuffData);
+
+		MVKCmdBufferImageCopy cpyCmd(&getCommandPool()->_cmdBufferImageCopyPool);
+
+		// Copy from source image to buffer
+		// Create and execute a temporary buffer image command.
+		// To be threadsafe...do NOT acquire and return the command from the pool.
+		cpyCmd.setContent((VkBuffer) tempBuff,
+						  (VkImage) _srcImage,
+						  _srcLayout,
+						  (uint32_t)_srcTmpBuffImgCopies.size(),
+						  _srcTmpBuffImgCopies.data(),
+						  false);
+		cpyCmd.encode(cmdEncoder);
+
+		// Copy from buffer to destination image
+		// Create and execute a temporary buffer image command.
+		// To be threadsafe...do NOT acquire and return the command from the pool.
+		cpyCmd.setContent((VkBuffer) tempBuff,
+						  (VkImage) _dstImage,
+						  _dstLayout,
+						  (uint32_t)_dstTmpBuffImgCopies.size(),
+						  _dstTmpBuffImgCopies.data(),
+						  true);
+		cpyCmd.encode(cmdEncoder);
+	}
 }
 
 
@@ -125,134 +211,88 @@
 								 VkImageLayout dstImageLayout,
 								 uint32_t regionCount,
 								 const VkImageBlit* pRegions,
-                                 VkFilter filter,
-                                 MVKCommandUse commandUse) {
-	_srcImage = (MVKImage*)srcImage;
-	_srcLayout = srcImageLayout;
-	_dstImage = (MVKImage*)dstImage;
-	_dstLayout = dstImageLayout;
+								 VkFilter filter,
+								 MVKCommandUse commandUse) {
 
-    _mtlPixFmt = _dstImage->getMTLPixelFormat();
-    _mtlFilter = mvkMTLSamplerMinMagFilterFromVkFilter(filter);
+	MVKCmdCopyImage::setContent(srcImage, srcImageLayout, dstImage, dstImageLayout, commandUse);
 
-	_blitKey.mtlPixFmt = (uint32_t)_mtlPixFmt;
-	_blitKey.mtlTexType = (uint32_t)_srcImage->getMTLTextureType();
+	_mtlFilter = mvkMTLSamplerMinMagFilterFromVkFilter(filter);
 
-    _commandUse = commandUse;
+	_blitKey.srcMTLPixelFormat = (uint32_t)_srcMTLPixFmt;
+	_blitKey.srcMTLTextureType = (uint32_t)_srcImage->getMTLTextureType();
+	_blitKey.dstMTLPixelFormat = (uint32_t)_dstMTLPixFmt;
+	_blitKey.dstSampleCount = _dstSampleCount;
 
-	// Determine which regions can be copied and which must be rendered to the destination texture
-	bool canCopyRegion[regionCount];
-	uint32_t copyRegionCount = 0;
-	uint32_t renderRegionCount = 0;
+	_mvkImageBlitRenders.clear();		// Clear for reuse
 	for (uint32_t i = 0; i < regionCount; i++) {
-		const VkImageBlit* pRegion = &pRegions[i];
-		uint32_t layCnt = pRegion->srcSubresource.layerCount;
-		if ( canCopy(pRegion) && (_srcImage->getMTLPixelFormat() == _mtlPixFmt) ) {
-			canCopyRegion[i] = true;
-			copyRegionCount += layCnt;
-		} else {
-			canCopyRegion[i] = false;
-			renderRegionCount += layCnt;
-		}
+		addImageBlitRegion(pRegions[i]);
 	}
 
-	// Add copy and BLIT regions accordingly
-    _mtlTexCopyRegions.clear();     // Clear for reuse
-	_mtlTexCopyRegions.reserve(copyRegionCount);
-    _mtlTexBlitRenders.clear();     // Clear for reuse
-	_mtlTexBlitRenders.reserve(renderRegionCount);
+	// Validate
+	if ( !_mvkImageBlitRenders.empty() &&
+		(mvkMTLPixelFormatIsDepthFormat(_srcMTLPixFmt) ||
+		 mvkMTLPixelFormatIsStencilFormat(_srcMTLPixFmt)) ) {
 
-	for (uint32_t i = 0; i < regionCount; i++) {
-		const VkImageBlit* pRegion = &pRegions[i];
-		if (canCopyRegion[i]) {
-			addMetalCopyRegions(pRegion);
-		} else {
-			addMetalBlitRenders(pRegion);
-		}
+		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdBlitImage(): Scaling or inverting depth/stencil images is not supported."));
+		_mvkImageBlitRenders.clear();
 	}
-
-    // Validate
-    if (_blitKey.isDepthFormat() && renderRegionCount > 0) {
-        setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdBlitImage(): Scaling of depth/stencil images is not supported."));
-    }
-    if ( !_mtlTexBlitRenders.empty() && mvkMTLPixelFormatIsStencilFormat(_mtlPixFmt)) {
-        setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdBlitImage(): Stencil image formats cannot be scaled or inverted."));
-    }
 }
 
-bool MVKCmdBlitImage::canCopy(const VkImageBlit* pRegion) {
-	VkOffset3D srcSize = mvkVkOffset3DDifference(pRegion->srcOffsets[1], pRegion->srcOffsets[0]);
-	VkOffset3D dstSize = mvkVkOffset3DDifference(pRegion->dstOffsets[1], pRegion->dstOffsets[0]);
+void MVKCmdBlitImage::addImageBlitRegion(const VkImageBlit& region) {
+	if (_canCopyFormats && canCopy(region)) {
+		addImageCopyRegionFromBlitRegion(region);	// Convert to image copy
+	} else {
+		MVKImageBlitRender blitRender;
+		blitRender.region = region;
+		populateVertices(blitRender.vertices, region);
+		_mvkImageBlitRenders.push_back(blitRender);
+	}
+}
 
-	// The source and destination sizes must be equal and not be negative in any direction
+// The source and destination sizes must be equal and not be negative in any direction
+bool MVKCmdBlitImage::canCopy(const VkImageBlit& region) {
+	VkOffset3D srcSize = mvkVkOffset3DDifference(region.srcOffsets[1], region.srcOffsets[0]);
+	VkOffset3D dstSize = mvkVkOffset3DDifference(region.dstOffsets[1], region.dstOffsets[0]);
 	return (mvkVkOffset3DsAreEqual(srcSize, dstSize) &&
 			(srcSize.x >= 0) && (srcSize.y >= 0) && (srcSize.z >= 0));
 }
 
-// Adds a Metal copy region structure for each layer in the specified BLIT region.
-void MVKCmdBlitImage::addMetalCopyRegions(const VkImageBlit* pRegion) {
+void MVKCmdBlitImage::addImageCopyRegionFromBlitRegion(const VkImageBlit& region) {
+	const VkOffset3D& so0 = region.srcOffsets[0];
+	const VkOffset3D& so1 = region.srcOffsets[1];
 
-    const VkOffset3D* pSo0 = &pRegion->srcOffsets[0];
-    const VkOffset3D* pSo1 = &pRegion->srcOffsets[1];
+	VkImageCopy cpyRgn;
+	cpyRgn.srcSubresource = region.srcSubresource;
+	cpyRgn.srcOffset = region.srcOffsets[0];
+	cpyRgn.dstSubresource = region.dstSubresource;
+	cpyRgn.dstOffset = region.dstOffsets[0];
+	cpyRgn.extent.width = so1.x - so0.x;
+	cpyRgn.extent.height = so1.y - so0.y;
+	cpyRgn.extent.depth = so1.z - so0.z;
 
-    MVKMetalCopyTextureRegion mtlImgRgn;
-    mtlImgRgn.srcOrigin = mvkMTLOriginFromVkOffset3D(*pSo0);
-    mtlImgRgn.dstOrigin = mvkMTLOriginFromVkOffset3D(pRegion->dstOffsets[0]);
-    mtlImgRgn.srcSize = MTLSizeMake((pSo1->x - pSo0->x), (pSo1->y - pSo0->y), (pSo1->z - pSo0->z));
-    mtlImgRgn.srcLevel = pRegion->srcSubresource.mipLevel;
-    mtlImgRgn.dstLevel = pRegion->dstSubresource.mipLevel;
-
-    uint32_t srcBaseLayer = pRegion->srcSubresource.baseArrayLayer;
-    uint32_t dstBaseLayer = pRegion->dstSubresource.baseArrayLayer;
-	uint32_t layCnt = pRegion->srcSubresource.layerCount;
-
-    for (uint32_t layIdx = 0; layIdx < layCnt; layIdx++) {
-		mtlImgRgn.srcSlice = srcBaseLayer + layIdx;
-		mtlImgRgn.dstSlice = dstBaseLayer + layIdx;
-        _mtlTexCopyRegions.push_back(mtlImgRgn);
-	}
+	MVKCmdCopyImage::addImageCopyRegion(cpyRgn);
 }
 
-// Adds a Metal BLIT render region structure for each layer in the specified BLIT region.
-void MVKCmdBlitImage::addMetalBlitRenders(const VkImageBlit* pRegion) {
-
-    MVKMetalBlitTextureRender mtlBlitRndr;
-    mtlBlitRndr.srcLevel = pRegion->srcSubresource.mipLevel;
-    mtlBlitRndr.dstLevel = pRegion->dstSubresource.mipLevel;
-    populateVertices(mtlBlitRndr.vertices, pRegion);
-
-    uint32_t srcBaseLayer = pRegion->srcSubresource.baseArrayLayer;
-	uint32_t dstBaseLayer = pRegion->dstSubresource.baseArrayLayer;
-	uint32_t layCnt = pRegion->srcSubresource.layerCount;
-
-	for (uint32_t layIdx = 0; layIdx < layCnt; layIdx++) {
-		mtlBlitRndr.srcSlice = srcBaseLayer + layIdx;
-		mtlBlitRndr.dstSlice = dstBaseLayer + layIdx;
-        _mtlTexBlitRenders.push_back(mtlBlitRndr);
-	}
-}
-
-// Populates the vertices in the specified array from the specified region.
-void MVKCmdBlitImage::populateVertices(MVKVertexPosTex* vertices, const VkImageBlit* pRegion) {
-    const VkOffset3D* pSo0 = &pRegion->srcOffsets[0];
-    const VkOffset3D* pSo1 = &pRegion->srcOffsets[1];
-    const VkOffset3D* pDo0 = &pRegion->dstOffsets[0];
-    const VkOffset3D* pDo1 = &pRegion->dstOffsets[1];
+void MVKCmdBlitImage::populateVertices(MVKVertexPosTex* vertices, const VkImageBlit& region) {
+    const VkOffset3D& so0 = region.srcOffsets[0];
+    const VkOffset3D& so1 = region.srcOffsets[1];
+    const VkOffset3D& do0 = region.dstOffsets[0];
+    const VkOffset3D& do1 = region.dstOffsets[1];
 
     // Get the extents of the source and destination textures.
-    VkExtent3D srcExtent = _srcImage->getExtent3D(pRegion->srcSubresource.mipLevel);
-    VkExtent3D dstExtent = _dstImage->getExtent3D(pRegion->dstSubresource.mipLevel);
+    VkExtent3D srcExtent = _srcImage->getExtent3D(region.srcSubresource.mipLevel);
+    VkExtent3D dstExtent = _dstImage->getExtent3D(region.dstSubresource.mipLevel);
 
     // Determine the bottom-left and top-right corners of the source and destination
     // texture regions, each as a fraction of the corresponding texture size.
-    CGPoint srcBL = CGPointMake((CGFloat)(pSo0->x) / (CGFloat)srcExtent.width,
-                                (CGFloat)(srcExtent.height - pSo1->y) / (CGFloat)srcExtent.height);
-    CGPoint srcTR = CGPointMake((CGFloat)(pSo1->x) / (CGFloat)srcExtent.width,
-                                (CGFloat)(srcExtent.height - pSo0->y) / (CGFloat)srcExtent.height);
-    CGPoint dstBL = CGPointMake((CGFloat)(pDo0->x) / (CGFloat)dstExtent.width,
-                                (CGFloat)(dstExtent.height - pDo1->y) / (CGFloat)dstExtent.height);
-    CGPoint dstTR = CGPointMake((CGFloat)(pDo1->x) / (CGFloat)dstExtent.width,
-                                (CGFloat)(dstExtent.height - pDo0->y) / (CGFloat)dstExtent.height);
+    CGPoint srcBL = CGPointMake((CGFloat)(so0.x) / (CGFloat)srcExtent.width,
+                                (CGFloat)(srcExtent.height - so1.y) / (CGFloat)srcExtent.height);
+    CGPoint srcTR = CGPointMake((CGFloat)(so1.x) / (CGFloat)srcExtent.width,
+                                (CGFloat)(srcExtent.height - so0.y) / (CGFloat)srcExtent.height);
+    CGPoint dstBL = CGPointMake((CGFloat)(do0.x) / (CGFloat)dstExtent.width,
+                                (CGFloat)(dstExtent.height - do1.y) / (CGFloat)dstExtent.height);
+    CGPoint dstTR = CGPointMake((CGFloat)(do1.x) / (CGFloat)dstExtent.width,
+                                (CGFloat)(dstExtent.height - do0.y) / (CGFloat)dstExtent.height);
 
     // The destination region is used for vertex positions,
     // which are bounded by (-1.0 < p < 1.0) in clip-space.
@@ -282,7 +322,7 @@
     pVtx->position.y = dstTR.y;
     pVtx->texCoord.x = srcBL.x;
     pVtx->texCoord.y = (1.0 - srcTR.y);
-    
+
     // Top right vertex
     pVtx = &vertices[3];
     pVtx->position.x = dstTR.x;
@@ -293,50 +333,56 @@
 
 void MVKCmdBlitImage::encode(MVKCommandEncoder* cmdEncoder) {
 
-    // Perform those BLITs that can be covered by simple texture copying.
-    if ( !_mtlTexCopyRegions.empty() ) {
-        MVKCmdCopyImage::encode(cmdEncoder);
-    }
+	// Perform those BLITs that can be covered by simple texture copying.
+	if ( !_imageCopyRegions.empty() ) {
+		MVKCmdCopyImage::encode(cmdEncoder);
+	}
 
-    // Perform those BLITs that require rendering to destination texture.
-    if ( !_mtlTexBlitRenders.empty() && !_blitKey.isDepthFormat() ) {
+	// Perform those BLITs that require rendering to destination texture.
+	if ( !_mvkImageBlitRenders.empty() ) {
 
-        cmdEncoder->endCurrentMetalEncoding();
+		cmdEncoder->endCurrentMetalEncoding();
 
-        id<MTLTexture> srcMTLTex = _srcImage->getMTLTexture();
-        id<MTLTexture> dstMTLTex = _dstImage->getMTLTexture();
-        if ( !srcMTLTex || !dstMTLTex ) { return; }
+		id<MTLTexture> srcMTLTex = _srcImage->getMTLTexture();
+		id<MTLTexture> dstMTLTex = _dstImage->getMTLTexture();
+		if ( !srcMTLTex || !dstMTLTex ) { return; }
 
-		bool isArrayType = _blitKey.isArrayType();
+		MTLRenderPassColorAttachmentDescriptor* mtlColorAttDesc = _mtlRenderPassDescriptor.colorAttachments[0];
+		mtlColorAttDesc.texture = dstMTLTex;
 
-        MTLRenderPassColorAttachmentDescriptor* mtlColorAttDesc = _mtlRenderPassDescriptor.colorAttachments[0];
-        mtlColorAttDesc.texture = dstMTLTex;
+		uint32_t vtxBuffIdx = getDevice()->getMetalBufferIndexForVertexAttributeBinding(kMVKVertexContentBufferIndex);
 
-        uint32_t vtxBuffIdx = getDevice()->getMetalBufferIndexForVertexAttributeBinding(kMVKVertexContentBufferIndex);
+		MVKCommandEncodingPool* cmdEncPool = getCommandEncodingPool();
 
-        MVKCommandEncodingPool* cmdEncPool = getCommandEncodingPool();
+		for (auto& bltRend : _mvkImageBlitRenders) {
 
-        for (auto& bltRend : _mtlTexBlitRenders) {
+			mtlColorAttDesc.level = bltRend.region.dstSubresource.mipLevel;
 
-            // Update the render pass descriptor for the texture level and slice, and create a render encoder.
-            mtlColorAttDesc.level = bltRend.dstLevel;
-            mtlColorAttDesc.slice = bltRend.dstSlice;
-            id<MTLRenderCommandEncoder> mtlRendEnc = [cmdEncoder->_mtlCmdBuffer renderCommandEncoderWithDescriptor: _mtlRenderPassDescriptor];
-			setLabelIfNotNil(mtlRendEnc, mvkMTLRenderCommandEncoderLabel(_commandUse));
+			uint32_t srcBaseLayer = bltRend.region.srcSubresource.baseArrayLayer;
+			uint32_t dstBaseLayer = bltRend.region.dstSubresource.baseArrayLayer;
 
-            [mtlRendEnc pushDebugGroup: @"vkCmdBlitImage"];
-            [mtlRendEnc setRenderPipelineState: cmdEncPool->getCmdBlitImageMTLRenderPipelineState(_blitKey)];
-            cmdEncoder->setVertexBytes(mtlRendEnc, bltRend.vertices, sizeof(bltRend.vertices), vtxBuffIdx);
-			[mtlRendEnc setFragmentTexture: srcMTLTex atIndex: 0];
-			[mtlRendEnc setFragmentSamplerState: cmdEncPool->getCmdBlitImageMTLSamplerState(_mtlFilter) atIndex: 0];
-			if (isArrayType) {
-				cmdEncoder->setFragmentBytes(mtlRendEnc, &bltRend, sizeof(bltRend), 0);
+			uint32_t layCnt = bltRend.region.srcSubresource.layerCount;
+			for (uint32_t layIdx = 0; layIdx < layCnt; layIdx++) {
+				// Update the render pass descriptor for the texture level and slice, and create a render encoder.
+				mtlColorAttDesc.slice = dstBaseLayer + layIdx;
+				id<MTLRenderCommandEncoder> mtlRendEnc = [cmdEncoder->_mtlCmdBuffer renderCommandEncoderWithDescriptor: _mtlRenderPassDescriptor];
+				setLabelIfNotNil(mtlRendEnc, mvkMTLRenderCommandEncoderLabel(_commandUse));
+
+				[mtlRendEnc pushDebugGroup: @"vkCmdBlitImage"];
+				[mtlRendEnc setRenderPipelineState: cmdEncPool->getCmdBlitImageMTLRenderPipelineState(_blitKey)];
+				cmdEncoder->setVertexBytes(mtlRendEnc, bltRend.vertices, sizeof(bltRend.vertices), vtxBuffIdx);
+
+				[mtlRendEnc setFragmentTexture: srcMTLTex atIndex: 0];
+				[mtlRendEnc setFragmentSamplerState: cmdEncPool->getCmdBlitImageMTLSamplerState(_mtlFilter) atIndex: 0];
+				uint32_t srcSlice = srcBaseLayer + layIdx;
+				cmdEncoder->setFragmentBytes(mtlRendEnc, &srcSlice, sizeof(srcSlice), 0);
+
+				[mtlRendEnc drawPrimitives: MTLPrimitiveTypeTriangleStrip vertexStart: 0 vertexCount: kMVKBlitVertexCount];
+				[mtlRendEnc popDebugGroup];
+				[mtlRendEnc endEncoding];
 			}
-            [mtlRendEnc drawPrimitives: MTLPrimitiveTypeTriangleStrip vertexStart: 0 vertexCount: kMVKBlitVertexCount];
-            [mtlRendEnc popDebugGroup];
-            [mtlRendEnc endEncoding];
-        }
-    }
+		}
+	}
 }
 
 
@@ -397,7 +443,8 @@
         addResolveSlices(rslvRgn);
     }
 
-    _srcImage->getTransferDescriptorData(_transferImageData);
+    _dstImage->getTransferDescriptorData(_transferImageData);
+	_transferImageData.samples = _srcImage->getSampleCount();
 }
 
 /**
@@ -487,7 +534,7 @@
     if (expRgnCnt > 0) {
         MVKCmdBlitImage expandCmd(&getCommandPool()->_cmdBlitImagePool);
         expandCmd.setContent((VkImage)_dstImage, _dstLayout, (VkImage)xfrImage, _dstLayout,
-                             uint32_t(_expansionRegions.size()), _expansionRegions.data(),
+                             expRgnCnt, _expansionRegions.data(),
                              VK_FILTER_LINEAR, kMVKCommandUseResolveExpandImage);
         expandCmd.encode(cmdEncoder);
     }
@@ -499,7 +546,7 @@
     if (cpyRgnCnt > 0) {
         MVKCmdCopyImage copyCmd(&getCommandPool()->_cmdCopyImagePool);
         copyCmd.setContent((VkImage)_srcImage, _srcLayout, (VkImage)xfrImage, _dstLayout,
-                           uint32_t(_copyRegions.size()), _copyRegions.data(), kMVKCommandUseResolveCopyImage);
+                           cpyRgnCnt, _copyRegions.data(), kMVKCommandUseResolveCopyImage);
         copyCmd.encode(cmdEncoder);
     }
 
@@ -641,10 +688,10 @@
     _toImage = toImage;
 
     // Add buffer regions
-    _mtlBuffImgCopyRegions.clear();     // Clear for reuse
-    _mtlBuffImgCopyRegions.reserve(regionCount);
+    _bufferImageCopyRegions.clear();     // Clear for reuse
+    _bufferImageCopyRegions.reserve(regionCount);
     for (uint32_t i = 0; i < regionCount; i++) {
-        _mtlBuffImgCopyRegions.push_back(pRegions[i]);
+        _bufferImageCopyRegions.push_back(pRegions[i]);
     }
 
     // Validate
@@ -663,7 +710,7 @@
     MTLPixelFormat mtlPixFmt = _image->getMTLPixelFormat();
     MVKCommandUse cmdUse = _toImage ? kMVKCommandUseCopyBufferToImage : kMVKCommandUseCopyImageToBuffer;
 
-    for (auto& cpyRgn : _mtlBuffImgCopyRegions) {
+    for (auto& cpyRgn : _bufferImageCopyRegions) {
 
         MTLOrigin mtlTxtOrigin = mvkMTLOriginFromVkOffset3D(cpyRgn.imageOffset);
         MTLSize mtlTxtSize = mvkMTLSizeFromVkExtent3D(cpyRgn.imageExtent);
@@ -683,8 +730,8 @@
         MTLBlitOption blitOptions = MTLBlitOptionNone;
         if (mvkMTLPixelFormatIsDepthFormat(mtlPixFmt) && mvkMTLPixelFormatIsStencilFormat(mtlPixFmt)) {
             VkImageAspectFlags imgFlags = cpyRgn.imageSubresource.aspectMask;
-            bool wantDepth = mvkAreFlagsEnabled(imgFlags, VK_IMAGE_ASPECT_DEPTH_BIT);
-            bool wantStencil = mvkAreFlagsEnabled(imgFlags, VK_IMAGE_ASPECT_STENCIL_BIT);
+            bool wantDepth = mvkAreAllFlagsEnabled(imgFlags, VK_IMAGE_ASPECT_DEPTH_BIT);
+            bool wantStencil = mvkAreAllFlagsEnabled(imgFlags, VK_IMAGE_ASPECT_STENCIL_BIT);
 
             // The stencil component is always 1 byte per pixel.
 			// Don't reduce depths of 32-bit depth/stencil formats.
@@ -708,12 +755,10 @@
 #endif
 
 #if MVK_MACOS
-        if (_toImage && mvkFormatTypeFromMTLPixelFormat(mtlPixFmt) == kMVKFormatCompressed &&
-            mtlTexture.textureType == MTLTextureType3D) {
-            // If we're copying to a compressed 3D image, the image data need to be decompressed.
-            // If we're copying to mip level 0, we can skip the copy and just decode
-            // directly into the image. Otherwise, we need to use an intermediate
-            // buffer.
+		// If we're copying to a compressed 3D image, the image data need to be decompressed.
+		// If we're copying to mip level 0, we can skip the copy and just decode
+		// directly into the image. Otherwise, we need to use an intermediate buffer.
+        if (_toImage && _image->getIsCompressed() && mtlTexture.textureType == MTLTextureType3D) {
             MVKCmdCopyBufferToImageInfo info;
             info.srcRowStride = bytesPerRow & 0xffffffff;
             info.srcRowStrideHigh = bytesPerRow >> 32;
@@ -778,6 +823,10 @@
             if (!needsTempBuff) { continue; }
         }
 #endif
+
+		// Don't supply bytes per image if not an arrayed texture
+		if ( !isArrayTexture() ) { bytesPerImg = 0; }
+
         id<MTLBlitCommandEncoder> mtlBlitEnc = cmdEncoder->getMTLBlitEncoder(cmdUse);
 
         for (uint32_t lyrIdx = 0; lyrIdx < cpyRgn.imageSubresource.layerCount; lyrIdx++) {
@@ -808,6 +857,16 @@
     }
 }
 
+bool MVKCmdBufferImageCopy::isArrayTexture() {
+	MTLTextureType mtlTexType = _image->getMTLTextureType();
+	return (mtlTexType == MTLTextureType3D ||
+			mtlTexType == MTLTextureType2DArray ||
+#if MVK_MACOS
+			mtlTexType == MTLTextureType2DMultisampleArray ||
+#endif
+			mtlTexType == MTLTextureType1DArray);
+}
+
 
 #pragma mark -
 #pragma mark MVKCmdClearAttachments
@@ -852,22 +911,22 @@
     // The depth value (including vertex position Z value) is held in the last index.
     _clearColors[kMVKClearAttachmentDepthStencilIndex] = { mtlDepthVal, mtlDepthVal, mtlDepthVal, mtlDepthVal };
 
-    _clearRects.clear();
+    _clearRects.clear();		// Clear for reuse
     _clearRects.reserve(rectCount);
     for (uint32_t i = 0; i < rectCount; i++) {
         _clearRects.push_back(pRects[i]);
     }
 
+	_vertices.clear();			// Clear for reuse
     _vertices.reserve(rectCount * 6);
 }
 
-/** Populates the vertices for all clear rectangles within an attachment of the specified size. */
+// Populates the vertices for all clear rectangles within an attachment of the specified size.
 void MVKCmdClearAttachments::populateVertices(float attWidth, float attHeight) {
-    _vertices.clear();
     for (auto& rect : _clearRects) { populateVertices(rect, attWidth, attHeight); }
 }
 
-/** Populates the vertices from the specified rectangle within an attachment of the specified size. */
+// Populates the vertices from the specified rectangle within an attachment of the specified size.
 void MVKCmdClearAttachments::populateVertices(VkClearRect& clearRect, float attWidth, float attHeight) {
 
     // Determine the positions of the four edges of the
@@ -989,13 +1048,20 @@
 	_mtlStencilClearValue = mvkMTLClearStencilFromVkClearValue(clearValue);
 
     // Add subresource ranges
-    _subresourceRanges.clear();
+    _subresourceRanges.clear();		// Clear for reuse
     _subresourceRanges.reserve(rangeCount);
     for (uint32_t i = 0; i < rangeCount; i++) {
         _subresourceRanges.push_back(pRanges[i]);
     }
+
+	// Validate
+	if ( !_image->getSupportsAllFormatFeatures(VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ) {
+		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdClearImage(): Format %s cannot be cleared on this device.", mvkVkFormatName(_image->getVkFormat())));
+	}
 }
 void MVKCmdClearImage::encode(MVKCommandEncoder* cmdEncoder) {
+	if (getConfigurationResult()) { return; }
+
 	id<MTLTexture> imgMTLTex = _image->getMTLTexture();
     if ( !imgMTLTex ) { return; }
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
index 48fdab7..40dfbd9 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
@@ -42,14 +42,14 @@
 	_canAcceptCommands = true;
 
 	VkCommandBufferUsageFlags usage = pBeginInfo->flags;
-	_isReusable = !mvkAreFlagsEnabled(usage, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
-	_supportsConcurrentExecution = mvkAreFlagsEnabled(usage, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
+	_isReusable = !mvkAreAllFlagsEnabled(usage, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
+	_supportsConcurrentExecution = mvkAreAllFlagsEnabled(usage, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
 
 	// If this is a secondary command buffer, and contains inheritance info, set the inheritance info and determine
 	// whether it contains render pass continuation info. Otherwise, clear the inheritance info, and ignore it.
 	const VkCommandBufferInheritanceInfo* pInheritInfo = (_isSecondary ? pBeginInfo->pInheritanceInfo : NULL);
 	bool hasInheritInfo = mvkSetOrClear(&_secondaryInheritanceInfo, pInheritInfo);
-	_doesContinueRenderPass = mvkAreFlagsEnabled(usage, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) && hasInheritInfo;
+	_doesContinueRenderPass = mvkAreAllFlagsEnabled(usage, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) && hasInheritInfo;
 
 	return getConfigurationResult();
 }
@@ -76,7 +76,7 @@
 	_initialVisibilityResultMTLBuffer = nil;		// not retained
 	setConfigurationResult(VK_NOT_READY);
 
-	if (mvkAreFlagsEnabled(flags, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT)) {
+	if (mvkAreAllFlagsEnabled(flags, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT)) {
 		// TODO: what are we releasing or returning here?
 	}
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
index 328ff5c..641832e 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
@@ -44,7 +44,10 @@
 MVKPipeline* MVKPipelineCommandEncoderState::getPipeline() { return _pipeline; }
 
 void MVKPipelineCommandEncoderState::encodeImpl(uint32_t stage) {
-    if (_pipeline) { _pipeline->encode(_cmdEncoder, stage); }
+    if (_pipeline) {
+		_pipeline->encode(_cmdEncoder, stage);
+		_pipeline->bindPushConstants(_cmdEncoder);
+	}
 }
 
 void MVKPipelineCommandEncoderState::resetImpl() {
@@ -167,9 +170,14 @@
     }
 }
 
+// At this point, I have been marked not-dirty, under the assumption that I will make changes to the encoder.
+// However, some of the paths below decide not to actually make any changes to the encoder. In that case,
+// I should remain dirty until I actually do make encoder changes.
 void MVKPushConstantsCommandEncoderState::encodeImpl(uint32_t stage) {
     if (_pushConstants.empty() ) { return; }
 
+	_isDirty = true;	// Stay dirty until I actually decide to make a change to the encoder
+
     switch (_shaderStage) {
         case VK_SHADER_STAGE_VERTEX_BIT:
             if (stage == (isTessellating() ? kMVKGraphicsStageVertex : kMVKGraphicsStageRasterization)) {
@@ -177,6 +185,7 @@
                                             _pushConstants.data(),
                                             _pushConstants.size(),
                                             _mtlBufferIndex);
+				_isDirty = false;	// Okay, I changed the encoder
             }
             break;
         case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
@@ -185,6 +194,7 @@
                                              _pushConstants.data(),
                                              _pushConstants.size(),
                                              _mtlBufferIndex);
+				_isDirty = false;	// Okay, I changed the encoder
             }
             break;
         case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
@@ -193,6 +203,7 @@
                                             _pushConstants.data(),
                                             _pushConstants.size(),
                                             _mtlBufferIndex);
+				_isDirty = false;	// Okay, I changed the encoder
             }
             break;
         case VK_SHADER_STAGE_FRAGMENT_BIT:
@@ -201,6 +212,7 @@
                                               _pushConstants.data(),
                                               _pushConstants.size(),
                                               _mtlBufferIndex);
+				_isDirty = false;	// Okay, I changed the encoder
             }
             break;
         case VK_SHADER_STAGE_COMPUTE_BIT:
@@ -208,6 +220,7 @@
                                          _pushConstants.data(),
                                          _pushConstants.size(),
                                          _mtlBufferIndex);
+			_isDirty = false;	// Okay, I changed the encoder
             break;
         default:
             MVKAssert(false, "Unsupported shader stage: %d", _shaderStage);
@@ -272,10 +285,10 @@
     if ( !(_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK) &&
            mvkIsAnyFlagEnabled(faceMask, VK_STENCIL_FRONT_AND_BACK)) ) { return; }
 
-    if (mvkAreFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
+    if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
         _depthStencilData.frontFaceStencilData.readMask = stencilCompareMask;
     }
-    if (mvkAreFlagsEnabled(faceMask, VK_STENCIL_FACE_BACK_BIT)) {
+    if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_BACK_BIT)) {
         _depthStencilData.backFaceStencilData.readMask = stencilCompareMask;
     }
 
@@ -289,10 +302,10 @@
     if ( !(_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK) &&
            mvkIsAnyFlagEnabled(faceMask, VK_STENCIL_FRONT_AND_BACK)) ) { return; }
 
-    if (mvkAreFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
+    if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
         _depthStencilData.frontFaceStencilData.writeMask = stencilWriteMask;
     }
-    if (mvkAreFlagsEnabled(faceMask, VK_STENCIL_FACE_BACK_BIT)) {
+    if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_BACK_BIT)) {
         _depthStencilData.backFaceStencilData.writeMask = stencilWriteMask;
     }
 
@@ -342,10 +355,10 @@
     if ( !(_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_REFERENCE) &&
            mvkIsAnyFlagEnabled(faceMask, VK_STENCIL_FRONT_AND_BACK)) ) { return; }
 
-    if (mvkAreFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
+    if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
         _frontFaceValue = stencilReference;
     }
-    if (mvkAreFlagsEnabled(faceMask, VK_STENCIL_FACE_BACK_BIT)) {
+    if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_BACK_BIT)) {
         _backFaceValue = stencilReference;
     }
 
@@ -793,7 +806,7 @@
     NSUInteger offset = pQueryPool->getVisibilityResultOffset(query);
     NSUInteger maxOffset = _cmdEncoder->_pDeviceMetalFeatures->maxQueryBufferSize - kMVKQuerySlotSizeInBytes;
 
-    bool shouldCount = _cmdEncoder->_pDeviceFeatures->occlusionQueryPrecise && mvkAreFlagsEnabled(flags, VK_QUERY_CONTROL_PRECISE_BIT);
+    bool shouldCount = _cmdEncoder->_pDeviceFeatures->occlusionQueryPrecise && mvkAreAllFlagsEnabled(flags, VK_QUERY_CONTROL_PRECISE_BIT);
     _mtlVisibilityResultMode = shouldCount ? MTLVisibilityResultModeCounting : MTLVisibilityResultModeBoolean;
     _mtlVisibilityResultOffset = min(offset, maxOffset);
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandPool.mm b/MoltenVK/MoltenVK/Commands/MVKCommandPool.mm
index 3bdb118..1c5d51e 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandPool.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandPool.mm
@@ -33,7 +33,7 @@
 
 // Reset all of the command buffers
 VkResult MVKCommandPool::reset(VkCommandPoolResetFlags flags) {
-	bool releaseRez = mvkAreFlagsEnabled(flags, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
+	bool releaseRez = mvkAreAllFlagsEnabled(flags, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
 
 	VkCommandBufferResetFlags cmdBuffFlags = releaseRez ? VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT : 0;
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
index 55bef82..a14e2de 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
@@ -35,25 +35,38 @@
  * This structure can be used as a key in a std::map and std::unordered_map.
  */
 typedef struct MVKRPSKeyBlitImg_t {
-	uint16_t mtlPixFmt = 0;			/**< MTLPixelFormat */
-	uint16_t mtlTexType = 0;		/**< MTLTextureType */
+	uint16_t srcMTLPixelFormat = 0;			/**< as MTLPixelFormat */
+	uint16_t srcMTLTextureType = 0;			/**< as MTLTextureType */
+	uint16_t dstMTLPixelFormat = 0;			/**< as MTLPixelFormat */
+	uint16_t dstSampleCount = 0;
 
 	bool operator==(const MVKRPSKeyBlitImg_t& rhs) const {
-		return ((mtlPixFmt == rhs.mtlPixFmt) && (mtlTexType == rhs.mtlTexType));
+		if (srcMTLPixelFormat != rhs.srcMTLPixelFormat) { return false; }
+		if (srcMTLTextureType != rhs.srcMTLTextureType) { return false; }
+		if (dstMTLPixelFormat != rhs.dstMTLPixelFormat) { return false; }
+		if (dstSampleCount != rhs.dstSampleCount) { return false; }
+		return true;
 	}
 
-	inline MTLPixelFormat getMTLPixelFormat() { return (MTLPixelFormat)mtlPixFmt; }
+	inline MTLPixelFormat getSrcMTLPixelFormat() { return (MTLPixelFormat)srcMTLPixelFormat; }
 
-	inline bool isDepthFormat() { return mvkMTLPixelFormatIsDepthFormat(getMTLPixelFormat()); }
+	inline MTLPixelFormat getDstMTLPixelFormat() { return (MTLPixelFormat)dstMTLPixelFormat; }
 
-	inline MTLTextureType getMTLTextureType() { return (MTLTextureType)mtlTexType; }
-
-	inline bool isArrayType() { return (mtlTexType == MTLTextureType2DArray) || (mtlTexType == MTLTextureType1DArray); }
+	inline bool isSrcArrayType() {
+		return (srcMTLTextureType == MTLTextureType2DArray ||
+#if MVK_MACOS
+				srcMTLTextureType == MTLTextureType2DMultisampleArray ||
+#endif
+				srcMTLTextureType == MTLTextureType1DArray); }
 
 	std::size_t hash() const {
-		std::size_t hash = mtlTexType;
+		std::size_t hash = srcMTLPixelFormat;
 		hash <<= 16;
-		hash |= mtlPixFmt;
+		hash |= srcMTLTextureType;
+		hash <<= 16;
+		hash |= dstMTLPixelFormat;
+		hash <<= 16;
+		hash |= dstSampleCount;
 		return hash;
 	}
 
@@ -344,8 +357,8 @@
      */
     id<MTLDepthStencilState> newMTLDepthStencilState(MVKMTLDepthStencilDescriptorData& dsData);
 
-    /** Returns an autoreleased MTLStencilDescriptor constructed from the stencil data. */
-    MTLStencilDescriptor* getMTLStencilDescriptor(MVKMTLStencilDescriptorData& sData);
+    /** Returns an retained MTLStencilDescriptor constructed from the stencil data. */
+    MTLStencilDescriptor* newMTLStencilDescriptor(MVKMTLStencilDescriptorData& sData);
 
     /**
      * Returns a new MVKImage configured with content held in Private storage.
@@ -392,15 +405,15 @@
 protected:
 	void initMTLLibrary();
 	void initImageDeviceMemory();
-	id<MTLFunction> getBlitFragFunction(MVKRPSKeyBlitImg& blitKey);
-	id<MTLFunction> getClearVertFunction(MVKRPSKeyClearAtt& attKey);
-	id<MTLFunction> getClearFragFunction(MVKRPSKeyClearAtt& attKey);
+	id<MTLFunction> newBlitFragFunction(MVKRPSKeyBlitImg& blitKey);
+	id<MTLFunction> newClearVertFunction(MVKRPSKeyClearAtt& attKey);
+	id<MTLFunction> newClearFragFunction(MVKRPSKeyClearAtt& attKey);
 	NSString* getMTLFormatTypeString(MTLPixelFormat mtlPixFmt);
-    id<MTLFunction> getFunctionNamed(const char* funcName);
+    id<MTLFunction> newFunctionNamed(const char* funcName);
 	id<MTLFunction> newMTLFunction(NSString* mslSrcCode, NSString* funcName);
 	id<MTLRenderPipelineState> newMTLRenderPipelineState(MTLRenderPipelineDescriptor* plDesc,
 														 MVKVulkanAPIDeviceObject* owner);
-	id<MTLComputePipelineState> newMTLComputePipelineState(id<MTLFunction> mtlFunction,
+	id<MTLComputePipelineState> newMTLComputePipelineState(const char* funcName,
 														   MVKVulkanAPIDeviceObject* owner);
 
 	id<MTLLibrary> _mtlLibrary;
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm
index 29d56a7..20b6f32 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm
@@ -33,13 +33,16 @@
 
 id<MTLRenderPipelineState> MVKCommandResourceFactory::newCmdBlitImageMTLRenderPipelineState(MVKRPSKeyBlitImg& blitKey,
 																							MVKVulkanAPIDeviceObject* owner) {
-    MTLRenderPipelineDescriptor* plDesc = [[[MTLRenderPipelineDescriptor alloc] init] autorelease];
+	id<MTLFunction> vtxFunc = newFunctionNamed("vtxCmdBlitImage");				// temp retain
+	id<MTLFunction> fragFunc = newBlitFragFunction(blitKey);					// temp retain
+    MTLRenderPipelineDescriptor* plDesc = [MTLRenderPipelineDescriptor new];	// temp retain
     plDesc.label = @"CmdBlitImage";
 
-	plDesc.vertexFunction = getFunctionNamed("vtxCmdBlitImage");
-    plDesc.fragmentFunction = getBlitFragFunction(blitKey);
+	plDesc.vertexFunction = vtxFunc;
+	plDesc.fragmentFunction = fragFunc;
+	plDesc.sampleCount = blitKey.dstSampleCount;
 
-	plDesc.colorAttachments[0].pixelFormat = blitKey.getMTLPixelFormat();
+	plDesc.colorAttachments[0].pixelFormat = blitKey.getDstMTLPixelFormat();
 
     MTLVertexDescriptor* vtxDesc = plDesc.vertexDescriptor;
 
@@ -70,12 +73,18 @@
     vbDesc.stepRate = 1;
     vbDesc.stride = vtxStride;
 
-    return newMTLRenderPipelineState(plDesc, owner);
+    id<MTLRenderPipelineState> rps = newMTLRenderPipelineState(plDesc, owner);
+
+	[vtxFunc release];															// temp release
+	[fragFunc release];															// temp release
+	[plDesc release];															// temp release
+
+	return rps;
 }
 
 id<MTLSamplerState> MVKCommandResourceFactory::newCmdBlitImageMTLSamplerState(MTLSamplerMinMagFilter mtlFilter) {
 
-    MTLSamplerDescriptor* sDesc = [[[MTLSamplerDescriptor alloc] init] autorelease];
+    MTLSamplerDescriptor* sDesc = [MTLSamplerDescriptor new];					// temp retain
     sDesc.rAddressMode = MTLSamplerAddressModeClampToZero;
     sDesc.sAddressMode = MTLSamplerAddressModeClampToZero;
     sDesc.tAddressMode = MTLSamplerAddressModeClampToZero;
@@ -83,15 +92,22 @@
     sDesc.normalizedCoordinates = YES;
     sDesc.minFilter = mtlFilter;
     sDesc.magFilter = mtlFilter;
-    return [getMTLDevice() newSamplerStateWithDescriptor: sDesc];
+
+	id<MTLSamplerState> ss = [getMTLDevice() newSamplerStateWithDescriptor: sDesc];
+
+	[sDesc release];															// temp release
+
+	return ss;
 }
 
 id<MTLRenderPipelineState> MVKCommandResourceFactory::newCmdClearMTLRenderPipelineState(MVKRPSKeyClearAtt& attKey,
 																						MVKVulkanAPIDeviceObject* owner) {
-    MTLRenderPipelineDescriptor* plDesc = [[[MTLRenderPipelineDescriptor alloc] init] autorelease];
+	id<MTLFunction> vtxFunc = newClearVertFunction(attKey);						// temp retain
+	id<MTLFunction> fragFunc = newClearFragFunction(attKey);					// temp retain
+	MTLRenderPipelineDescriptor* plDesc = [MTLRenderPipelineDescriptor new];	// temp retain
     plDesc.label = @"CmdClearAttachments";
-	plDesc.vertexFunction = getClearVertFunction(attKey);
-    plDesc.fragmentFunction = getClearFragFunction(attKey);
+	plDesc.vertexFunction = vtxFunc;
+    plDesc.fragmentFunction = fragFunc;
 	plDesc.sampleCount = attKey.mtlSampleCount;
 	plDesc.inputPrimitiveTopologyMVK = MTLPrimitiveTopologyClassTriangle;
 
@@ -126,19 +142,23 @@
     vbDesc.stepRate = 1;
     vbDesc.stride = vtxStride;
 
-    return newMTLRenderPipelineState(plDesc, owner);
+	id<MTLRenderPipelineState> rps = newMTLRenderPipelineState(plDesc, owner);
+
+	[vtxFunc release];															// temp release
+	[fragFunc release];															// temp release
+	[plDesc release];															// temp release
+
+	return rps;
 }
 
-id<MTLFunction> MVKCommandResourceFactory::getBlitFragFunction(MVKRPSKeyBlitImg& blitKey) {
-	id<MTLFunction> mtlFunc = nil;
-
-	NSString* typeStr = getMTLFormatTypeString(blitKey.getMTLPixelFormat());
-
-	bool isArrayType = blitKey.isArrayType();
-	NSString* arraySuffix = isArrayType ? @"_array" : @"";
-	NSString* sliceArg = isArrayType ? @", blitInfo.srcSlice" : @"";
-
+id<MTLFunction> MVKCommandResourceFactory::newBlitFragFunction(MVKRPSKeyBlitImg& blitKey) {
 	@autoreleasepool {
+		NSString* typeStr = getMTLFormatTypeString(blitKey.getSrcMTLPixelFormat());
+
+		bool isArrayType = blitKey.isSrcArrayType();
+		NSString* arraySuffix = isArrayType ? @"_array" : @"";
+		NSString* sliceArg = isArrayType ? @", srcSlice" : @"";
+
 		NSMutableString* msl = [NSMutableString stringWithCapacity: (2 * KIBI) ];
 		[msl appendLineMVK: @"#include <metal_stdlib>"];
 		[msl appendLineMVK: @"using namespace metal;"];
@@ -148,39 +168,25 @@
 		[msl appendLineMVK: @"    float2 v_texCoord;"];
 		[msl appendLineMVK: @"} VaryingsPosTex;"];
 		[msl appendLineMVK];
-		if (isArrayType) {
-			[msl appendLineMVK: @"typedef struct {"];
-			[msl appendLineMVK: @"    uint srcLevel;"];
-			[msl appendLineMVK: @"    uint srcSlice;"];
-			[msl appendLineMVK: @"    uint dstLevel;"];
-			[msl appendLineMVK: @"    uint dstSlice;"];
-			[msl appendLineMVK: @"} BlitInfo;"];
-			[msl appendLineMVK];
-		}
 
 		NSString* funcName = @"fragBlit";
 		[msl appendFormat: @"fragment %@4 %@(VaryingsPosTex varyings [[stage_in]],", typeStr, funcName];
 		[msl appendLineMVK];
 		[msl appendFormat: @"                         texture2d%@<%@> texture [[texture(0)]],", arraySuffix, typeStr];
 		[msl appendLineMVK];
-		if (isArrayType) {
-			[msl appendLineMVK: @"                         sampler sampler [[sampler(0)]],"];
-			[msl appendLineMVK: @"                         constant BlitInfo& blitInfo [[buffer(0)]]) {"];
-		} else {
-			[msl appendLineMVK: @"                         sampler sampler [[sampler(0)]]) {"];
-		}
+		[msl appendLineMVK: @"                         sampler sampler [[sampler(0)]],"];
+		[msl appendLineMVK: @"                         constant uint& srcSlice [[buffer(0)]]) {"];
 		[msl appendFormat: @"    return texture.sample(sampler, varyings.v_texCoord%@);", sliceArg];
 		[msl appendLineMVK];
 		[msl appendLineMVK: @"}"];
 
-		mtlFunc = newMTLFunction(msl, funcName);
 //		MVKLogDebug("\n%s", msl.UTF8String);
+
+		return newMTLFunction(msl, funcName);
 	}
-	return [mtlFunc autorelease];
 }
 
-id<MTLFunction> MVKCommandResourceFactory::getClearVertFunction(MVKRPSKeyClearAtt& attKey) {
-	id<MTLFunction> mtlFunc = nil;
+id<MTLFunction> MVKCommandResourceFactory::newClearVertFunction(MVKRPSKeyClearAtt& attKey) {
 	@autoreleasepool {
 		NSMutableString* msl = [NSMutableString stringWithCapacity: (2 * KIBI) ];
 		[msl appendLineMVK: @"#include <metal_stdlib>"];
@@ -209,14 +215,13 @@
 		[msl appendLineMVK: @"    return varyings;"];
 		[msl appendLineMVK: @"}"];
 
-		mtlFunc = newMTLFunction(msl, funcName);
 //		MVKLogDebug("\n%s", msl.UTF8String);
+
+		return newMTLFunction(msl, funcName);
 	}
-	return [mtlFunc autorelease];
 }
 
-id<MTLFunction> MVKCommandResourceFactory::getClearFragFunction(MVKRPSKeyClearAtt& attKey) {
-	id<MTLFunction> mtlFunc = nil;
+id<MTLFunction> MVKCommandResourceFactory::newClearFragFunction(MVKRPSKeyClearAtt& attKey) {
 	@autoreleasepool {
 		NSMutableString* msl = [NSMutableString stringWithCapacity: (2 * KIBI) ];
 		[msl appendLineMVK: @"#include <metal_stdlib>"];
@@ -255,10 +260,10 @@
 		[msl appendLineMVK: @"    return ccOut;"];
 		[msl appendLineMVK: @"}"];
 
-		mtlFunc = newMTLFunction(msl, funcName);
 //		MVKLogDebug("\n%s", msl.UTF8String);
+
+		return newMTLFunction(msl, funcName);
 	}
-	return [mtlFunc autorelease];
 }
 
 NSString* MVKCommandResourceFactory::getMTLFormatTypeString(MTLPixelFormat mtlPixFmt) {
@@ -277,12 +282,12 @@
 
 id<MTLDepthStencilState> MVKCommandResourceFactory::newMTLDepthStencilState(bool useDepth, bool useStencil) {
 
-	MTLDepthStencilDescriptor* dsDesc = [[[MTLDepthStencilDescriptor alloc] init] autorelease];
+	MTLDepthStencilDescriptor* dsDesc = [MTLDepthStencilDescriptor new];	// temp retain
 	dsDesc.depthCompareFunction = MTLCompareFunctionAlways;
 	dsDesc.depthWriteEnabled = useDepth;
 
 	if (useStencil) {
-		MTLStencilDescriptor* sDesc = [[[MTLStencilDescriptor alloc] init] autorelease];
+		MTLStencilDescriptor* sDesc = [MTLStencilDescriptor new];			// temp retain
 		sDesc.stencilCompareFunction = MTLCompareFunctionAlways;
 		sDesc.stencilFailureOperation = MTLStencilOperationReplace;
 		sDesc.depthFailureOperation = MTLStencilOperationReplace;
@@ -290,28 +295,42 @@
 
 		dsDesc.frontFaceStencil = sDesc;
 		dsDesc.backFaceStencil = sDesc;
+
+		[sDesc release];													// temp release
 	} else {
 		dsDesc.frontFaceStencil = nil;
 		dsDesc.backFaceStencil = nil;
 	}
 
-	return [getMTLDevice() newDepthStencilStateWithDescriptor: dsDesc];
+	id<MTLDepthStencilState> dss = [getMTLDevice() newDepthStencilStateWithDescriptor: dsDesc];
+
+	[dsDesc release];														// temp release
+
+	return dss;
 }
 
 id<MTLDepthStencilState> MVKCommandResourceFactory::newMTLDepthStencilState(MVKMTLDepthStencilDescriptorData& dsData) {
-    MTLDepthStencilDescriptor* dsDesc = [[[MTLDepthStencilDescriptor alloc] init] autorelease];
+	MTLStencilDescriptor* fsDesc = newMTLStencilDescriptor(dsData.frontFaceStencilData);	// temp retain
+	MTLStencilDescriptor* bsDesc = newMTLStencilDescriptor(dsData.backFaceStencilData);		// temp retain
+	MTLDepthStencilDescriptor* dsDesc = [MTLDepthStencilDescriptor new];					// temp retain
     dsDesc.depthCompareFunction = (MTLCompareFunction)dsData.depthCompareFunction;
     dsDesc.depthWriteEnabled = dsData.depthWriteEnabled;
-    dsDesc.frontFaceStencil = getMTLStencilDescriptor(dsData.frontFaceStencilData);
-    dsDesc.backFaceStencil = getMTLStencilDescriptor(dsData.backFaceStencilData);
+	dsDesc.frontFaceStencil = fsDesc;
+    dsDesc.backFaceStencil = bsDesc;
 
-    return [getMTLDevice() newDepthStencilStateWithDescriptor: dsDesc];
+	id<MTLDepthStencilState> dss = [getMTLDevice() newDepthStencilStateWithDescriptor: dsDesc];
+
+	[fsDesc release];																		// temp release
+	[bsDesc release];																		// temp release
+	[dsDesc release];																		// temp release
+
+	return dss;
 }
 
-MTLStencilDescriptor* MVKCommandResourceFactory::getMTLStencilDescriptor(MVKMTLStencilDescriptorData& sData) {
+MTLStencilDescriptor* MVKCommandResourceFactory::newMTLStencilDescriptor(MVKMTLStencilDescriptorData& sData) {
     if ( !sData.enabled ) { return nil; }
 
-    MTLStencilDescriptor* sDesc = [[[MTLStencilDescriptor alloc] init] autorelease];
+    MTLStencilDescriptor* sDesc = [MTLStencilDescriptor new];		// retained
     sDesc.stencilCompareFunction = (MTLCompareFunction)sData.stencilCompareFunction;
     sDesc.stencilFailureOperation = (MTLStencilOperation)sData.stencilFailureOperation;
     sDesc.depthFailureOperation = (MTLStencilOperation)sData.depthFailureOperation;
@@ -374,66 +393,75 @@
 }
 
 id<MTLComputePipelineState> MVKCommandResourceFactory::newCmdCopyBufferBytesMTLComputePipelineState(MVKVulkanAPIDeviceObject* owner) {
-	return newMTLComputePipelineState(getFunctionNamed("cmdCopyBufferBytes"), owner);
+	return newMTLComputePipelineState("cmdCopyBufferBytes", owner);
 }
 
 id<MTLComputePipelineState> MVKCommandResourceFactory::newCmdFillBufferMTLComputePipelineState(MVKVulkanAPIDeviceObject* owner) {
-	return newMTLComputePipelineState(getFunctionNamed("cmdFillBuffer"), owner);
+	return newMTLComputePipelineState("cmdFillBuffer", owner);
 }
 
 id<MTLComputePipelineState> MVKCommandResourceFactory::newCmdCopyBufferToImage3DDecompressMTLComputePipelineState(bool needTempBuf,
 																												  MVKVulkanAPIDeviceObject* owner) {
-	return newMTLComputePipelineState(getFunctionNamed(needTempBuf
-													   ? "cmdCopyBufferToImage3DDecompressTempBufferDXTn"
-													   : "cmdCopyBufferToImage3DDecompressDXTn"), owner);
+	return newMTLComputePipelineState(needTempBuf
+									  ? "cmdCopyBufferToImage3DDecompressTempBufferDXTn"
+									  : "cmdCopyBufferToImage3DDecompressDXTn", owner);
 }
 
 id<MTLComputePipelineState> MVKCommandResourceFactory::newCmdDrawIndirectConvertBuffersMTLComputePipelineState(bool indexed,
 																											   MVKVulkanAPIDeviceObject* owner) {
-	return newMTLComputePipelineState(getFunctionNamed(indexed
-													   ? "cmdDrawIndexedIndirectConvertBuffers"
-													   : "cmdDrawIndirectConvertBuffers"), owner);
+	return newMTLComputePipelineState(indexed
+									  ? "cmdDrawIndexedIndirectConvertBuffers"
+									  : "cmdDrawIndirectConvertBuffers", owner);
 }
 
 id<MTLComputePipelineState> MVKCommandResourceFactory::newCmdDrawIndexedCopyIndexBufferMTLComputePipelineState(MTLIndexType type,
 																											   MVKVulkanAPIDeviceObject* owner) {
-	return newMTLComputePipelineState(getFunctionNamed(type == MTLIndexTypeUInt16
-													   ? "cmdDrawIndexedCopyIndex16Buffer"
-													   : "cmdDrawIndexedCopyIndex32Buffer"), owner);
+	return newMTLComputePipelineState(type == MTLIndexTypeUInt16
+									  ? "cmdDrawIndexedCopyIndex16Buffer"
+									  : "cmdDrawIndexedCopyIndex32Buffer", owner);
 }
 
 id<MTLComputePipelineState> MVKCommandResourceFactory::newCmdCopyQueryPoolResultsMTLComputePipelineState(MVKVulkanAPIDeviceObject* owner) {
-	return newMTLComputePipelineState(getFunctionNamed("cmdCopyQueryPoolResultsToBuffer"), owner);
+	return newMTLComputePipelineState("cmdCopyQueryPoolResultsToBuffer", owner);
 }
 
 
 #pragma mark Support methods
 
-id<MTLFunction> MVKCommandResourceFactory::getFunctionNamed(const char* funcName) {
-    uint64_t startTime = _device->getPerformanceTimestamp();
-    id<MTLFunction> mtlFunc = [[_mtlLibrary newFunctionWithName: @(funcName)] autorelease];
-    _device->addActivityPerformance(_device->_performanceStatistics.shaderCompilation.functionRetrieval, startTime);
-    return mtlFunc;
+// Returns the retained MTLFunction with the name.
+// The caller is responsible for releasing the returned function object.
+id<MTLFunction> MVKCommandResourceFactory::newFunctionNamed(const char* funcName) {
+	uint64_t startTime = _device->getPerformanceTimestamp();
+	NSString* nsFuncName = [[NSString alloc] initWithUTF8String: funcName];		// temp retained
+	id<MTLFunction> mtlFunc = [_mtlLibrary newFunctionWithName: nsFuncName];	// retained
+	[nsFuncName release];														// temp release
+	_device->addActivityPerformance(_device->_performanceStatistics.shaderCompilation.functionRetrieval, startTime);
+	return mtlFunc;
 }
 
 id<MTLFunction> MVKCommandResourceFactory::newMTLFunction(NSString* mslSrcCode, NSString* funcName) {
 	@autoreleasepool {
+		id<MTLFunction> mtlFunc = nil;
 		NSError* err = nil;
+
 		uint64_t startTime = _device->getPerformanceTimestamp();
-		id<MTLLibrary> mtlLib = [[getMTLDevice() newLibraryWithSource: mslSrcCode
-															  options: getDevice()->getMTLCompileOptions()
-																error: &err] autorelease];
+		id<MTLLibrary> mtlLib = [getMTLDevice() newLibraryWithSource: mslSrcCode
+															 options: getDevice()->getMTLCompileOptions()
+															   error: &err];	// temp retain
 		_device->addActivityPerformance(_device->_performanceStatistics.shaderCompilation.mslCompile, startTime);
+
 		if (err) {
 			reportError(VK_ERROR_INITIALIZATION_FAILED,
 						"Could not compile support shader from MSL source (Error code %li):\n%s\n%s",
 						(long)err.code, mslSrcCode.UTF8String, err.localizedDescription.UTF8String);
-			return nil;
+		} else {
+			startTime = _device->getPerformanceTimestamp();
+			mtlFunc = [mtlLib newFunctionWithName: funcName];
+			_device->addActivityPerformance(_device->_performanceStatistics.shaderCompilation.functionRetrieval, startTime);
 		}
 
-		startTime = _device->getPerformanceTimestamp();
-		id<MTLFunction> mtlFunc = [mtlLib newFunctionWithName: funcName];
-		_device->addActivityPerformance(_device->_performanceStatistics.shaderCompilation.functionRetrieval, startTime);
+		[mtlLib release];														// temp release
+
 		return mtlFunc;
 	}
 }
@@ -446,11 +474,13 @@
     return rps;
 }
 
-id<MTLComputePipelineState> MVKCommandResourceFactory::newMTLComputePipelineState(id<MTLFunction> mtlFunction,
+id<MTLComputePipelineState> MVKCommandResourceFactory::newMTLComputePipelineState(const char* funcName,
 																				  MVKVulkanAPIDeviceObject* owner) {
+	id<MTLFunction> mtlFunc = newFunctionNamed(funcName);							// temp retain
 	MVKComputePipelineCompiler* plc = new MVKComputePipelineCompiler(owner);
-	id<MTLComputePipelineState> cps = plc->newMTLComputePipelineState(mtlFunction);		// retained
+	id<MTLComputePipelineState> cps = plc->newMTLComputePipelineState(mtlFunc);		// retained
 	plc->destroy();
+	[mtlFunc release];																// temp release
     return cps;
 }
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
index 18da46f..ee23a31 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
@@ -45,6 +45,12 @@
 	pMemoryRequirements->size = getByteCount();
 	pMemoryRequirements->alignment = _byteAlignment;
 	pMemoryRequirements->memoryTypeBits = _device->getPhysicalDevice()->getAllMemoryTypes();
+#if MVK_MACOS
+	// Textures must not use shared memory
+	if (mvkIsAnyFlagEnabled(_usage, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) {
+		mvkDisableFlag(pMemoryRequirements->memoryTypeBits, _device->getPhysicalDevice()->getHostCoherentMemoryTypes());
+	}
+#endif
 #if MVK_IOS
 	// Memoryless storage is not allowed for buffers
 	mvkDisableFlag(pMemoryRequirements->memoryTypeBits, _device->getPhysicalDevice()->getLazilyAllocatedMemoryTypes());
@@ -156,24 +162,25 @@
 		lock_guard<mutex> lock(_lock);
 		if (_mtlTexture) { return _mtlTexture; }
 
-        MTLTextureDescriptor* mtlTexDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: _mtlPixelFormat
-                                                                                              width: _textureSize.width
-                                                                                             height: _textureSize.height
-                                                                                          mipmapped: NO];
-#if MVK_MACOS
-        // Textures on Mac cannot use shared storage, so force managed.
-        if (_buffer->getMTLBuffer().storageMode == MTLStorageModeShared) {
-            mtlTexDesc.storageMode = MTLStorageModeManaged;
-        } else {
-            mtlTexDesc.storageMode = _buffer->getMTLBuffer().storageMode;
-        }
-#else
-        mtlTexDesc.storageMode = _buffer->getMTLBuffer().storageMode;
-#endif
-        mtlTexDesc.cpuCacheMode = _buffer->getMTLBuffer().cpuCacheMode;
-        mtlTexDesc.usage = MTLTextureUsageShaderRead;
+        MTLTextureUsage usage = MTLTextureUsageShaderRead;
         if ( mvkIsAnyFlagEnabled(_buffer->getUsage(), VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) ) {
-            mtlTexDesc.usage |= MTLTextureUsageShaderWrite;
+            usage |= MTLTextureUsageShaderWrite;
+        }
+        id<MTLBuffer> mtlBuff = _buffer->getMTLBuffer();
+        MTLTextureDescriptor* mtlTexDesc;
+        if ( _device->_pMetalFeatures->textureBuffers ) {
+            mtlTexDesc = [MTLTextureDescriptor textureBufferDescriptorWithPixelFormat: _mtlPixelFormat
+                                                                                width: _textureSize.width
+                                                                      resourceOptions: (mtlBuff.cpuCacheMode << MTLResourceCPUCacheModeShift) | (mtlBuff.storageMode << MTLResourceStorageModeShift)
+                                                                                usage: usage];
+        } else {
+            mtlTexDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: _mtlPixelFormat
+                                                                            width: _textureSize.width
+                                                                           height: _textureSize.height
+                                                                        mipmapped: NO];
+            mtlTexDesc.storageMode = mtlBuff.storageMode;
+            mtlTexDesc.cpuCacheMode = mtlBuff.cpuCacheMode;
+            mtlTexDesc.usage = usage;
         }
 		_mtlTexture = [_buffer->getMTLBuffer() newTextureWithDescriptor: mtlTexDesc
 																 offset: _mtlBufferOffset
@@ -199,17 +206,25 @@
     if (byteCount == VK_WHOLE_SIZE) { byteCount = _buffer->getByteCount() - pCreateInfo->offset; }    // Remaining bytes in buffer
     size_t blockCount = byteCount / bytesPerBlock;
 
-	// But Metal requires the texture to be a 2D texture. Determine the number of 2D rows we need and their width.
-	// Multiple rows will automatically align with PoT max texture dimension, but need to align upwards if less than full single row.
-	size_t maxBlocksPerRow = _device->_pMetalFeatures->maxTextureDimension / fmtBlockSize.width;
-	size_t blocksPerRow = min(blockCount, maxBlocksPerRow);
-	_mtlBytesPerRow = mvkAlignByteOffset(blocksPerRow * bytesPerBlock, _device->getVkFormatTexelBufferAlignment(pCreateInfo->format, this));
+	if ( !_device->_pMetalFeatures->textureBuffers ) {
+		// But Metal requires the texture to be a 2D texture. Determine the number of 2D rows we need and their width.
+		// Multiple rows will automatically align with PoT max texture dimension, but need to align upwards if less than full single row.
+		size_t maxBlocksPerRow = _device->_pMetalFeatures->maxTextureDimension / fmtBlockSize.width;
+		size_t blocksPerRow = min(blockCount, maxBlocksPerRow);
+		_mtlBytesPerRow = mvkAlignByteOffset(blocksPerRow * bytesPerBlock, _device->getVkFormatTexelBufferAlignment(pCreateInfo->format, this));
 
-	size_t rowCount = blockCount / blocksPerRow;
-	if (blockCount % blocksPerRow) { rowCount++; }
+		size_t rowCount = blockCount / blocksPerRow;
+		if (blockCount % blocksPerRow) { rowCount++; }
 
-	_textureSize.width = uint32_t(blocksPerRow * fmtBlockSize.width);
-	_textureSize.height = uint32_t(rowCount * fmtBlockSize.height);
+		_textureSize.width = uint32_t(blocksPerRow * fmtBlockSize.width);
+		_textureSize.height = uint32_t(rowCount * fmtBlockSize.height);
+	} else {
+		// With native texture buffers we don't need to bother with any of that.
+		// We can just use a simple 1D texel array.
+		_textureSize.width = uint32_t(blockCount * fmtBlockSize.width);
+		_textureSize.height = 1;
+		_mtlBytesPerRow = byteCount;
+	}
 
     if ( !_device->_pMetalFeatures->texelBuffers ) {
         setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "Texel buffers are not supported on this device."));
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h
index 755199e..6bd5ae8 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h
@@ -93,7 +93,7 @@
               MVKShaderResourceBinding& dslMTLRezIdxOffsets);
 
 	/** Populates the specified shader converter context, at the specified descriptor set binding. */
-	void populateShaderConverterContext(mvk::SPIRVToMSLConverterContext& context,
+	void populateShaderConverterContext(mvk::SPIRVToMSLConversionConfiguration& context,
                                         MVKShaderResourceBinding& dslMTLRezIdxOffsets,
                                         uint32_t dslIndex);
 
@@ -160,27 +160,32 @@
 
 
 	/** Populates the specified shader converter context, at the specified DSL index. */
-	void populateShaderConverterContext(mvk::SPIRVToMSLConverterContext& context,
+	void populateShaderConverterContext(mvk::SPIRVToMSLConversionConfiguration& context,
                                         MVKShaderResourceBinding& dslMTLRezIdxOffsets,
                                         uint32_t dslIndex);
 
 	/** Returns true if this layout is for push descriptors only. */
 	bool isPushDescriptorLayout() const { return _isPushDescriptorLayout; }
 
-	/** Constructs an instance for the specified device. */
 	MVKDescriptorSetLayout(MVKDevice* device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo);
 
+	~MVKDescriptorSetLayout();
+
 protected:
 
 	friend class MVKDescriptorSetLayoutBinding;
 	friend class MVKPipelineLayout;
 	friend class MVKDescriptorSet;
+	friend class MVKDescriptorPool;
 
 	void propogateDebugName() override {}
-	
+	void addDescriptorPool(MVKDescriptorPool* mvkDescPool) { _descriptorPools.insert(mvkDescPool); }
+	void removeDescriptorPool(MVKDescriptorPool* mvkDescPool) { _descriptorPools.erase(mvkDescPool); }
+
 	MVKVectorInline<MVKDescriptorSetLayoutBinding, 8> _bindings;
 	std::unordered_map<uint32_t, uint32_t> _bindingToIndex;
 	MVKShaderResourceBinding _mtlResourceCounts;
+	std::unordered_set<MVKDescriptorPool*> _descriptorPools;
 	bool _isPushDescriptorLayout : 1;
 };
 
@@ -357,6 +362,9 @@
 	/** Destoys all currently allocated descriptor sets. */
 	VkResult reset(VkDescriptorPoolResetFlags flags);
 
+	/** Removes the pool associated with a descriptor set layout. */
+	void removeDescriptorSetPool(MVKDescriptorSetLayout* mvkDescSetLayout);
+
 	/** Constructs an instance for the specified device. */
 	MVKDescriptorPool(MVKDevice* device, const VkDescriptorPoolCreateInfo* pCreateInfo);
 
@@ -366,6 +374,7 @@
 protected:
 	void propogateDebugName() override {}
 	MVKDescriptorSetPool* getDescriptorSetPool(MVKDescriptorSetLayout* mvkDescSetLayout);
+	void returnDescriptorSet(MVKDescriptorSet* mvkDescSet);
 
 	uint32_t _maxSets;
 	std::unordered_set<MVKDescriptorSet*> _allocatedSets;
@@ -427,7 +436,7 @@
  * If the shader stage binding has a binding defined for the specified stage, populates
  * the context at the descriptor set binding from the shader stage resource binding.
  */
-void mvkPopulateShaderConverterContext(mvk::SPIRVToMSLConverterContext& context,
+void mvkPopulateShaderConverterContext(mvk::SPIRVToMSLConversionConfiguration& context,
 									   MVKShaderStageResourceBinding& ssRB,
 									   spv::ExecutionModel stage,
 									   uint32_t descriptorSetIndex,
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
index 93ab0ae..1f97ac0 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
@@ -375,7 +375,7 @@
 	return true;
 }
 
-void MVKDescriptorSetLayoutBinding::populateShaderConverterContext(SPIRVToMSLConverterContext& context,
+void MVKDescriptorSetLayoutBinding::populateShaderConverterContext(SPIRVToMSLConversionConfiguration& context,
                                                                    MVKShaderResourceBinding& dslMTLRezIdxOffsets,
                                                                    uint32_t dslIndex) {
 
@@ -409,7 +409,7 @@
 
 	for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) {
         // Determine if this binding is used by this shader stage
-        _applyToStage[i] = mvkAreFlagsEnabled(pBinding->stageFlags, mvkVkShaderStageFlagBitsFromMVKShaderStage(MVKShaderStage(i)));
+        _applyToStage[i] = mvkAreAllFlagsEnabled(pBinding->stageFlags, mvkVkShaderStageFlagBitsFromMVKShaderStage(MVKShaderStage(i)));
 	    // If this binding is used by the shader, set the Metal resource index
         if (_applyToStage[i]) {
             initMetalResourceIndexOffsets(&_mtlResourceIndexOffsets.stages[i],
@@ -632,7 +632,7 @@
     }
 }
 
-void MVKDescriptorSetLayout::populateShaderConverterContext(SPIRVToMSLConverterContext& context,
+void MVKDescriptorSetLayout::populateShaderConverterContext(SPIRVToMSLConversionConfiguration& context,
                                                             MVKShaderResourceBinding& dslMTLRezIdxOffsets,
 															uint32_t dslIndex) {
 	uint32_t bindCnt = (uint32_t)_bindings.size();
@@ -652,6 +652,10 @@
     }
 }
 
+MVKDescriptorSetLayout::~MVKDescriptorSetLayout() {
+	for (auto& dsPool : _descriptorPools) { dsPool->removeDescriptorSetPool(this); }
+}
+
 
 #pragma mark -
 #pragma mark MVKDescriptorBinding
@@ -1021,41 +1025,66 @@
 VkResult MVKDescriptorPool::freeDescriptorSets(uint32_t count, const VkDescriptorSet* pDescriptorSets) {
 	for (uint32_t dsIdx = 0; dsIdx < count; dsIdx++) {
 		MVKDescriptorSet* mvkDS = (MVKDescriptorSet*)pDescriptorSets[dsIdx];
-		if (_allocatedSets.erase(mvkDS)) {
-			getDescriptorSetPool(mvkDS->_pLayout)->returnObject(mvkDS);
-		}
+		if (_allocatedSets.erase(mvkDS)) { returnDescriptorSet(mvkDS); }
 	}
 	return VK_SUCCESS;
 }
 
 // Return any allocated descriptor sets to their pools
 VkResult MVKDescriptorPool::reset(VkDescriptorPoolResetFlags flags) {
-	for (auto& mvkDS : _allocatedSets) {
-		getDescriptorSetPool(mvkDS->_pLayout)->returnObject(mvkDS);
-	}
+	for (auto& mvkDS : _allocatedSets) { returnDescriptorSet(mvkDS); }
 	_allocatedSets.clear();
 	return VK_SUCCESS;
 }
 
+// Returns the descriptor set to its pool, or if that pool doesn't exist, the descriptor set is destroyed
+void MVKDescriptorPool::returnDescriptorSet(MVKDescriptorSet* mvkDescSet) {
+	MVKDescriptorSetLayout* dsLayout = mvkDescSet->_pLayout;
+	MVKDescriptorSetPool* dsPool = dsLayout ? _descriptorSetPools[dsLayout] : nullptr;
+	if (dsPool) {
+		dsPool->returnObject(mvkDescSet);
+	} else {
+		mvkDescSet->destroy();
+		_descriptorSetPools.erase(dsLayout);
+	}
+}
+
 // Returns the pool of descriptor sets that use a specific layout, lazily creating it if necessary
 MVKDescriptorSetPool* MVKDescriptorPool::getDescriptorSetPool(MVKDescriptorSetLayout* mvkDescSetLayout) {
 	MVKDescriptorSetPool* dsp = _descriptorSetPools[mvkDescSetLayout];
 	if ( !dsp ) {
 		dsp = new MVKDescriptorSetPool(_device);
 		_descriptorSetPools[mvkDescSetLayout] = dsp;
+		mvkDescSetLayout->addDescriptorPool(this);		// tell layout to track me
 	}
 	return dsp;
 }
 
+// Remove the descriptor set pool associated with the descriptor set layout,
+// and make sure any allocated sets don't try to return back to their pools.
+void MVKDescriptorPool::removeDescriptorSetPool(MVKDescriptorSetLayout* mvkDescSetLayout) {
+	MVKDescriptorSetPool* dsp = _descriptorSetPools[mvkDescSetLayout];
+	if (dsp) { dsp->destroy(); }
+	_descriptorSetPools.erase(mvkDescSetLayout);
+
+	for (auto& mvkDS : _allocatedSets) {
+		if (mvkDS->_pLayout == mvkDescSetLayout) { mvkDS->_pLayout = nullptr; }
+	}
+}
+
 MVKDescriptorPool::MVKDescriptorPool(MVKDevice* device,
 									 const VkDescriptorPoolCreateInfo* pCreateInfo) : MVKVulkanAPIDeviceObject(device) {
 	_maxSets = pCreateInfo->maxSets;
 }
 
-// Return any allocated sets to their pools and then destroy all the pools.
+// Return any allocated sets to their pools and then destroy all the pools,
+// and ensure any descriptor set layouts used as keys are notified.
 MVKDescriptorPool::~MVKDescriptorPool() {
 	reset(0);
-	for (auto& pair : _descriptorSetPools) { pair.second->destroy(); }
+	for (auto& pair : _descriptorSetPools) {
+		pair.first->removeDescriptorPool(this);
+		if (pair.second) { pair.second->destroy(); }
+	}
 }
 
 
@@ -1142,7 +1171,7 @@
 	}
 }
 
-void mvkPopulateShaderConverterContext(SPIRVToMSLConverterContext& context,
+void mvkPopulateShaderConverterContext(SPIRVToMSLConversionConfiguration& context,
 									   MVKShaderStageResourceBinding& ssRB,
 									   spv::ExecutionModel stage,
 									   uint32_t descriptorSetIndex,
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
index 92764a2..3a92cac 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
@@ -88,6 +88,9 @@
 	/** Returns a pointer to the Vulkan instance. */
 	MVKInstance* getInstance() override { return _mvkInstance; }
 
+	/** Populates the specified array with the supported extensions of this device. */
+	VkResult getExtensionProperties(const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
+
 	/** Populates the specified structure with the features of this device. */
 	void getFeatures(VkPhysicalDeviceFeatures* features);
 
@@ -285,13 +288,18 @@
 	bool getSupportsGPUFamily(MTLGPUFamily gpuFamily);
 
 	/** Populates the specified structure with the Metal-specific features of this device. */
-	const MVKPhysicalDeviceMetalFeatures* getMetalFeatures() { return &_metalFeatures; }
+	inline const MVKPhysicalDeviceMetalFeatures* getMetalFeatures() { return &_metalFeatures; }
 
 	/** Returns the underlying Metal device. */
 	inline id<MTLDevice> getMTLDevice() { return _mtlDevice; }
     
     /*** Replaces the underlying Metal device .*/
-    inline void replaceMTLDevice(id<MTLDevice> mtlDevice) { [_mtlDevice autorelease]; _mtlDevice = [mtlDevice retain]; }
+    inline void replaceMTLDevice(id<MTLDevice> mtlDevice) {
+		if (mtlDevice != _mtlDevice) {
+			[_mtlDevice release];
+			_mtlDevice = [mtlDevice retain];
+		}
+	}
 
 #pragma mark Construction
 
@@ -326,6 +334,8 @@
 	void initGPUInfoProperties();
 	void initMemoryProperties();
 	uint64_t getRecommendedMaxWorkingSetSize();
+	void initExtensions();
+	MVKExtensionList* getSupportedExtensions(const char* pLayerName = nullptr);
 	std::vector<MVKQueueFamily*>& getQueueFamilies();
 	void initPipelineCacheUUID();
 	uint32_t getHighestMTLFeatureSet();
@@ -335,9 +345,11 @@
 
 	id<MTLDevice> _mtlDevice;
 	MVKInstance* _mvkInstance;
+	MVKExtensionList _supportedExtensions;
 	VkPhysicalDeviceFeatures _features;
 	MVKPhysicalDeviceMetalFeatures _metalFeatures;
 	VkPhysicalDeviceProperties _properties;
+	VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT _texelBuffAlignProperties;
 	VkPhysicalDeviceMemoryProperties _memoryProperties;
 	std::vector<MVKQueueFamily*> _queueFamilies;
 	uint32_t _allMemoryTypes;
@@ -538,10 +550,10 @@
      *
      * If endTime is zero or not supplied, the current time is used.
      */
-    inline void addActivityPerformance(MVKPerformanceTracker& shaderCompilationEvent,
+    inline void addActivityPerformance(MVKPerformanceTracker& activityTracker,
 									   uint64_t startTime, uint64_t endTime = 0) {
 		if (_pMVKConfig->performanceTracking) {
-			addActivityPerformanceImpl(shaderCompilationEvent, startTime, endTime);
+			addActivityPerformanceImpl(activityTracker, startTime, endTime);
 		}
 	};
 
@@ -555,7 +567,7 @@
 	inline id<MTLDevice> getMTLDevice() { return _physicalDevice->getMTLDevice(); }
 
 	/** Returns standard compilation options to be used when compiling MSL shaders. */
-	MTLCompileOptions* getMTLCompileOptions();
+	inline MTLCompileOptions* getMTLCompileOptions() { return _mtlCompileOptions; }
 
 	/** Returns the Metal vertex buffer index to use for the specified vertex attribute binding number.  */
 	uint32_t getMetalBufferIndexForVertexAttributeBinding(uint32_t binding);
@@ -609,8 +621,11 @@
 	const VkPhysicalDevice16BitStorageFeatures _enabledStorage16Features;
 	const VkPhysicalDevice8BitStorageFeaturesKHR _enabledStorage8Features;
 	const VkPhysicalDeviceFloat16Int8FeaturesKHR _enabledF16I8Features;
+	const VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR _enabledUBOLayoutFeatures;
 	const VkPhysicalDeviceVariablePointerFeatures _enabledVarPtrFeatures;
 	const VkPhysicalDeviceHostQueryResetFeaturesEXT _enabledHostQryResetFeatures;
+	const VkPhysicalDeviceScalarBlockLayoutFeaturesEXT _enabledScalarLayoutFeatures;
+	const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT _enabledTexelBuffAlignFeatures;
 	const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT _enabledVtxAttrDivFeatures;
 	const VkPhysicalDevicePortabilitySubsetFeaturesEXTX _enabledPortabilityFeatures;
 
@@ -656,18 +671,20 @@
 	MVKResource* addResource(MVKResource* rez);
 	MVKResource* removeResource(MVKResource* rez);
     void initPerformanceTracking();
-	void initPhysicalDevice(MVKPhysicalDevice* physicalDevice);
+	void initPhysicalDevice(MVKPhysicalDevice* physicalDevice, const VkDeviceCreateInfo* pCreateInfo);
 	void initQueues(const VkDeviceCreateInfo* pCreateInfo);
+	void initMTLCompileOptions();
 	void enableFeatures(const VkDeviceCreateInfo* pCreateInfo);
 	void enableFeatures(const VkBool32* pEnable, const VkBool32* pRequested, const VkBool32* pAvailable, uint32_t count);
 	void enableExtensions(const VkDeviceCreateInfo* pCreateInfo);
-    const char* getActivityPerformanceDescription(MVKPerformanceTracker& shaderCompilationEvent);
+    const char* getActivityPerformanceDescription(MVKPerformanceTracker& activityTracker);
 	uint64_t getPerformanceTimestampImpl();
-	void addActivityPerformanceImpl(MVKPerformanceTracker& shaderCompilationEvent,
+	void addActivityPerformanceImpl(MVKPerformanceTracker& activityTracker,
 									uint64_t startTime, uint64_t endTime);
 
 	MVKPhysicalDevice* _physicalDevice;
     MVKCommandResourceFactory* _commandResourceFactory;
+	MTLCompileOptions* _mtlCompileOptions;
 	std::vector<std::vector<MVKQueue*>> _queuesByQueueFamilyIndex;
 	std::vector<MVKResource*> _resources;
 	std::mutex _rezLock;
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index e136c1f..5dd967e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -56,6 +56,11 @@
 #pragma mark -
 #pragma mark MVKPhysicalDevice
 
+VkResult MVKPhysicalDevice::getExtensionProperties(const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
+	MVKExtensionList* extensions = getSupportedExtensions(pLayerName);
+	return extensions->getProperties(pCount, pProperties);
+}
+
 void MVKPhysicalDevice::getFeatures(VkPhysicalDeviceFeatures* features) {
     if (features) { *features = _features; }
 }
@@ -64,8 +69,7 @@
     if (features) {
         features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
         features->features = _features;
-        auto* next = (VkBaseOutStructure*)features->pNext;
-        while (next) {
+        for (auto* next = (VkBaseOutStructure*)features->pNext; next; next = next->pNext) {
             switch ((uint32_t)next->sType) {
                 case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
                     auto* storageFeatures = (VkPhysicalDevice16BitStorageFeatures*)next;
@@ -88,6 +92,11 @@
                     f16Features->shaderInt8 = true;
                     break;
                 }
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR: {
+                    auto* uboLayoutFeatures = (VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR*)next;
+                    uboLayoutFeatures->uniformBufferStandardLayout = true;
+                    break;
+                }
                 case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES: {
                     auto* varPtrFeatures = (VkPhysicalDeviceVariablePointerFeatures*)next;
                     varPtrFeatures->variablePointersStorageBuffer = true;
@@ -99,6 +108,16 @@
                     hostQueryResetFeatures->hostQueryReset = true;
                     break;
                 }
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: {
+                    auto* scalarLayoutFeatures = (VkPhysicalDeviceScalarBlockLayoutFeaturesEXT*)next;
+                    scalarLayoutFeatures->scalarBlockLayout = true;
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+                    auto* texelBuffAlignFeatures = (VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*)next;
+                    texelBuffAlignFeatures->texelBufferAlignment = _metalFeatures.texelBuffers && [_mtlDevice respondsToSelector: @selector(minimumLinearTextureAlignmentForPixelFormat:)];
+                    break;
+                }
                 case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
                     auto* divisorFeatures = (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*)next;
                     divisorFeatures->vertexAttributeInstanceRateDivisor = true;
@@ -114,10 +133,14 @@
                     portabilityFeatures->samplerMipLodBias = false;
                     break;
                 }
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS2_FEATURES_INTEL: {
+                    auto* shaderIntFuncsFeatures = (VkPhysicalDeviceShaderIntegerFunctions2INTEL*)next;
+                    shaderIntFuncsFeatures->shaderIntegerFunctions2 = true;
+                    break;
+                }
                 default:
                     break;
             }
-            next = next->pNext;
         }
     }
 }
@@ -130,42 +153,44 @@
     if (properties) {
         properties->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
         properties->properties = _properties;
-		auto* next = (MVKVkAPIStructHeader*)properties->pNext;
-		while (next) {
+		for (auto* next = (VkBaseOutStructure*)properties->pNext; next; next = next->pNext) {
 			switch ((uint32_t)next->sType) {
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
                 auto* pointClipProps = (VkPhysicalDevicePointClippingProperties*)next;
                 pointClipProps->pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES;
-                next = (MVKVkAPIStructHeader*)pointClipProps->pNext;
                 break;
             }
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
                 auto* maint3Props = (VkPhysicalDeviceMaintenance3Properties*)next;
-                maint3Props->maxPerSetDescriptors = (_metalFeatures.maxPerStageBufferCount + _metalFeatures.maxPerStageTextureCount + _metalFeatures.maxPerStageSamplerCount) * 2;
+                maint3Props->maxPerSetDescriptors = (_metalFeatures.maxPerStageBufferCount + _metalFeatures.maxPerStageTextureCount + _metalFeatures.maxPerStageSamplerCount) * 4;
                 maint3Props->maxMemoryAllocationSize = _metalFeatures.maxMTLBufferSize;
-                next = (MVKVkAPIStructHeader*)maint3Props->pNext;
                 break;
             }
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
                 auto* pushDescProps = (VkPhysicalDevicePushDescriptorPropertiesKHR*)next;
                 pushDescProps->maxPushDescriptors = _properties.limits.maxPerStageResources;
-                next = (MVKVkAPIStructHeader*)pushDescProps->pNext;
+                break;
+            }
+            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+                auto* texelBuffAlignProps = (VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*)next;
+                // Save the 'next' pointer; we'll unintentionally overwrite it
+                // on the next line. Put it back when we're done.
+                void* savedNext = texelBuffAlignProps->pNext;
+                *texelBuffAlignProps = _texelBuffAlignProperties;
+                texelBuffAlignProps->pNext = savedNext;
                 break;
             }
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
                 auto* divisorProps = (VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*)next;
                 divisorProps->maxVertexAttribDivisor = kMVKUndefinedLargeUInt32;
-                next = (MVKVkAPIStructHeader*)divisorProps->pNext;
                 break;
             }
 			case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_EXTX: {
 				auto* portabilityProps = (VkPhysicalDevicePortabilitySubsetPropertiesEXTX*)next;
 				portabilityProps->minVertexInputBindingStrideAlignment = 4;
-				next = (MVKVkAPIStructHeader*)portabilityProps->pNext;
 				break;
 			}
             default:
-                next = (MVKVkAPIStructHeader*)next->pNext;
                 break;
             }
         }
@@ -221,6 +246,7 @@
 		return VK_ERROR_FORMAT_NOT_SUPPORTED;
 	}
 
+	MVKFormatType mvkFmt = mvkFormatTypeFromVkFormat(format);
 	bool hasAttachmentUsage = mvkIsAnyFlagEnabled(usage, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
 														  VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
 														  VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT |
@@ -241,8 +267,7 @@
 			if (tiling == VK_IMAGE_TILING_LINEAR) { return VK_ERROR_FORMAT_NOT_SUPPORTED; }
 
 			// Metal does not allow compressed or depth/stencil formats on 1D textures
-			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatDepthStencil ||
-				mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed) {
+			if (mvkFmt == kMVKFormatDepthStencil || mvkFmt == kMVKFormatCompressed) {
 				return VK_ERROR_FORMAT_NOT_SUPPORTED;
 			}
             maxExt.width = pLimits->maxImageDimension1D;
@@ -263,8 +288,7 @@
 			if (tiling == VK_IMAGE_TILING_LINEAR) {
 				// Linear textures have additional restrictions under Metal:
 				// - They may not be depth/stencil or compressed textures.
-				if (mvkFormatTypeFromVkFormat(format) == kMVKFormatDepthStencil ||
-					mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed) {
+				if (mvkFmt == kMVKFormatDepthStencil || mvkFmt == kMVKFormatCompressed) {
 					return VK_ERROR_FORMAT_NOT_SUPPORTED;
 				}
 #if MVK_MACOS
@@ -281,7 +305,7 @@
 				// Compressed multisampled textures aren't supported.
 				// Multisampled cube textures aren't supported.
 				// Non-renderable multisampled textures aren't supported.
-				if (mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed ||
+				if (mvkFmt == kMVKFormatCompressed ||
 					mvkIsAnyFlagEnabled(flags, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) ||
 					!mvkIsAnyFlagEnabled(fmtProps.optimalTilingFeatures, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ) {
 					sampleCounts = VK_SAMPLE_COUNT_1_BIT;
@@ -295,18 +319,17 @@
                 return VK_ERROR_FORMAT_NOT_SUPPORTED;
             }
 			// Metal does not allow compressed or depth/stencil formats on 3D textures
-			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatDepthStencil
+			if (mvkFmt == kMVKFormatDepthStencil
 #if MVK_IOS
-				|| mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed
+				|| mvkFmt == kMVKFormatCompressed
 #endif
 				) {
 				return VK_ERROR_FORMAT_NOT_SUPPORTED;
 			}
 #if MVK_MACOS
-			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed) {
-				// If this is a compressed format and there's no codec, it isn't
-				// supported.
-				if (!mvkCanDecodeFormat(format) ) { return VK_ERROR_FORMAT_NOT_SUPPORTED; }
+			// If this is a compressed format and there's no codec, it isn't supported.
+			if ((mvkFmt == kMVKFormatCompressed) && !mvkCanDecodeFormat(format)) {
+				return VK_ERROR_FORMAT_NOT_SUPPORTED;
 			}
 #endif
             maxExt.width = pLimits->maxImageDimension3D;
@@ -321,8 +344,7 @@
 			if (tiling == VK_IMAGE_TILING_LINEAR) { return VK_ERROR_FORMAT_NOT_SUPPORTED; }
 
 			// Metal does not allow compressed or depth/stencil formats on anything but 2D textures
-			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatDepthStencil ||
-				mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed) {
+			if (mvkFmt == kMVKFormatDepthStencil || mvkFmt == kMVKFormatCompressed) {
 				return VK_ERROR_FORMAT_NOT_SUPPORTED;
 			}
             maxExt = { 1, 1, 1};
@@ -457,24 +479,47 @@
 		MTLPixelFormatBGRA8Unorm,
 		MTLPixelFormatBGRA8Unorm_sRGB,
 		MTLPixelFormatRGBA16Float,
+		MTLPixelFormatBGR10A2Unorm,
 	};
 
-	const uint mtlFmtsCnt = sizeof(mtlFormats) / sizeof(MTLPixelFormat);
+	MVKVectorInline<VkColorSpaceKHR, 16> colorSpaces;
+	colorSpaces.push_back(VK_COLOR_SPACE_SRGB_NONLINEAR_KHR);
+#if MVK_MACOS
+	if (getInstance()->_enabledExtensions.vk_EXT_swapchain_colorspace.enabled) {
+		// 10.11 supports some but not all of the color spaces specified by VK_EXT_swapchain_colorspace.
+		colorSpaces.push_back(VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT);
+		colorSpaces.push_back(VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT);
+		colorSpaces.push_back(VK_COLOR_SPACE_BT709_NONLINEAR_EXT);
+		colorSpaces.push_back(VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT);
+		colorSpaces.push_back(VK_COLOR_SPACE_PASS_THROUGH_EXT);
+		if (mvkOSVersion() >= 10.12) {
+			colorSpaces.push_back(VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT);
+			colorSpaces.push_back(VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT);
+		}
+	}
+#endif
+
+	uint mtlFmtsCnt = sizeof(mtlFormats) / sizeof(MTLPixelFormat);
+	if (!mvkMTLPixelFormatIsSupported(MTLPixelFormatBGR10A2Unorm)) { mtlFmtsCnt--; }
+
+	const uint vkFmtsCnt = mtlFmtsCnt * (uint)colorSpaces.size();
 
 	// If properties aren't actually being requested yet, simply update the returned count
 	if ( !pSurfaceFormats ) {
-		*pCount = mtlFmtsCnt;
+		*pCount = vkFmtsCnt;
 		return VK_SUCCESS;
 	}
 
 	// Determine how many results we'll return, and return that number
-	VkResult result = (*pCount >= mtlFmtsCnt) ? VK_SUCCESS : VK_INCOMPLETE;
-	*pCount = min(*pCount, mtlFmtsCnt);
+	VkResult result = (*pCount >= vkFmtsCnt) ? VK_SUCCESS : VK_INCOMPLETE;
+	*pCount = min(*pCount, vkFmtsCnt);
 
 	// Now populate the supplied array
-	for (uint fmtIdx = 0; fmtIdx < *pCount; fmtIdx++) {
-		pSurfaceFormats[fmtIdx].format = mvkVkFormatFromMTLPixelFormat(mtlFormats[fmtIdx]);
-		pSurfaceFormats[fmtIdx].colorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
+	for (uint csIdx = 0, idx = 0; idx < *pCount && csIdx < colorSpaces.size(); csIdx++) {
+		for (uint fmtIdx = 0; idx < *pCount && fmtIdx < mtlFmtsCnt; fmtIdx++, idx++) {
+			pSurfaceFormats[idx].format = mvkVkFormatFromMTLPixelFormat(mtlFormats[fmtIdx]);
+			pSurfaceFormats[idx].colorSpace = colorSpaces[csIdx];
+		}
 	}
 
 	return result;
@@ -679,7 +724,7 @@
 
 #pragma mark Construction
 
-MVKPhysicalDevice::MVKPhysicalDevice(MVKInstance* mvkInstance, id<MTLDevice> mtlDevice) {
+MVKPhysicalDevice::MVKPhysicalDevice(MVKInstance* mvkInstance, id<MTLDevice> mtlDevice) : _supportedExtensions(this, true) {
 	_mvkInstance = mvkInstance;
 	_mtlDevice = [mtlDevice retain];
 
@@ -687,6 +732,7 @@
 	initFeatures();             // Call second.
 	initProperties();           // Call third.
 	initMemoryProperties();
+	initExtensions();
 	logGPUInfo();
 }
 
@@ -734,6 +780,7 @@
 	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily1_v5] ) {
 		_metalFeatures.mslVersionEnum = MTLLanguageVersion2_1;
 		MVK_SET_FROM_ENV_OR_BUILD_BOOL(_metalFeatures.events, MVK_ALLOW_METAL_EVENTS);
+		_metalFeatures.textureBuffers = true;
 	}
 
 	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily3_v1] ) {
@@ -752,8 +799,13 @@
 		_metalFeatures.arrayOfSamplers = true;
 	}
 
+	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily4_v1] ) {
+		_metalFeatures.postDepthCoverage = true;
+	}
+
 	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily5_v1] ) {
 		_metalFeatures.layeredRendering = true;
+		_metalFeatures.stencilFeedback = true;
 	}
 
 #endif
@@ -792,10 +844,12 @@
         _metalFeatures.multisampleArrayTextures = true;
 		MVK_SET_FROM_ENV_OR_BUILD_BOOL(_metalFeatures.events, MVK_ALLOW_METAL_EVENTS);
         _metalFeatures.memoryBarriers = true;
+        _metalFeatures.textureBuffers = true;
     }
 
 	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_macOS_GPUFamily2_v1] ) {
 		_metalFeatures.multisampleLayeredRendering = _metalFeatures.layeredRendering;
+		_metalFeatures.stencilFeedback = true;
 	}
 
 #endif
@@ -819,7 +873,7 @@
 
 	switch (_metalFeatures.mslVersionEnum) {
 		case MTLLanguageVersion2_2:
-			_metalFeatures.mslVersion = SPIRVToMSLConverterOptions::makeMSLVersion(2, 2);
+			setMSLVersion(2, 2);
 			break;
 		case MTLLanguageVersion2_1:
 			setMSLVersion(2, 1);
@@ -913,7 +967,7 @@
 		_features.tessellationShader = true;
 		_features.shaderTessellationAndGeometryPointSize = true;
 	}
-  
+
 	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily4_v1] ) {
 		_features.imageCubeArray = true;
 	}
@@ -1087,7 +1141,11 @@
 	_properties.limits.maxDescriptorSetStorageImages = (_properties.limits.maxPerStageDescriptorStorageImages * 4);
 	_properties.limits.maxDescriptorSetInputAttachments = (_properties.limits.maxPerStageDescriptorInputAttachments * 4);
 
-	_properties.limits.maxTexelBufferElements = _properties.limits.maxImageDimension2D * _properties.limits.maxImageDimension2D;
+	if (_metalFeatures.textureBuffers) {
+		_properties.limits.maxTexelBufferElements = (uint32_t)_metalFeatures.maxMTLBufferSize;
+	} else {
+		_properties.limits.maxTexelBufferElements = _properties.limits.maxImageDimension2D * _properties.limits.maxImageDimension2D;
+	}
 	_properties.limits.maxUniformBufferRange = (uint32_t)_metalFeatures.maxMTLBufferSize;
 	_properties.limits.maxStorageBufferRange = (uint32_t)_metalFeatures.maxMTLBufferSize;
 	_properties.limits.maxPushConstantsSize = (4 * KIBI);
@@ -1098,14 +1156,87 @@
     _properties.limits.bufferImageGranularity = _metalFeatures.mtlBufferAlignment;
     _properties.limits.nonCoherentAtomSize = _metalFeatures.mtlBufferAlignment;
 
+    if ([_mtlDevice respondsToSelector: @selector(minimumLinearTextureAlignmentForPixelFormat:)]) {
+        // Figure out the greatest alignment required by all supported formats, and
+        // whether or not they only require alignment to a single texel. We'll use this
+        // information to fill out the VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT
+        // struct.
+        uint32_t maxStorage = 0, maxUniform = 0;
+        bool singleTexelStorage = true, singleTexelUniform = true;
+        mvkEnumerateSupportedFormats({0, 0, VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT}, true, [&](VkFormat vk) {
+            NSUInteger alignment;
+            if ([_mtlDevice respondsToSelector: @selector(minimumTextureBufferAlignmentForPixelFormat:)]) {
+                alignment = [_mtlDevice minimumTextureBufferAlignmentForPixelFormat: mvkMTLPixelFormatFromVkFormat(vk)];
+            } else {
+                alignment = [_mtlDevice minimumLinearTextureAlignmentForPixelFormat: mvkMTLPixelFormatFromVkFormat(vk)];
+            }
+            VkFormatProperties props = mvkVkFormatProperties(vk, getFormatIsSupported(vk));
+            // For uncompressed formats, this is the size of a single texel.
+            // Note that no implementations of Metal support compressed formats
+            // in a linear texture (including texture buffers). It's likely that even
+            // if they did, this would be the absolute minimum alignment.
+            uint32_t texelSize = mvkVkFormatBytesPerBlock(vk);
+            // From the spec:
+            //   "If the size of a single texel is a multiple of three bytes, then
+            //    the size of a single component of the format is used instead."
+            if (texelSize % 3 == 0) {
+                switch (mvkFormatTypeFromVkFormat(vk)) {
+                case kMVKFormatColorInt8:
+                case kMVKFormatColorUInt8:
+                    texelSize = 1;
+                    break;
+                case kMVKFormatColorHalf:
+                case kMVKFormatColorInt16:
+                case kMVKFormatColorUInt16:
+                    texelSize = 2;
+                    break;
+                case kMVKFormatColorFloat:
+                case kMVKFormatColorInt32:
+                case kMVKFormatColorUInt32:
+                default:
+                    texelSize = 4;
+                    break;
+                }
+            }
+            if (mvkAreAllFlagsEnabled(props.bufferFeatures, VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)) {
+                maxStorage = max(maxStorage, uint32_t(alignment));
+                if (alignment % texelSize != 0) { singleTexelStorage = false; }
+            }
+            if (mvkAreAllFlagsEnabled(props.bufferFeatures, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)) {
+                maxUniform = max(maxUniform, uint32_t(alignment));
+                if (alignment % texelSize != 0) { singleTexelUniform = false; }
+            }
+            return true;
+        });
+        _texelBuffAlignProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT;
+        _texelBuffAlignProperties.storageTexelBufferOffsetAlignmentBytes = maxStorage;
+        _texelBuffAlignProperties.storageTexelBufferOffsetSingleTexelAlignment = singleTexelStorage;
+        _texelBuffAlignProperties.uniformTexelBufferOffsetAlignmentBytes = maxUniform;
+        _texelBuffAlignProperties.uniformTexelBufferOffsetSingleTexelAlignment = singleTexelUniform;
+        _properties.limits.minTexelBufferOffsetAlignment = max(maxStorage, maxUniform);
+    } else {
+#if MVK_IOS
+        if ([_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily3_v1]) {
+            _properties.limits.minTexelBufferOffsetAlignment = 16;
+        } else {
+            _properties.limits.minTexelBufferOffsetAlignment = 64;
+        }
+#endif
+#if MVK_MACOS
+        _properties.limits.minTexelBufferOffsetAlignment = 256;
+#endif
+        _texelBuffAlignProperties.storageTexelBufferOffsetAlignmentBytes = _properties.limits.minTexelBufferOffsetAlignment;
+        _texelBuffAlignProperties.storageTexelBufferOffsetSingleTexelAlignment = VK_FALSE;
+        _texelBuffAlignProperties.uniformTexelBufferOffsetAlignmentBytes = _properties.limits.minTexelBufferOffsetAlignment;
+        _texelBuffAlignProperties.uniformTexelBufferOffsetSingleTexelAlignment = VK_FALSE;
+    }
+
 #if MVK_IOS
     _properties.limits.maxFragmentInputComponents = 60;
 
     if ([_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily3_v1]) {
-        _properties.limits.minTexelBufferOffsetAlignment = 16;
         _properties.limits.optimalBufferCopyOffsetAlignment = 16;
     } else {
-        _properties.limits.minTexelBufferOffsetAlignment = 64;
         _properties.limits.optimalBufferCopyOffsetAlignment = 64;
     }
 
@@ -1122,7 +1253,6 @@
 #endif
 #if MVK_MACOS
     _properties.limits.maxFragmentInputComponents = 128;
-    _properties.limits.minTexelBufferOffsetAlignment = 256;
     _properties.limits.optimalBufferCopyOffsetAlignment = 256;
 
     if ([_mtlDevice supportsFeatureSet: MTLFeatureSet_macOS_GPUFamily1_v2]) {
@@ -1657,6 +1787,21 @@
 	return 128 * MEBI;		// Conservative minimum for macOS GPU's & iOS shared memory
 }
 
+void MVKPhysicalDevice::initExtensions() {
+	if (!_metalFeatures.postDepthCoverage) {
+		_supportedExtensions.vk_EXT_post_depth_coverage.enabled = false;
+	}
+	if (!_metalFeatures.stencilFeedback) {
+		_supportedExtensions.vk_EXT_shader_stencil_export.enabled = false;
+	}
+}
+
+// Return all extensions supported by this physical device.
+MVKExtensionList* MVKPhysicalDevice::getSupportedExtensions(const char* pLayerName) {
+	if (!pLayerName || strcmp(pLayerName, "MoltenVK") == 0) { return &_supportedExtensions; }
+	return getInstance()->getLayerManager()->getLayerNamed(pLayerName)->getSupportedExtensions();
+}
+
 void MVKPhysicalDevice::logGPUInfo() {
 	string devTypeStr;
 	switch (_properties.deviceType) {
@@ -1740,9 +1885,11 @@
 
 #endif
 
-	MVKLogInfo(logMsg.c_str(), _properties.deviceName, devTypeStr.c_str(), _properties.vendorID, _properties.deviceID,
-			   [[[NSUUID alloc] initWithUUIDBytes: _properties.pipelineCacheUUID] autorelease].UUIDString.UTF8String,
-			   SPIRVToMSLConverterOptions::printMSLVersion(_metalFeatures.mslVersion).c_str());
+	NSUUID* nsUUID = [[NSUUID alloc] initWithUUIDBytes: _properties.pipelineCacheUUID];		// temp retain
+	MVKLogInfo(logMsg.c_str(), _properties.deviceName, devTypeStr.c_str(),
+			   _properties.vendorID, _properties.deviceID, nsUUID.UUIDString.UTF8String,
+			   SPIRVToMSLConversionOptions::printMSLVersion(_metalFeatures.mslVersion).c_str());
+	[nsUUID release];																		// temp release
 }
 
 MVKPhysicalDevice::~MVKPhysicalDevice() {
@@ -1988,7 +2135,7 @@
         // See if this pipeline has a parent. This can come either directly
         // via basePipelineHandle or indirectly via basePipelineIndex.
         MVKPipeline* parentPL = VK_NULL_HANDLE;
-        if ( mvkAreFlagsEnabled(pCreateInfo->flags, VK_PIPELINE_CREATE_DERIVATIVE_BIT) ) {
+        if ( mvkAreAllFlagsEnabled(pCreateInfo->flags, VK_PIPELINE_CREATE_DERIVATIVE_BIT) ) {
             VkPipeline vkParentPL = pCreateInfo->basePipelineHandle;
             int32_t parentPLIdx = pCreateInfo->basePipelineIndex;
             if ( !vkParentPL && (parentPLIdx >= 0)) { vkParentPL = pPipelines[parentPLIdx]; }
@@ -2144,43 +2291,44 @@
 
 uint64_t MVKDevice::getPerformanceTimestampImpl() { return mvkGetTimestamp(); }
 
-void MVKDevice::addActivityPerformanceImpl(MVKPerformanceTracker& shaderCompilationEvent,
+void MVKDevice::addActivityPerformanceImpl(MVKPerformanceTracker& activityTracker,
 										   uint64_t startTime, uint64_t endTime) {
     lock_guard<mutex> lock(_perfLock);
 
 	double currInterval = mvkGetElapsedMilliseconds(startTime, endTime);
-	shaderCompilationEvent.minimumDuration = ((shaderCompilationEvent.minimumDuration == 0.0)
+	activityTracker.minimumDuration = ((activityTracker.minimumDuration == 0.0)
 											  ? currInterval :
-											  min(currInterval, shaderCompilationEvent.minimumDuration));
-    shaderCompilationEvent.maximumDuration = max(currInterval, shaderCompilationEvent.maximumDuration);
-    double totalInterval = (shaderCompilationEvent.averageDuration * shaderCompilationEvent.count++) + currInterval;
-    shaderCompilationEvent.averageDuration = totalInterval / shaderCompilationEvent.count;
+											  min(currInterval, activityTracker.minimumDuration));
+    activityTracker.maximumDuration = max(currInterval, activityTracker.maximumDuration);
+    double totalInterval = (activityTracker.averageDuration * activityTracker.count++) + currInterval;
+    activityTracker.averageDuration = totalInterval / activityTracker.count;
 
 	if (_pMVKConfig->performanceLoggingFrameCount) {
 		MVKLogInfo("Performance to %s count: %d curr: %.3f ms, min: %.3f ms, max: %.3f ms, avg: %.3f ms",
-				   getActivityPerformanceDescription(shaderCompilationEvent),
-				   shaderCompilationEvent.count,
+				   getActivityPerformanceDescription(activityTracker),
+				   activityTracker.count,
 				   currInterval,
-				   shaderCompilationEvent.minimumDuration,
-				   shaderCompilationEvent.maximumDuration,
-				   shaderCompilationEvent.averageDuration);
+				   activityTracker.minimumDuration,
+				   activityTracker.maximumDuration,
+				   activityTracker.averageDuration);
 	}
 }
 
-const char* MVKDevice::getActivityPerformanceDescription(MVKPerformanceTracker& shaderCompilationEvent) {
-	if (&shaderCompilationEvent == &_performanceStatistics.shaderCompilation.hashShaderCode) { return "hash shader SPIR-V code"; }
-    if (&shaderCompilationEvent == &_performanceStatistics.shaderCompilation.spirvToMSL) { return "convert SPIR-V to MSL source code"; }
-    if (&shaderCompilationEvent == &_performanceStatistics.shaderCompilation.mslCompile) { return "compile MSL source code into a MTLLibrary"; }
-    if (&shaderCompilationEvent == &_performanceStatistics.shaderCompilation.mslLoad) { return "load pre-compiled MSL code into a MTLLibrary"; }
-	if (&shaderCompilationEvent == &_performanceStatistics.shaderCompilation.shaderLibraryFromCache) { return "retrieve shader library from the cache"; }
-    if (&shaderCompilationEvent == &_performanceStatistics.shaderCompilation.functionRetrieval) { return "retrieve a MTLFunction from a MTLLibrary"; }
-    if (&shaderCompilationEvent == &_performanceStatistics.shaderCompilation.functionSpecialization) { return "specialize a retrieved MTLFunction"; }
-    if (&shaderCompilationEvent == &_performanceStatistics.shaderCompilation.pipelineCompile) { return "compile MTLFunctions into a pipeline"; }
-	if (&shaderCompilationEvent == &_performanceStatistics.pipelineCache.sizePipelineCache) { return "calculate cache size required to write MSL to pipeline cache"; }
-	if (&shaderCompilationEvent == &_performanceStatistics.pipelineCache.writePipelineCache) { return "write MSL to pipeline cache"; }
-	if (&shaderCompilationEvent == &_performanceStatistics.pipelineCache.readPipelineCache) { return "read MSL from pipeline cache"; }
-	if (&shaderCompilationEvent == &_performanceStatistics.queue.mtlQueueAccess) { return "access MTLCommandQueue"; }
-    return "Unknown shader compile event";
+const char* MVKDevice::getActivityPerformanceDescription(MVKPerformanceTracker& activityTracker) {
+	if (&activityTracker == &_performanceStatistics.shaderCompilation.hashShaderCode) { return "hash shader SPIR-V code"; }
+    if (&activityTracker == &_performanceStatistics.shaderCompilation.spirvToMSL) { return "convert SPIR-V to MSL source code"; }
+    if (&activityTracker == &_performanceStatistics.shaderCompilation.mslCompile) { return "compile MSL source code into a MTLLibrary"; }
+    if (&activityTracker == &_performanceStatistics.shaderCompilation.mslLoad) { return "load pre-compiled MSL code into a MTLLibrary"; }
+	if (&activityTracker == &_performanceStatistics.shaderCompilation.shaderLibraryFromCache) { return "retrieve shader library from the cache"; }
+    if (&activityTracker == &_performanceStatistics.shaderCompilation.functionRetrieval) { return "retrieve a MTLFunction from a MTLLibrary"; }
+    if (&activityTracker == &_performanceStatistics.shaderCompilation.functionSpecialization) { return "specialize a retrieved MTLFunction"; }
+    if (&activityTracker == &_performanceStatistics.shaderCompilation.pipelineCompile) { return "compile MTLFunctions into a pipeline"; }
+	if (&activityTracker == &_performanceStatistics.pipelineCache.sizePipelineCache) { return "calculate cache size required to write MSL to pipeline cache"; }
+	if (&activityTracker == &_performanceStatistics.pipelineCache.writePipelineCache) { return "write MSL to pipeline cache"; }
+	if (&activityTracker == &_performanceStatistics.pipelineCache.readPipelineCache) { return "read MSL from pipeline cache"; }
+	if (&activityTracker == &_performanceStatistics.queue.mtlQueueAccess) { return "access MTLCommandQueue"; }
+	if (&activityTracker == &_performanceStatistics.queue.mtlCommandBufferCompletion) { return "complete MTLCommandBuffer"; }
+    return "Unknown performance activity";
 }
 
 void MVKDevice::getPerformanceStatistics(MVKPerformanceStatistics* pPerf) {
@@ -2192,12 +2340,6 @@
 
 #pragma mark Metal
 
-MTLCompileOptions* MVKDevice::getMTLCompileOptions() {
-	MTLCompileOptions* opts = [[MTLCompileOptions new] autorelease];
-	opts.languageVersion = _pMetalFeatures->mslVersionEnum;
-	return opts;
-}
-
 uint32_t MVKDevice::getMetalBufferIndexForVertexAttributeBinding(uint32_t binding) {
 	return ((_pMetalFeatures->maxPerStageBufferCount - 1) - binding);
 }
@@ -2257,21 +2399,26 @@
 	_enabledStorage16Features(),
 	_enabledStorage8Features(),
 	_enabledF16I8Features(),
+	_enabledUBOLayoutFeatures(),
 	_enabledVarPtrFeatures(),
 	_enabledHostQryResetFeatures(),
+	_enabledScalarLayoutFeatures(),
+	_enabledTexelBuffAlignFeatures(),
 	_enabledVtxAttrDivFeatures(),
 	_enabledPortabilityFeatures(),
 	_enabledExtensions(this)
 {
 
 	initPerformanceTracking();
-	initPhysicalDevice(physicalDevice);
+	initPhysicalDevice(physicalDevice, pCreateInfo);
 	enableFeatures(pCreateInfo);
 	enableExtensions(pCreateInfo);
 
     _globalVisibilityResultMTLBuffer = nil;
     _globalVisibilityQueryCount = 0;
 
+	initMTLCompileOptions();	// Before command resource factory
+
 	_commandResourceFactory = new MVKCommandResourceFactory(this);
 
 	initQueues(pCreateInfo);
@@ -2301,11 +2448,30 @@
 	_performanceStatistics.pipelineCache.writePipelineCache = initPerf;
 	_performanceStatistics.pipelineCache.readPipelineCache = initPerf;
 	_performanceStatistics.queue.mtlQueueAccess = initPerf;
+	_performanceStatistics.queue.mtlCommandBufferCompletion = initPerf;
 }
 
-void MVKDevice::initPhysicalDevice(MVKPhysicalDevice* physicalDevice) {
+void MVKDevice::initPhysicalDevice(MVKPhysicalDevice* physicalDevice, const VkDeviceCreateInfo* pCreateInfo) {
 
-	_physicalDevice = physicalDevice;
+	const VkDeviceGroupDeviceCreateInfo* pGroupCreateInfo = nullptr;
+	for (const auto* next = (const VkBaseInStructure*)pCreateInfo->pNext; next; next = next->pNext) {
+		switch (next->sType) {
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
+			pGroupCreateInfo = (const VkDeviceGroupDeviceCreateInfo*)next;
+			break;
+		default:
+			break;
+		}
+	}
+
+	// If I was given physical devices for a grouped device, use them.
+	// At this time, we only support device groups consisting of a single member,
+	// so this is sufficient for now.
+	if (pGroupCreateInfo && pGroupCreateInfo->physicalDeviceCount)
+		_physicalDevice = MVKPhysicalDevice::getMVKPhysicalDevice(pGroupCreateInfo->pPhysicalDevices[0]);
+	else
+		_physicalDevice = physicalDevice;
+
 	_pMVKConfig = _physicalDevice->_mvkInstance->getMoltenVKConfiguration();
 	_pMetalFeatures = _physicalDevice->getMetalFeatures();
 	_pProperties = &_physicalDevice->_properties;
@@ -2333,8 +2499,11 @@
 	memset((void*)&_enabledStorage16Features, 0, sizeof(_enabledStorage16Features));
 	memset((void*)&_enabledStorage8Features, 0, sizeof(_enabledStorage8Features));
 	memset((void*)&_enabledF16I8Features, 0, sizeof(_enabledF16I8Features));
+	memset((void*)&_enabledUBOLayoutFeatures, 0, sizeof(_enabledUBOLayoutFeatures));
 	memset((void*)&_enabledVarPtrFeatures, 0, sizeof(_enabledVarPtrFeatures));
 	memset((void*)&_enabledHostQryResetFeatures, 0, sizeof(_enabledHostQryResetFeatures));
+	memset((void*)&_enabledScalarLayoutFeatures, 0, sizeof(_enabledScalarLayoutFeatures));
+	memset((void*)&_enabledTexelBuffAlignFeatures, 0, sizeof(_enabledTexelBuffAlignFeatures));
 	memset((void*)&_enabledVtxAttrDivFeatures, 0, sizeof(_enabledVtxAttrDivFeatures));
 	memset((void*)&_enabledPortabilityFeatures, 0, sizeof(_enabledPortabilityFeatures));
 
@@ -2347,17 +2516,29 @@
 	pdVtxAttrDivFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT;
 	pdVtxAttrDivFeatures.pNext = &pdPortabilityFeatures;
 
+	VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT pdTexelBuffAlignFeatures;
+	pdTexelBuffAlignFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT;
+	pdTexelBuffAlignFeatures.pNext = &pdVtxAttrDivFeatures;
+
+	VkPhysicalDeviceScalarBlockLayoutFeaturesEXT pdScalarLayoutFeatures;
+	pdScalarLayoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT;
+	pdScalarLayoutFeatures.pNext = &pdTexelBuffAlignFeatures;
+
 	VkPhysicalDeviceHostQueryResetFeaturesEXT pdHostQryResetFeatures;
 	pdHostQryResetFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
-	pdHostQryResetFeatures.pNext = &pdVtxAttrDivFeatures;
+	pdHostQryResetFeatures.pNext = &pdScalarLayoutFeatures;
 
 	VkPhysicalDeviceVariablePointerFeatures pdVarPtrFeatures;
 	pdVarPtrFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES;
 	pdVarPtrFeatures.pNext = &pdHostQryResetFeatures;
 
+	VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR pdUBOLayoutFeatures;
+	pdUBOLayoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR;
+	pdUBOLayoutFeatures.pNext = &pdVarPtrFeatures;
+
 	VkPhysicalDeviceFloat16Int8FeaturesKHR pdF16I8Features;
 	pdF16I8Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR;
-	pdF16I8Features.pNext = &pdVarPtrFeatures;
+	pdF16I8Features.pNext = &pdUBOLayoutFeatures;
 
 	VkPhysicalDevice8BitStorageFeaturesKHR pdStorage8Features;
 	pdStorage8Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
@@ -2411,6 +2592,13 @@
 							   &pdF16I8Features.shaderFloat16, 2);
 				break;
 			}
+			case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR: {
+				auto* requestedFeatures = (VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR*)next;
+				enableFeatures(&_enabledUBOLayoutFeatures.uniformBufferStandardLayout,
+							   &requestedFeatures->uniformBufferStandardLayout,
+							   &pdUBOLayoutFeatures.uniformBufferStandardLayout, 1);
+				break;
+			}
 			case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES: {
 				auto* requestedFeatures = (VkPhysicalDeviceVariablePointerFeatures*)next;
 				enableFeatures(&_enabledVarPtrFeatures.variablePointersStorageBuffer,
@@ -2425,6 +2613,20 @@
 							   &pdHostQryResetFeatures.hostQueryReset, 1);
 				break;
 			}
+			case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: {
+				auto* requestedFeatures = (VkPhysicalDeviceScalarBlockLayoutFeaturesEXT*)next;
+				enableFeatures(&_enabledScalarLayoutFeatures.scalarBlockLayout,
+							   &requestedFeatures->scalarBlockLayout,
+							   &pdScalarLayoutFeatures.scalarBlockLayout, 1);
+				break;
+			}
+			case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+				auto* requestedFeatures = (VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*)next;
+				enableFeatures(&_enabledTexelBuffAlignFeatures.texelBufferAlignment,
+							   &requestedFeatures->texelBufferAlignment,
+							   &pdTexelBuffAlignFeatures.texelBufferAlignment, 1);
+				break;
+			}
 			case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
 				auto* requestedFeatures = (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*)next;
 				enableFeatures(&_enabledVtxAttrDivFeatures.vertexAttributeInstanceRateDivisor,
@@ -2459,7 +2661,7 @@
 	MVKExtensionList* pWritableExtns = (MVKExtensionList*)&_enabledExtensions;
 	setConfigurationResult(pWritableExtns->enable(pCreateInfo->enabledExtensionCount,
 												  pCreateInfo->ppEnabledExtensionNames,
-												  getInstance()->getDriverLayer()->getSupportedExtensions()));
+												  getPhysicalDevice()->getSupportedExtensions()));
 }
 
 // Create the command queues
@@ -2482,12 +2684,19 @@
 	}
 }
 
+void MVKDevice::initMTLCompileOptions() {
+	_mtlCompileOptions = [MTLCompileOptions new];	// retained
+	_mtlCompileOptions.languageVersion = _pMetalFeatures->mslVersionEnum;
+}
+
 MVKDevice::~MVKDevice() {
 	for (auto& queues : _queuesByQueueFamilyIndex) {
 		mvkDestroyContainerContents(queues);
 	}
-    [_globalVisibilityResultMTLBuffer release];
 	_commandResourceFactory->destroy();
+
+	[_mtlCompileOptions release];
+    [_globalVisibilityResultMTLBuffer release];
 }
 
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
index 5c13988..c87b443 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
@@ -101,7 +101,7 @@
 	inline MTLCPUCacheMode getMTLCPUCacheMode() { return _mtlCPUCacheMode; }
 
 	/** Returns the Metal reource options used by this memory allocation. */
-	inline MTLResourceOptions getMTLResourceOptions() { return _mtlResourceOptions; }
+	inline MTLResourceOptions getMTLResourceOptions() { return mvkMTLResourceOptions(_mtlStorageMode, _mtlCPUCacheMode); }
 
 
 #pragma mark Construction
@@ -139,7 +139,6 @@
 	void* _pHostMemory = nullptr;
 	bool _isMapped = false;
 	bool _isDedicated = false;
-	MTLResourceOptions _mtlResourceOptions;
 	MTLStorageMode _mtlStorageMode;
 	MTLCPUCacheMode _mtlCPUCacheMode;
 };
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm
index b179646..ee4aedf 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm
@@ -163,10 +163,10 @@
 
 	// If host memory was already allocated, it is copied into the new MTLBuffer, and then released.
 	if (_pHostMemory) {
-		_mtlBuffer = [getMTLDevice() newBufferWithBytes: _pHostMemory length: memLen options: _mtlResourceOptions];     // retained
+		_mtlBuffer = [getMTLDevice() newBufferWithBytes: _pHostMemory length: memLen options: getMTLResourceOptions()];     // retained
 		freeHostMemory();
 	} else {
-		_mtlBuffer = [getMTLDevice() newBufferWithLength: memLen options: _mtlResourceOptions];     // retained
+		_mtlBuffer = [getMTLDevice() newBufferWithLength: memLen options: getMTLResourceOptions()];     // retained
 	}
 	_pMemory = isMemoryHostAccessible() ? _mtlBuffer.contents : nullptr;
 
@@ -210,7 +210,6 @@
 								 const VkAllocationCallbacks* pAllocator) : MVKVulkanAPIDeviceObject(device) {
 	// Set Metal memory parameters
 	VkMemoryPropertyFlags vkMemProps = _device->_pMemoryProperties->memoryTypes[pAllocateInfo->memoryTypeIndex].propertyFlags;
-	_mtlResourceOptions = mvkMTLResourceOptionsFromVkMemoryPropertyFlags(vkMemProps);
 	_mtlStorageMode = mvkMTLStorageModeFromVkMemoryPropertyFlags(vkMemProps);
 	_mtlCPUCacheMode = mvkMTLCPUCacheModeFromVkMemoryPropertyFlags(vkMemProps);
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.h b/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
index db47a1d..0cbf0d0 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
@@ -22,6 +22,7 @@
 #include "MVKSync.h"
 #include "MVKVector.h"
 #include <MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h>
+#include <unordered_map>
 #include <mutex>
 
 #import <IOSurface/IOSurfaceRef.h>
@@ -61,6 +62,21 @@
     /** Returns the Vulkan image format of this image. */
     VkFormat getVkFormat();
 
+	/** Returns whether this image is compressed. */
+	bool getIsCompressed();
+
+	/**
+	 * Returns whether the format of this image supports ANY of the indicated feature flags,
+	 * taking into consideration whether this image is using linear or optimal tiling.
+	 */
+	bool getSupportsAnyFormatFeature(VkFormatFeatureFlags requiredFormatFeatureFlags);
+
+	/**
+	 * Returns whether the format of this image supports ALL of the indicated feature flags,
+	 * taking into consideration whether this image is using linear or optimal tiling.
+	 */
+	bool getSupportsAllFormatFeatures(VkFormatFeatureFlags requiredFormatFeatureFlags);
+
 	/** 
 	 * Returns the 3D extent of this image at the base mipmap level.
 	 * For 2D or cube images, the Z component will be 1.  
@@ -139,6 +155,9 @@
 	/** Returns the Metal texture underlying this image. */
 	id<MTLTexture> getMTLTexture();
 
+	/** Returns a Metal texture that interprets the pixels in the specified format. */
+	id<MTLTexture> getMTLTexture(MTLPixelFormat mtlPixFmt);
+
     /**
      * Sets this image to use the specified MTLTexture.
      *
@@ -218,17 +237,17 @@
 
 	void propogateDebugName() override;
 	MVKImageSubresource* getSubresource(uint32_t mipLevel, uint32_t arrayLayer);
-	void validateConfig(const VkImageCreateInfo* pCreateInfo);
-	VkSampleCountFlagBits validateSamples(const VkImageCreateInfo* pCreateInfo);
-	uint32_t validateMipLevels(const VkImageCreateInfo* pCreateInfo);
-	bool validateLinear(const VkImageCreateInfo* pCreateInfo);
+	void validateConfig(const VkImageCreateInfo* pCreateInfo, bool isAttachment);
+	VkSampleCountFlagBits validateSamples(const VkImageCreateInfo* pCreateInfo, bool isAttachment);
+	uint32_t validateMipLevels(const VkImageCreateInfo* pCreateInfo, bool isAttachment);
+	bool validateLinear(const VkImageCreateInfo* pCreateInfo, bool isAttachment);
 	bool validateUseTexelBuffer();
 	void initSubresources(const VkImageCreateInfo* pCreateInfo);
 	void initSubresourceLayout(MVKImageSubresource& imgSubRez);
 	virtual id<MTLTexture> newMTLTexture();
 	void resetMTLTexture();
     void resetIOSurface();
-	MTLTextureDescriptor* getMTLTextureDescriptor();
+	MTLTextureDescriptor* newMTLTextureDescriptor();
     void updateMTLTextureContent(MVKImageSubresource& subresource, VkDeviceSize offset, VkDeviceSize size);
     void getMTLTextureContent(MVKImageSubresource& subresource, VkDeviceSize offset, VkDeviceSize size);
 	bool shouldFlushHostMemory();
@@ -239,6 +258,7 @@
 						   VkImageMemoryBarrier* pImageMemoryBarrier);
 
 	std::vector<MVKImageSubresource> _subresources;
+	std::unordered_map<NSUInteger, id<MTLTexture>> _mtlTextureViews;
     VkExtent3D _extent;
     uint32_t _mipLevels;
     uint32_t _arrayLayers;
@@ -361,7 +381,7 @@
 
 protected:
 	void propogateDebugName() override {}
-	MTLSamplerDescriptor* getMTLSamplerDescriptor(const VkSamplerCreateInfo* pCreateInfo);
+	MTLSamplerDescriptor* newMTLSamplerDescriptor(const VkSamplerCreateInfo* pCreateInfo);
 	void initConstExprSampler(const VkSamplerCreateInfo* pCreateInfo);
 
 	id<MTLSamplerState> _mtlSamplerState;
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
index 96ebc14..4f2683e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
@@ -41,6 +41,24 @@
 
 VkFormat MVKImage::getVkFormat() { return mvkVkFormatFromMTLPixelFormat(_mtlPixelFormat); }
 
+bool MVKImage::getIsCompressed() {
+	return mvkFormatTypeFromMTLPixelFormat(_mtlPixelFormat) == kMVKFormatCompressed;
+}
+
+bool MVKImage::getSupportsAnyFormatFeature(VkFormatFeatureFlags requiredFormatFeatureFlags) {
+	VkFormatProperties props;
+	_device->getPhysicalDevice()->getFormatProperties(getVkFormat(), &props);
+	VkFormatFeatureFlags imageFeatureFlags = _isLinear ? props.linearTilingFeatures : props.optimalTilingFeatures;
+	return mvkIsAnyFlagEnabled(imageFeatureFlags, requiredFormatFeatureFlags);
+}
+
+bool MVKImage::getSupportsAllFormatFeatures(VkFormatFeatureFlags requiredFormatFeatureFlags) {
+	VkFormatProperties props;
+	_device->getPhysicalDevice()->getFormatProperties(getVkFormat(), &props);
+	VkFormatFeatureFlags imageFeatureFlags = _isLinear ? props.linearTilingFeatures : props.optimalTilingFeatures;
+	return mvkAreAllFlagsEnabled(imageFeatureFlags, requiredFormatFeatureFlags);
+}
+
 VkExtent3D MVKImage::getExtent3D(uint32_t mipLevel) {
 	return mvkMipmapLevelSizeFromBaseSize3D(_extent, mipLevel);
 }
@@ -157,13 +175,14 @@
 										   ? _device->getPhysicalDevice()->getPrivateMemoryTypes()
 										   : _device->getPhysicalDevice()->getAllMemoryTypes());
 #if MVK_MACOS
-	if (!_isLinear) {  // XXX Linear images must support host-coherent memory
+	// Metal on macOS does not provide native support for host-coherent memory, but Vulkan requires it for Linear images
+	if ( !_isLinear ) {
 		mvkDisableFlag(pMemoryRequirements->memoryTypeBits, _device->getPhysicalDevice()->getHostCoherentMemoryTypes());
 	}
 #endif
 #if MVK_IOS
 	// Only transient attachments may use memoryless storage
-	if (!mvkAreFlagsEnabled(_usage, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) ) {
+	if (!mvkAreAllFlagsEnabled(_usage, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) ) {
 		mvkDisableFlag(pMemoryRequirements->memoryTypeBits, _device->getPhysicalDevice()->getLazilyAllocatedMemoryTypes());
 	}
 #endif
@@ -279,6 +298,22 @@
 	return _mtlTexture;
 }
 
+id<MTLTexture> MVKImage::getMTLTexture(MTLPixelFormat mtlPixFmt) {
+	if (mtlPixFmt == _mtlPixelFormat) { return getMTLTexture(); }
+
+	id<MTLTexture> mtlTex = _mtlTextureViews[mtlPixFmt];
+	if ( !mtlTex ) {
+		// Lock and check again in case another thread has created the texture.
+		lock_guard<mutex> lock(_lock);
+		mtlTex = _mtlTextureViews[mtlPixFmt];
+		if ( !mtlTex ) {
+			mtlTex = [getMTLTexture() newTextureViewWithPixelFormat: mtlPixFmt];	// retained
+			_mtlTextureViews[mtlPixFmt] = mtlTex;
+		}
+	}
+	return mtlTex;
+}
+
 VkResult MVKImage::setMTLTexture(id<MTLTexture> mtlTexture) {
     lock_guard<mutex> lock(_lock);
     resetMTLTexture();
@@ -308,15 +343,21 @@
 // This implementation creates a new MTLTexture from a MTLTextureDescriptor and possible IOSurface.
 // Subclasses may override this function to create the MTLTexture in a different manner.
 id<MTLTexture> MVKImage::newMTLTexture() {
-    if (_ioSurface) {
-        return [getMTLDevice() newTextureWithDescriptor: getMTLTextureDescriptor() iosurface: _ioSurface plane: 0];
+	id<MTLTexture> mtlTex = nil;
+	MTLTextureDescriptor* mtlTexDesc = newMTLTextureDescriptor();	// temp retain
+
+	if (_ioSurface) {
+		mtlTex = [getMTLDevice() newTextureWithDescriptor: mtlTexDesc iosurface: _ioSurface plane: 0];
 	} else if (_usesTexelBuffer) {
-        return [_deviceMemory->_mtlBuffer newTextureWithDescriptor: getMTLTextureDescriptor()
-															offset: getDeviceMemoryOffset()
-													   bytesPerRow: _subresources[0].layout.rowPitch];
-    } else {
-        return [getMTLDevice() newTextureWithDescriptor: getMTLTextureDescriptor()];
-    }
+		mtlTex = [_deviceMemory->_mtlBuffer newTextureWithDescriptor: mtlTexDesc
+															  offset: getDeviceMemoryOffset()
+														 bytesPerRow: _subresources[0].layout.rowPitch];
+	} else {
+		mtlTex = [getMTLDevice() newTextureWithDescriptor: mtlTexDesc];
+	}
+
+	[mtlTexDesc release];											// temp release
+	return mtlTex;
 }
 
 // Removes and releases the MTLTexture object, so that it can be lazily created by getMTLTexture().
@@ -355,14 +396,16 @@
     } else {
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
-        _ioSurface = IOSurfaceCreate((CFDictionaryRef)@{
-                                                        (id)kIOSurfaceWidth: @(_extent.width),
-                                                        (id)kIOSurfaceHeight: @(_extent.height),
-                                                        (id)kIOSurfaceBytesPerElement: @(mvkMTLPixelFormatBytesPerBlock(_mtlPixelFormat)),
-                                                        (id)kIOSurfaceElementWidth: @(mvkMTLPixelFormatBlockTexelSize(_mtlPixelFormat).width),
-                                                        (id)kIOSurfaceElementHeight: @(mvkMTLPixelFormatBlockTexelSize(_mtlPixelFormat).height),
-                                                        (id)kIOSurfaceIsGlobal: @(true),    // Deprecated but needed for interprocess transfers
-                                                        });
+		@autoreleasepool {
+			_ioSurface = IOSurfaceCreate((CFDictionaryRef)@{
+															(id)kIOSurfaceWidth: @(_extent.width),
+															(id)kIOSurfaceHeight: @(_extent.height),
+															(id)kIOSurfaceBytesPerElement: @(mvkMTLPixelFormatBytesPerBlock(_mtlPixelFormat)),
+															(id)kIOSurfaceElementWidth: @(mvkMTLPixelFormatBlockTexelSize(_mtlPixelFormat).width),
+															(id)kIOSurfaceElementHeight: @(mvkMTLPixelFormatBlockTexelSize(_mtlPixelFormat).height),
+															(id)kIOSurfaceIsGlobal: @(true),    // Deprecated but needed for interprocess transfers
+															});
+		}
 #pragma clang diagnostic pop
 
     }
@@ -373,25 +416,21 @@
 }
 
 MTLTextureUsage MVKImage::getMTLTextureUsage() {
+
 	MTLTextureUsage usage = mvkMTLTextureUsageFromVkImageUsageFlags(_usage);
 
-	// If this is a depth/stencil texture, and the device supports it, tell
-	// Metal we may create texture views of this, too.
-	if ((_mtlPixelFormat == MTLPixelFormatDepth32Float_Stencil8
-#if MVK_MACOS
-		 || _mtlPixelFormat == MTLPixelFormatDepth24Unorm_Stencil8
-#endif
-		) && _device->_pMetalFeatures->stencilViews) {
-		mvkEnableFlag(usage, MTLTextureUsagePixelFormatView);
+	// Remove view usage from D/S if Metal doesn't support it
+	if ( !_device->_pMetalFeatures->stencilViews &&
+		mvkMTLPixelFormatIsDepthFormat(_mtlPixelFormat) &&
+		mvkMTLPixelFormatIsStencilFormat(_mtlPixelFormat)) {
+
+		mvkDisableFlag(usage, MTLTextureUsagePixelFormatView);
 	}
 
-	// If this format doesn't support being blitted to, and the usage
-	// doesn't specify use as an attachment, turn off
-	// MTLTextureUsageRenderTarget.
-	VkFormatProperties props;
-	_device->getPhysicalDevice()->getFormatProperties(getVkFormat(), &props);
-	if (!mvkAreFlagsEnabled(_isLinear ? props.linearTilingFeatures : props.optimalTilingFeatures, VK_FORMAT_FEATURE_BLIT_DST_BIT) &&
-		!mvkIsAnyFlagEnabled(_usage, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
+	// If this format doesn't support being rendered to, disable MTLTextureUsageRenderTarget.
+	if ( !getSupportsAnyFormatFeature(VK_FORMAT_FEATURE_BLIT_DST_BIT |
+									  VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
+									  VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ) {
 		mvkDisableFlag(usage, MTLTextureUsageRenderTarget);
 	}
 
@@ -405,9 +444,10 @@
 	return usage;
 }
 
-// Returns an autoreleased Metal texture descriptor constructed from the properties of this image.
-MTLTextureDescriptor* MVKImage::getMTLTextureDescriptor() {
-	MTLTextureDescriptor* mtlTexDesc = [[MTLTextureDescriptor alloc] init];
+// Returns a Metal texture descriptor constructed from the properties of this image.
+// It is the caller's responsibility to release the returned descriptor object.
+MTLTextureDescriptor* MVKImage::newMTLTextureDescriptor() {
+	MTLTextureDescriptor* mtlTexDesc = [MTLTextureDescriptor new];	// retained
 #if MVK_MACOS
 	if (_is3DCompressed) {
 		// Metal doesn't yet support 3D compressed textures, so we'll decompress
@@ -430,7 +470,7 @@
 	mtlTexDesc.storageModeMVK = getMTLStorageMode();
 	mtlTexDesc.cpuCacheMode = getMTLCPUCacheMode();
 
-	return [mtlTexDesc autorelease];
+	return mtlTexDesc;
 }
 
 MTLStorageMode MVKImage::getMTLStorageMode() {
@@ -569,18 +609,22 @@
     _arrayLayers = max(pCreateInfo->arrayLayers, minDim);
 
 	// Perform validation and adjustments before configuring other settings
-	validateConfig(pCreateInfo);
-	_samples = validateSamples(pCreateInfo);
-	_mipLevels = validateMipLevels(pCreateInfo);
-	_isLinear = validateLinear(pCreateInfo);
+	bool isAttachment = mvkIsAnyFlagEnabled(pCreateInfo->usage, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+																 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
+																 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT |
+																 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT));
+	validateConfig(pCreateInfo, isAttachment);
+	_samples = validateSamples(pCreateInfo, isAttachment);
+	_mipLevels = validateMipLevels(pCreateInfo, isAttachment);
+	_isLinear = validateLinear(pCreateInfo, isAttachment);
 
 	_mtlPixelFormat = getMTLPixelFormatFromVkFormat(pCreateInfo->format);
 	_mtlTextureType = mvkMTLTextureTypeFromVkImageType(pCreateInfo->imageType, _arrayLayers, _samples > VK_SAMPLE_COUNT_1_BIT);
 	_usage = pCreateInfo->usage;
 
 	_is3DCompressed = (pCreateInfo->imageType == VK_IMAGE_TYPE_3D) && (mvkFormatTypeFromVkFormat(pCreateInfo->format) == kMVKFormatCompressed);
-	_isDepthStencilAttachment = (mvkAreFlagsEnabled(pCreateInfo->usage, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ||
-								 mvkAreFlagsEnabled(mvkVkFormatProperties(pCreateInfo->format).optimalTilingFeatures, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT));
+	_isDepthStencilAttachment = (mvkAreAllFlagsEnabled(pCreateInfo->usage, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ||
+								 mvkAreAllFlagsEnabled(mvkVkFormatProperties(pCreateInfo->format).optimalTilingFeatures, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT));
 	_canSupportMTLTextureView = !_isDepthStencilAttachment || _device->_pMetalFeatures->stencilViews;
 	_hasExpectedTexelSize = (mvkMTLPixelFormatBytesPerBlock(_mtlPixelFormat) == mvkVkFormatBytesPerBlock(pCreateInfo->format));
 
@@ -593,7 +637,7 @@
     initSubresources(pCreateInfo);
 }
 
-void MVKImage::validateConfig(const VkImageCreateInfo* pCreateInfo) {
+void MVKImage::validateConfig(const VkImageCreateInfo* pCreateInfo, bool isAttachment) {
 
 	bool is2D = pCreateInfo->imageType == VK_IMAGE_TYPE_2D;
 	bool isCompressed = mvkFormatTypeFromVkFormat(pCreateInfo->format) == kMVKFormatCompressed;
@@ -612,18 +656,18 @@
 	if ((mvkFormatTypeFromVkFormat(pCreateInfo->format) == kMVKFormatDepthStencil) && !is2D ) {
 		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, depth/stencil formats may only be used with 2D images."));
 	}
-
-	bool isAttachment = mvkIsAnyFlagEnabled(pCreateInfo->usage, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT));
 	if (isAttachment && (pCreateInfo->arrayLayers > 1) && !_device->_pMetalFeatures->layeredRendering) {
 		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : This device does not support rendering to array (layered) attachments."));
 	}
-
+	if (isAttachment && (pCreateInfo->imageType == VK_IMAGE_TYPE_1D)) {
+		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : This device does not support rendering to 1D attachments."));
+	}
 	if (mvkIsAnyFlagEnabled(pCreateInfo->flags, VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT)) {
 		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Metal does not allow uncompressed views of compressed images."));
 	}
 }
 
-VkSampleCountFlagBits MVKImage::validateSamples(const VkImageCreateInfo* pCreateInfo) {
+VkSampleCountFlagBits MVKImage::validateSamples(const VkImageCreateInfo* pCreateInfo, bool isAttachment) {
 
 	VkSampleCountFlagBits validSamples = pCreateInfo->samples;
 
@@ -644,8 +688,6 @@
 			setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : This device does not support multisampled array textures. Setting sample count to 1."));
 			validSamples = VK_SAMPLE_COUNT_1_BIT;
 		}
-
-		bool isAttachment = mvkIsAnyFlagEnabled(pCreateInfo->usage, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT));
 		if (isAttachment && !_device->_pMetalFeatures->multisampleLayeredRendering) {
 			setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : This device does not support rendering to multisampled array (layered) attachments. Setting sample count to 1."));
 			validSamples = VK_SAMPLE_COUNT_1_BIT;
@@ -655,7 +697,7 @@
 	return validSamples;
 }
 
-uint32_t MVKImage::validateMipLevels(const VkImageCreateInfo* pCreateInfo) {
+uint32_t MVKImage::validateMipLevels(const VkImageCreateInfo* pCreateInfo, bool isAttachment) {
 	uint32_t minDim = 1;
 	uint32_t validMipLevels = max(pCreateInfo->mipLevels, minDim);
 
@@ -669,7 +711,7 @@
 	return validMipLevels;
 }
 
-bool MVKImage::validateLinear(const VkImageCreateInfo* pCreateInfo) {
+bool MVKImage::validateLinear(const VkImageCreateInfo* pCreateInfo, bool isAttachment) {
 
 	if (pCreateInfo->tiling != VK_IMAGE_TILING_LINEAR ) { return false; }
 
@@ -701,8 +743,8 @@
 	}
 
 #if MVK_MACOS
-	if ( mvkIsAnyFlagEnabled(pCreateInfo->usage, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) ) {
-		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : If tiling is VK_IMAGE_TILING_LINEAR, usage must not include VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT."));
+	if (isAttachment) {
+		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : This device does not support rendering to linear (VK_IMAGE_TILING_LINEAR) images."));
 		isLin = false;
 	}
 #endif
@@ -757,6 +799,7 @@
 	if (_deviceMemory) { _deviceMemory->removeImage(this); }
 	resetMTLTexture();
     resetIOSurface();
+	for (auto elem : _mtlTextureViews) { [elem.second release]; }
 }
 
 
@@ -890,10 +933,10 @@
 		if (pCreateInfo->subresourceRange.layerCount != image->_extent.depth) {
 			reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImageView(): Metal does not fully support views on a subset of a 3D texture.");
 		}
-		if (!mvkAreFlagsEnabled(_usage, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) {
-			setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImageView(): 2D views on 3D images are only supported for color attachments."));
-		} else if (mvkIsAnyFlagEnabled(_usage, ~VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) {
-			reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImageView(): 2D views on 3D images are only supported for color attachments.");
+		if ( !mvkIsAnyFlagEnabled(_usage, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) ) {
+			setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImageView(): 2D views on 3D images can only be used as color attachments."));
+		} else if (mvkIsOnlyAnyFlagEnabled(_usage, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) {
+			reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImageView(): 2D views on 3D images can only be used as color attachments.");
 		}
 	}
 }
@@ -1043,10 +1086,11 @@
 	return _requiresConstExprSampler;
 }
 
-// Returns an autoreleased Metal sampler descriptor constructed from the properties of this image.
-MTLSamplerDescriptor* MVKSampler::getMTLSamplerDescriptor(const VkSamplerCreateInfo* pCreateInfo) {
+// Returns an Metal sampler descriptor constructed from the properties of this image.
+// It is the caller's responsibility to release the returned descriptor object.
+MTLSamplerDescriptor* MVKSampler::newMTLSamplerDescriptor(const VkSamplerCreateInfo* pCreateInfo) {
 
-	MTLSamplerDescriptor* mtlSampDesc = [[MTLSamplerDescriptor alloc] init];
+	MTLSamplerDescriptor* mtlSampDesc = [MTLSamplerDescriptor new];		// retained
 	mtlSampDesc.sAddressMode = mvkMTLSamplerAddressModeFromVkSamplerAddressMode(pCreateInfo->addressModeU);
 	mtlSampDesc.tAddressMode = mvkMTLSamplerAddressModeFromVkSamplerAddressMode(pCreateInfo->addressModeV);
     mtlSampDesc.rAddressMode = mvkMTLSamplerAddressModeFromVkSamplerAddressMode(pCreateInfo->addressModeW);
@@ -1084,12 +1128,16 @@
 		}
 	}
 #endif
-	return [mtlSampDesc autorelease];
+	return mtlSampDesc;
 }
 
 MVKSampler::MVKSampler(MVKDevice* device, const VkSamplerCreateInfo* pCreateInfo) : MVKVulkanAPIDeviceObject(device) {
 	_requiresConstExprSampler = pCreateInfo->compareEnable && !_device->_pMetalFeatures->depthSampleCompare;
-    _mtlSamplerState = [getMTLDevice() newSamplerStateWithDescriptor: getMTLSamplerDescriptor(pCreateInfo)];
+
+	MTLSamplerDescriptor* mtlSampDesc = newMTLSamplerDescriptor(pCreateInfo);	// temp retain
+    _mtlSamplerState = [getMTLDevice() newSamplerStateWithDescriptor: mtlSampDesc];
+	[mtlSampDesc release];														// temp release
+
 	initConstExprSampler(pCreateInfo);
 }
 
@@ -1323,7 +1371,12 @@
             // Signal the semaphore device-side.
             _availabilitySignalers.front().first->encodeSignal(mtlCmdBuff);
         }
-        [mtlCmdBuff addCompletedHandler: ^(id<MTLCommandBuffer> mcb) { makeAvailable(); }];
+
+		retain();	// Ensure this image is not destroyed while awaiting MTLCommandBuffer completion
+        [mtlCmdBuff addCompletedHandler: ^(id<MTLCommandBuffer> mcb) {
+			makeAvailable();
+			release();
+		}];
     } else {
         [mtlDrawable present];
         resetMetalSurface();
@@ -1356,7 +1409,6 @@
 	_availability.isAvailable = true;
 	_preSignaled = make_pair(nullptr, nullptr);
 	_mtlDrawable = nil;
-    _canSupportMTLTextureView = false;		// Override...swapchains never support Metal image view.
 }
 
 MVKSwapchainImage::~MVKSwapchainImage() {
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
index e0a355d..5771fe6 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
@@ -85,9 +85,26 @@
 	 */
 	VkResult getPhysicalDevices(uint32_t* pCount, VkPhysicalDevice* pPhysicalDevices);
 
+	/**
+	 * If pPhysicalDeviceGroups is null, the value of pCount is updated with the number of 
+	 * physical device groups supported by this instance.
+	 *
+	 * If pPhysicalDeviceGroups is not null, then pCount physical device groups are copied into the array.
+	 * If the number of available physical device groups is less than pCount, the value of pCount is 
+	 * updated to indicate the number of physical device groups actually returned in the array.
+	 *
+	 * Returns VK_SUCCESS if successful. Returns VK_INCOMPLETE if the number of physical
+	 * device groups available in this instance is larger than the specified pCount. Returns other 
+	 * values if an error occurs.
+	 */
+	VkResult getPhysicalDeviceGroups(uint32_t* pCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProps);
+
 	/** Returns the driver layer. */
 	MVKLayer* getDriverLayer() { return MVKLayerManager::globalManager()->getDriverLayer(); }
 
+	MVKSurface* createSurface(const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
+							  const VkAllocationCallbacks* pAllocator);
+
 	MVKSurface* createSurface(const Vk_PLATFORM_SurfaceCreateInfoMVK* pCreateInfo,
 							  const VkAllocationCallbacks* pAllocator);
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
index 1958eb0..ce9fa40 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
@@ -70,6 +70,41 @@
 	return result;
 }
 
+VkResult MVKInstance::getPhysicalDeviceGroups(uint32_t* pCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProps) {
+
+	// According to the Vulkan spec:
+	//  "Every physical device *must* be in exactly one device group."
+	// Since we don't really support this yet, we must return one group for every
+	// device.
+
+	// Get the number of physical devices
+	uint32_t pdCnt = (uint32_t)_physicalDevices.size();
+
+	// If properties aren't actually being requested yet, simply update the returned count
+	if ( !pPhysicalDeviceGroupProps ) {
+		*pCount = pdCnt;
+		return VK_SUCCESS;
+	}
+
+	// Othewise, determine how many physical device groups we'll return, and return that count
+	VkResult result = (*pCount >= pdCnt) ? VK_SUCCESS : VK_INCOMPLETE;
+	*pCount = min(pdCnt, *pCount);
+
+	// Now populate the device groups
+	for (uint32_t pdIdx = 0; pdIdx < *pCount; pdIdx++) {
+		pPhysicalDeviceGroupProps[pdIdx].physicalDeviceCount = 1;
+		pPhysicalDeviceGroupProps[pdIdx].physicalDevices[0] = _physicalDevices[pdIdx]->getVkPhysicalDevice();
+		pPhysicalDeviceGroupProps[pdIdx].subsetAllocation = VK_FALSE;
+	}
+
+	return result;
+}
+
+MVKSurface* MVKInstance::createSurface(const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
+									   const VkAllocationCallbacks* pAllocator) {
+	return new MVKSurface(this, pCreateInfo, pAllocator);
+}
+
 MVKSurface* MVKInstance::createSurface(const Vk_PLATFORM_SurfaceCreateInfoMVK* pCreateInfo,
 									   const VkAllocationCallbacks* pAllocator) {
 	return new MVKSurface(this, pCreateInfo, pAllocator);
@@ -247,28 +282,28 @@
 
 #pragma mark Object Creation
 
-// Returns an autoreleased array containing the MTLDevices available on this system,
-// sorted according to power, with higher power GPU's at the front of the array.
-// This ensures that a lazy app that simply grabs the first GPU will get a high-power
-// one by default. If the MVK_CONFIG_FORCE_LOW_POWER_GPU env var or build setting is set,
-// the returned array will only include low-power devices.
-// If Metal is not supported, ensure we return an empty array.
-static NSArray<id<MTLDevice>>* getAvailableMTLDevices() {
+// Returns a new array containing the MTLDevices available on this system, sorted according to power,
+// with higher power GPU's at the front of the array. This ensures that a lazy app that simply
+// grabs the first GPU will get a high-power one by default. If the MVK_CONFIG_FORCE_LOW_POWER_GPU
+// env var or build setting is set, the returned array will only include low-power devices.
+// It is the caller's responsibility to release the array when not required anymore.
+// If Metal is not supported, returns an empty array.
+static NSArray<id<MTLDevice>>* newAvailableMTLDevicesArray() {
+	NSMutableArray* mtlDevs = [NSMutableArray new];
+
 #if MVK_MACOS
-	NSArray* mtlDevs = [MTLCopyAllDevices() autorelease];
-	if ( !mtlDevs ) { return @[]; }
+	NSArray* rawMTLDevs = MTLCopyAllDevices();			// temp retain
+	if (rawMTLDevs) {
+		bool forceLowPower = MVK_CONFIG_FORCE_LOW_POWER_GPU;
+		MVK_SET_FROM_ENV_OR_BUILD_BOOL(forceLowPower, MVK_CONFIG_FORCE_LOW_POWER_GPU);
 
-	bool forceLowPower = MVK_CONFIG_FORCE_LOW_POWER_GPU;
-	MVK_SET_FROM_ENV_OR_BUILD_BOOL(forceLowPower, MVK_CONFIG_FORCE_LOW_POWER_GPU);
-
-	if (forceLowPower) {
-		NSMutableArray* lpDevs = [[NSMutableArray new] autorelease];
-		for (id<MTLDevice> md in mtlDevs) {
-			if (md.isLowPower) { [lpDevs addObject: md]; }
+		// Populate the array of appropriate MTLDevices
+		for (id<MTLDevice> md in rawMTLDevs) {
+			if ( !forceLowPower || md.isLowPower ) { [mtlDevs addObject: md]; }
 		}
-		return lpDevs;
-	} else {
-		return [mtlDevs sortedArrayUsingComparator: ^(id<MTLDevice> md1, id<MTLDevice> md2) {
+
+		// Sort by power
+		[mtlDevs sortUsingComparator: ^(id<MTLDevice> md1, id<MTLDevice> md2) {
 			BOOL md1IsLP = md1.isLowPower;
 			BOOL md2IsLP = md2.isLowPower;
 
@@ -285,14 +320,18 @@
 
 			return md2IsLP ? NSOrderedAscending : NSOrderedDescending;
 		}];
-	}
 
+	}
+	[rawMTLDevs release];								// release temp
 #endif	// MVK_MACOS
 
 #if MVK_IOS
-	id<MTLDevice> mtlDev = MTLCreateSystemDefaultDevice();
-	return mtlDev ? [NSArray arrayWithObject: mtlDev] : @[];
+	id<MTLDevice> md = MTLCreateSystemDefaultDevice();
+	if (md) { [mtlDevs addObject: md]; }
+	[md release];
 #endif	// MVK_IOS
+
+	return mtlDevs;		// retained
 }
 
 MVKInstance::MVKInstance(const VkInstanceCreateInfo* pCreateInfo) : _enabledExtensions(this) {
@@ -321,11 +360,13 @@
 	}
 
 	// Populate the array of physical GPU devices
-	NSArray<id<MTLDevice>>* mtlDevices = getAvailableMTLDevices();
+	NSArray<id<MTLDevice>>* mtlDevices = newAvailableMTLDevicesArray();		// temp retain
 	_physicalDevices.reserve(mtlDevices.count);
 	for (id<MTLDevice> mtlDev in mtlDevices) {
 		_physicalDevices.push_back(new MVKPhysicalDevice(this, mtlDev));
 	}
+	[mtlDevices release];													// release temp
+
 	if (_physicalDevices.empty()) {
 		setConfigurationResult(reportError(VK_ERROR_INCOMPATIBLE_DRIVER, "Vulkan is not supported on this device. MoltenVK requires Metal, which is not available on this device."));
 	}
@@ -512,6 +553,7 @@
 	ADD_DVC_ENTRY_POINT(vkCmdExecuteCommands);
 
 	// Instance extension functions:
+	ADD_INST_EXT_ENTRY_POINT(vkEnumeratePhysicalDeviceGroupsKHR, KHR_DEVICE_GROUP_CREATION);
 	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceFeatures2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
 	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
 	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceFormatProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
@@ -540,6 +582,7 @@
 	ADD_INST_EXT_ENTRY_POINT(vkCreateDebugUtilsMessengerEXT, EXT_DEBUG_UTILS);
 	ADD_INST_EXT_ENTRY_POINT(vkDestroyDebugUtilsMessengerEXT, EXT_DEBUG_UTILS);
 	ADD_INST_EXT_ENTRY_POINT(vkSubmitDebugUtilsMessageEXT, EXT_DEBUG_UTILS);
+	ADD_INST_EXT_ENTRY_POINT(vkCreateMetalSurfaceEXT, EXT_METAL_SURFACE);
 
 #ifdef VK_USE_PLATFORM_IOS_MVK
 	ADD_INST_EXT_ENTRY_POINT(vkCreateIOSSurfaceMVK, MVK_IOS_SURFACE);
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
index ebbaa35..99bb888 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
@@ -58,9 +58,6 @@
                             uint32_t firstSet,
                             MVKVector<uint32_t>& dynamicOffsets);
 
-	/** Populates the specified shader converter context. */
-	void populateShaderConverterContext(SPIRVToMSLConverterContext& context);
-
 	/** Updates a descriptor set in a command encoder. */
 	void pushDescriptorSet(MVKCommandEncoder* cmdEncoder,
 						   MVKVector<VkWriteDescriptorSet>& descriptorWrites,
@@ -72,6 +69,9 @@
 						   uint32_t set,
 						   const void* pData);
 
+	/** Populates the specified shader converter context. */
+	void populateShaderConverterContext(SPIRVToMSLConversionConfiguration& context);
+
 	/** Returns the current swizzle buffer bindings. */
 	const MVKShaderImplicitRezBinding& getSwizzleBufferIndex() { return _swizzleBufferIndex; }
 
@@ -96,6 +96,9 @@
 	/** Returns the number of buffers in this layout. This is used to calculate the size of the buffer size buffer. */
 	uint32_t getBufferCount() { return _pushConstantsMTLResourceIndexes.getMaxBufferIndex(); }
 
+	/** Returns the push constant binding info. */
+	const MVKShaderResourceBinding& getPushConstantBindings() { return _pushConstantsMTLResourceIndexes; }
+
 	/** Constructs an instance for the specified device. */
 	MVKPipelineLayout(MVKDevice* device, const VkPipelineLayoutCreateInfo* pCreateInfo);
 
@@ -144,6 +147,9 @@
 	/** Binds this pipeline to the specified command encoder. */
 	virtual void encode(MVKCommandEncoder* cmdEncoder, uint32_t stage = 0) = 0;
 
+	/** Binds the push constants to a command encoder. */
+	void bindPushConstants(MVKCommandEncoder* cmdEncoder);
+
 	/** Returns the current swizzle buffer bindings. */
 	const MVKShaderImplicitRezBinding& getSwizzleBufferIndex() { return _swizzleBufferIndex; }
 
@@ -157,9 +163,7 @@
 	bool hasValidMTLPipelineStates() { return _hasValidMTLPipelineStates; }
 
 	/** Constructs an instance for the device. layout, and parent (which may be NULL). */
-	MVKPipeline(MVKDevice* device, MVKPipelineCache* pipelineCache, MVKPipeline* parent) : MVKVulkanAPIDeviceObject(device),
-																						   _pipelineCache(pipelineCache),
-	   																					   _fullImageViewSwizzle(device->_pMVKConfig->fullImageViewSwizzle)	{}
+	MVKPipeline(MVKDevice* device, MVKPipelineCache* pipelineCache, MVKPipelineLayout* layout, MVKPipeline* parent);
 
 protected:
 	void propogateDebugName() override {}
@@ -167,6 +171,7 @@
 	MVKPipelineCache* _pipelineCache;
 	MVKShaderImplicitRezBinding _swizzleBufferIndex;
 	MVKShaderImplicitRezBinding _bufferSizeBufferIndex;
+	MVKShaderResourceBinding _pushConstantsMTLResourceIndexes;
 	bool _fullImageViewSwizzle;
 	bool _hasValidMTLPipelineStates = true;
 
@@ -232,22 +237,18 @@
     id<MTLRenderPipelineState> getOrCompilePipeline(MTLRenderPipelineDescriptor* plDesc, id<MTLRenderPipelineState>& plState);
     id<MTLComputePipelineState> getOrCompilePipeline(MTLComputePipelineDescriptor* plDesc, id<MTLComputePipelineState>& plState, const char* compilerType);
     void initMTLRenderPipelineState(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData);
-    void initMVKShaderConverterContext(SPIRVToMSLConverterContext& _shaderContext,
-                                       const VkGraphicsPipelineCreateInfo* pCreateInfo,
-                                       const SPIRVTessReflectionData& reflectData);
-    void addVertexInputToShaderConverterContext(SPIRVToMSLConverterContext& shaderContext,
-                                                const VkGraphicsPipelineCreateInfo* pCreateInfo);
-    void addPrevStageOutputToShaderConverterContext(SPIRVToMSLConverterContext& shaderContext,
-                                                    std::vector<SPIRVShaderOutput>& outputs);
-    MTLRenderPipelineDescriptor* getMTLRenderPipelineDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData);
-    MTLRenderPipelineDescriptor* getMTLTessVertexStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConverterContext& shaderContext);
-    MTLComputePipelineDescriptor* getMTLTessControlStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConverterContext& shaderContext);
-    MTLRenderPipelineDescriptor* getMTLTessRasterStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConverterContext& shaderContext);
-    bool addVertexShaderToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConverterContext& shaderContext);
-    bool addTessCtlShaderToPipeline(MTLComputePipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConverterContext& shaderContext, std::vector<SPIRVShaderOutput>& prevOutput);
-    bool addTessEvalShaderToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConverterContext& shaderContext, std::vector<SPIRVShaderOutput>& prevOutput);
-    bool addFragmentShaderToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConverterContext& shaderContext);
-    bool addVertexInputToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkPipelineVertexInputStateCreateInfo* pVI, const SPIRVToMSLConverterContext& shaderContext);
+    void initMVKShaderConverterContext(SPIRVToMSLConversionConfiguration& _shaderContext, const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData);
+    void addVertexInputToShaderConverterContext(SPIRVToMSLConversionConfiguration& shaderContext, const VkGraphicsPipelineCreateInfo* pCreateInfo);
+    void addPrevStageOutputToShaderConverterContext(SPIRVToMSLConversionConfiguration& shaderContext, std::vector<SPIRVShaderOutput>& outputs);
+    MTLRenderPipelineDescriptor* newMTLRenderPipelineDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData);
+    MTLRenderPipelineDescriptor* newMTLTessVertexStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConversionConfiguration& shaderContext);
+	MTLComputePipelineDescriptor* newMTLTessControlStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConversionConfiguration& shaderContext);
+	MTLRenderPipelineDescriptor* newMTLTessRasterStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConversionConfiguration& shaderContext);
+	bool addVertexShaderToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConversionConfiguration& shaderContext);
+	bool addTessCtlShaderToPipeline(MTLComputePipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConversionConfiguration& shaderContext, std::vector<SPIRVShaderOutput>& prevOutput);
+	bool addTessEvalShaderToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConversionConfiguration& shaderContext, std::vector<SPIRVShaderOutput>& prevOutput);
+    bool addFragmentShaderToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConversionConfiguration& shaderContext);
+	bool addVertexInputToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkPipelineVertexInputStateCreateInfo* pVI, const SPIRVToMSLConversionConfiguration& shaderContext);
     void addTessellationToPipeline(MTLRenderPipelineDescriptor* plDesc, const SPIRVTessReflectionData& reflectData, const VkPipelineTessellationStateCreateInfo* pTS);
     void addFragmentOutputToPipeline(MTLRenderPipelineDescriptor* plDesc, const SPIRVTessReflectionData& reflectData, const VkGraphicsPipelineCreateInfo* pCreateInfo, bool isTessellationVertexPipeline = false);
     bool isRenderingPoints(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData);
@@ -356,7 +357,7 @@
 	VkResult writeData(size_t* pDataSize, void* pData);
 
 	/** Return a shader library from the specified shader context sourced from the specified shader module. */
-	MVKShaderLibrary* getShaderLibrary(SPIRVToMSLConverterContext* pContext, MVKShaderModule* shaderModule);
+	MVKShaderLibrary* getShaderLibrary(SPIRVToMSLConversionConfiguration* pContext, MVKShaderModule* shaderModule);
 
 	/** Merges the contents of the specified number of pipeline caches into this cache. */
 	VkResult mergePipelineCaches(uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches);
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
index 5d31a12..c21340d 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
@@ -53,11 +53,6 @@
 							  dynamicOffsets, &pDynamicOffsetIndex);
 		setConfigurationResult(dsl.getConfigurationResult());
 	}
-	if (cmdEncoder) {
-		for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) {
-			cmdEncoder->getPushConstants(mvkVkShaderStageFlagBitsFromMVKShaderStage(MVKShaderStage(i)))->setMTLBufferIndex(_pushConstantsMTLResourceIndexes.stages[i].bufferIndex);
-		}
-	}
 }
 
 // A null cmdEncoder can be passed to perform a validation pass
@@ -68,12 +63,6 @@
 	auto& dsl = _descriptorSetLayouts[set];
 	dsl.pushDescriptorSet(cmdEncoder, descriptorWrites, _dslMTLResourceIndexOffsets[set]);
 	setConfigurationResult(dsl.getConfigurationResult());
-
-	if (cmdEncoder) {
-		for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) {
-			cmdEncoder->getPushConstants(mvkVkShaderStageFlagBitsFromMVKShaderStage(MVKShaderStage(i)))->setMTLBufferIndex(_pushConstantsMTLResourceIndexes.stages[i].bufferIndex);
-		}
-	}
 }
 
 // A null cmdEncoder can be passed to perform a validation pass
@@ -85,15 +74,9 @@
 	auto& dsl = _descriptorSetLayouts[set];
 	dsl.pushDescriptorSet(cmdEncoder, descUpdateTemplate, pData, _dslMTLResourceIndexOffsets[set]);
 	setConfigurationResult(dsl.getConfigurationResult());
-
-	if (cmdEncoder) {
-		for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) {
-			cmdEncoder->getPushConstants(mvkVkShaderStageFlagBitsFromMVKShaderStage(MVKShaderStage(i)))->setMTLBufferIndex(_pushConstantsMTLResourceIndexes.stages[i].bufferIndex);
-		}
-	}
 }
 
-void MVKPipelineLayout::populateShaderConverterContext(SPIRVToMSLConverterContext& context) {
+void MVKPipelineLayout::populateShaderConverterContext(SPIRVToMSLConversionConfiguration& context) {
 	context.resourceBindings.clear();
 
     // Add resource bindings defined in the descriptor set layouts
@@ -169,6 +152,24 @@
 
 
 #pragma mark -
+#pragma mark MVKPipeline
+
+void MVKPipeline::bindPushConstants(MVKCommandEncoder* cmdEncoder) {
+	if (cmdEncoder) {
+		for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) {
+			cmdEncoder->getPushConstants(mvkVkShaderStageFlagBitsFromMVKShaderStage(MVKShaderStage(i)))->setMTLBufferIndex(_pushConstantsMTLResourceIndexes.stages[i].bufferIndex);
+		}
+	}
+}
+
+MVKPipeline::MVKPipeline(MVKDevice* device, MVKPipelineCache* pipelineCache, MVKPipelineLayout* layout, MVKPipeline* parent) :
+	MVKVulkanAPIDeviceObject(device),
+	_pipelineCache(pipelineCache),
+	_pushConstantsMTLResourceIndexes(layout->getPushConstantBindings()),
+	_fullImageViewSwizzle(device->_pMVKConfig->fullImageViewSwizzle) {}
+
+
+#pragma mark -
 #pragma mark MVKGraphicsPipeline
 
 void MVKGraphicsPipeline::getStages(MVKVector<uint32_t>& stages) {
@@ -205,7 +206,7 @@
             id<MTLComputePipelineState> plState;
 			const char* compilerType = "Tessellation control stage pipeline";
 			const MVKIndexMTLBufferBinding& indexBuff = cmdEncoder->_graphicsResourcesState._mtlIndexBufferBinding;
-            MTLComputePipelineDescriptor* plDesc = [[_mtlTessControlStageDesc copy] autorelease];  // Use a copy to be thread-safe.
+            MTLComputePipelineDescriptor* plDesc = [_mtlTessControlStageDesc copy];  // temp retain a copy to be thread-safe.
             if (!indexBuff.mtlBuffer && getInputControlPointCount() >= getOutputControlPointCount()) {
                 plState = getOrCompilePipeline(plDesc, _mtlTessControlStageState, compilerType);
             } else if (indexBuff.mtlIndexType == MTLIndexTypeUInt16) {
@@ -217,6 +218,8 @@
                 plDesc.stageInputDescriptor.layouts[kMVKTessCtlInputBufferIndex].stepFunction = MTLStepFunctionThreadPositionInGridXIndexed;
                 plState = getOrCompilePipeline(plDesc, _mtlTessControlStageIndex32State, compilerType);
             }
+			[plDesc release];														// temp release
+
 			if ( !_hasValidMTLPipelineStates ) { return; }
 
             id<MTLComputeCommandEncoder> tessCtlEnc = cmdEncoder->getMTLComputeEncoder(kMVKCommandUseTessellationControl);
@@ -285,7 +288,8 @@
 MVKGraphicsPipeline::MVKGraphicsPipeline(MVKDevice* device,
 										 MVKPipelineCache* pipelineCache,
 										 MVKPipeline* parent,
-										 const VkGraphicsPipelineCreateInfo* pCreateInfo) : MVKPipeline(device, pipelineCache, parent) {
+										 const VkGraphicsPipelineCreateInfo* pCreateInfo) :
+	MVKPipeline(device, pipelineCache, (MVKPipelineLayout*)pCreateInfo->layout, parent) {
 
 	// Get the tessellation shaders, if present. Do this now, because we need to extract
 	// reflection data from them that informs everything else.
@@ -424,33 +428,39 @@
 	_mtlPipelineState = nil;
 	_mtlTessControlStageDesc = nil;
 	if (!isTessellationPipeline()) {
-		MTLRenderPipelineDescriptor* plDesc = getMTLRenderPipelineDescriptor(pCreateInfo, reflectData);
+		MTLRenderPipelineDescriptor* plDesc = newMTLRenderPipelineDescriptor(pCreateInfo, reflectData);	// temp retain
 		if (plDesc) {
 			getOrCompilePipeline(plDesc, _mtlPipelineState);
 		}
+		[plDesc release];																				// temp release
 	} else {
 		// In this case, we need to create three render pipelines. But, the way Metal handles
 		// index buffers for compute stage-in means we have to defer creation of stage 2 until
 		// draw time. In the meantime, we'll create and retain a descriptor for it.
-		SPIRVToMSLConverterContext shaderContext;
+		SPIRVToMSLConversionConfiguration shaderContext;
 		initMVKShaderConverterContext(shaderContext, pCreateInfo, reflectData);
-		MTLRenderPipelineDescriptor* vtxPLDesc = getMTLTessVertexStageDescriptor(pCreateInfo, reflectData, shaderContext);
-		_mtlTessControlStageDesc = getMTLTessControlStageDescriptor(pCreateInfo, reflectData, shaderContext);	// retained
-		MTLRenderPipelineDescriptor* rastPLDesc = getMTLTessRasterStageDescriptor(pCreateInfo, reflectData, shaderContext);
+
+		MTLRenderPipelineDescriptor* vtxPLDesc = newMTLTessVertexStageDescriptor(pCreateInfo, reflectData, shaderContext);	// temp retain
+		_mtlTessControlStageDesc = newMTLTessControlStageDescriptor(pCreateInfo, reflectData, shaderContext);				// retained
+		MTLRenderPipelineDescriptor* rastPLDesc = newMTLTessRasterStageDescriptor(pCreateInfo, reflectData, shaderContext);	// temp retained
 		if (vtxPLDesc && _mtlTessControlStageDesc && rastPLDesc) {
 			if (getOrCompilePipeline(vtxPLDesc, _mtlTessVertexStageState)) {
 				getOrCompilePipeline(rastPLDesc, _mtlPipelineState);
 			}
 		}
+		[vtxPLDesc release];	// temp release
+		[rastPLDesc release];	// temp release
 	}
 }
 
-// Returns a MTLRenderPipelineDescriptor constructed from this instance, or nil if an error occurs.
-MTLRenderPipelineDescriptor* MVKGraphicsPipeline::getMTLRenderPipelineDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData) {
-	SPIRVToMSLConverterContext shaderContext;
+// Returns a retained MTLRenderPipelineDescriptor constructed from this instance, or nil if an error occurs.
+// It is the responsibility of the caller to release the returned descriptor.
+MTLRenderPipelineDescriptor* MVKGraphicsPipeline::newMTLRenderPipelineDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo,
+																				 const SPIRVTessReflectionData& reflectData) {
+	SPIRVToMSLConversionConfiguration shaderContext;
 	initMVKShaderConverterContext(shaderContext, pCreateInfo, reflectData);
 
-	MTLRenderPipelineDescriptor* plDesc = [[MTLRenderPipelineDescriptor new] autorelease];
+	MTLRenderPipelineDescriptor* plDesc = [MTLRenderPipelineDescriptor new];	// retained
 
 	// Add shader stages. Compile vertex shader before others just in case conversion changes anything...like rasterizaion disable.
 	if (!addVertexShaderToPipeline(plDesc, pCreateInfo, shaderContext)) { return nil; }
@@ -472,9 +482,12 @@
 	return plDesc;
 }
 
-// Returns a MTLRenderPipelineDescriptor for the vertex stage of a tessellated draw constructed from this instance, or nil if an error occurs.
-MTLRenderPipelineDescriptor* MVKGraphicsPipeline::getMTLTessVertexStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConverterContext& shaderContext) {
-	MTLRenderPipelineDescriptor* plDesc = [[MTLRenderPipelineDescriptor new] autorelease];
+// Returns a retained MTLRenderPipelineDescriptor for the vertex stage of a tessellated draw constructed from this instance, or nil if an error occurs.
+// It is the responsibility of the caller to release the returned descriptor.
+MTLRenderPipelineDescriptor* MVKGraphicsPipeline::newMTLTessVertexStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo,
+																				  const SPIRVTessReflectionData& reflectData,
+																				  SPIRVToMSLConversionConfiguration& shaderContext) {
+	MTLRenderPipelineDescriptor* plDesc = [MTLRenderPipelineDescriptor new];	// retained
 
 	// Add shader stages.
 	if (!addVertexShaderToPipeline(plDesc, pCreateInfo, shaderContext)) { return nil; }
@@ -581,9 +594,12 @@
 	return VK_FORMAT_UNDEFINED;
 }
 
-// Returns a MTLComputePipelineDescriptor for the tess. control stage of a tessellated draw constructed from this instance, or nil if an error occurs.
-MTLComputePipelineDescriptor* MVKGraphicsPipeline::getMTLTessControlStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConverterContext& shaderContext) {
-	MTLComputePipelineDescriptor* plDesc = [MTLComputePipelineDescriptor new];
+// Returns a retained MTLComputePipelineDescriptor for the tess. control stage of a tessellated draw constructed from this instance, or nil if an error occurs.
+// It is the responsibility of the caller to release the returned descriptor.
+MTLComputePipelineDescriptor* MVKGraphicsPipeline::newMTLTessControlStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo,
+																					const SPIRVTessReflectionData& reflectData,
+																					SPIRVToMSLConversionConfiguration& shaderContext) {
+	MTLComputePipelineDescriptor* plDesc = [MTLComputePipelineDescriptor new];		// retained
 
 	std::vector<SPIRVShaderOutput> vtxOutputs;
 	std::string errorLog;
@@ -626,9 +642,12 @@
 	return plDesc;
 }
 
-// Returns a MTLRenderPipelineDescriptor for the last stage of a tessellated draw constructed from this instance, or nil if an error occurs.
-MTLRenderPipelineDescriptor* MVKGraphicsPipeline::getMTLTessRasterStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo, const SPIRVTessReflectionData& reflectData, SPIRVToMSLConverterContext& shaderContext) {
-	MTLRenderPipelineDescriptor* plDesc = [[MTLRenderPipelineDescriptor new] autorelease];
+// Returns a retained MTLRenderPipelineDescriptor for the last stage of a tessellated draw constructed from this instance, or nil if an error occurs.
+// It is the responsibility of the caller to release the returned descriptor.
+MTLRenderPipelineDescriptor* MVKGraphicsPipeline::newMTLTessRasterStageDescriptor(const VkGraphicsPipelineCreateInfo* pCreateInfo,
+																				  const SPIRVTessReflectionData& reflectData,
+																				  SPIRVToMSLConversionConfiguration& shaderContext) {
+	MTLRenderPipelineDescriptor* plDesc = [MTLRenderPipelineDescriptor new];	// retained
 
 	std::vector<SPIRVShaderOutput> tcOutputs;
 	std::string errorLog;
@@ -750,7 +769,9 @@
 }
 
 // Adds a vertex shader to the pipeline description.
-bool MVKGraphicsPipeline::addVertexShaderToPipeline(MTLRenderPipelineDescriptor* plDesc, const VkGraphicsPipelineCreateInfo* pCreateInfo, SPIRVToMSLConverterContext& shaderContext) {
+bool MVKGraphicsPipeline::addVertexShaderToPipeline(MTLRenderPipelineDescriptor* plDesc,
+													const VkGraphicsPipelineCreateInfo* pCreateInfo,
+													SPIRVToMSLConversionConfiguration& shaderContext) {
 	uint32_t vbCnt = pCreateInfo->pVertexInputState->vertexBindingDescriptionCount;
 	shaderContext.options.entryPointStage = spv::ExecutionModelVertex;
 	shaderContext.options.entryPointName = _pVertexSS->pName;
@@ -761,16 +782,21 @@
 	shaderContext.options.mslOptions.capture_output_to_buffer = isTessellationPipeline();
 	shaderContext.options.mslOptions.disable_rasterization = isTessellationPipeline() || (pCreateInfo->pRasterizationState && (pCreateInfo->pRasterizationState->rasterizerDiscardEnable));
     addVertexInputToShaderConverterContext(shaderContext, pCreateInfo);
-	id<MTLFunction> mtlFunction = ((MVKShaderModule*)_pVertexSS->module)->getMTLFunction(&shaderContext, _pVertexSS->pSpecializationInfo, _pipelineCache).mtlFunction;
-	if ( !mtlFunction ) {
+
+	MVKMTLFunction func = ((MVKShaderModule*)_pVertexSS->module)->getMTLFunction(&shaderContext, _pVertexSS->pSpecializationInfo, _pipelineCache);
+	id<MTLFunction> mtlFunc = func.getMTLFunction();
+	if ( !mtlFunc ) {
 		setConfigurationResult(reportError(VK_ERROR_INVALID_SHADER_NV, "Vertex shader function could not be compiled into pipeline. See previous logged error."));
 		return false;
 	}
-	plDesc.vertexFunction = mtlFunction;
-	plDesc.rasterizationEnabled = !shaderContext.options.mslOptions.disable_rasterization;
-	_needsVertexSwizzleBuffer = shaderContext.options.needsSwizzleBuffer;
-	_needsVertexBufferSizeBuffer = shaderContext.options.needsBufferSizeBuffer;
-	_needsVertexOutputBuffer = shaderContext.options.needsOutputBuffer;
+	plDesc.vertexFunction = mtlFunc;
+
+	auto& funcRslts = func.shaderConversionResults;
+	plDesc.rasterizationEnabled = !funcRslts.isRasterizationDisabled;
+	_needsVertexSwizzleBuffer = funcRslts.needsSwizzleBuffer;
+	_needsVertexBufferSizeBuffer = funcRslts.needsBufferSizeBuffer;
+	_needsVertexOutputBuffer = funcRslts.needsOutputBuffer;
+
 	// If we need the swizzle buffer and there's no place to put it, we're in serious trouble.
 	if (!verifyImplicitBuffer(_needsVertexSwizzleBuffer, _swizzleBufferIndex, kMVKShaderStageVertex, "swizzle", vbCnt)) {
 		return false;
@@ -791,7 +817,7 @@
 
 bool MVKGraphicsPipeline::addTessCtlShaderToPipeline(MTLComputePipelineDescriptor* plDesc,
 													 const VkGraphicsPipelineCreateInfo* pCreateInfo,
-													 SPIRVToMSLConverterContext& shaderContext,
+													 SPIRVToMSLConversionConfiguration& shaderContext,
 													 std::vector<SPIRVShaderOutput>& vtxOutputs) {
 	shaderContext.options.entryPointStage = spv::ExecutionModelTessellationControl;
 	shaderContext.options.entryPointName = _pTessCtlSS->pName;
@@ -803,17 +829,22 @@
 	shaderContext.options.mslOptions.buffer_size_buffer_index = _bufferSizeBufferIndex.stages[kMVKShaderStageTessCtl];
 	shaderContext.options.mslOptions.capture_output_to_buffer = true;
 	addPrevStageOutputToShaderConverterContext(shaderContext, vtxOutputs);
-	id<MTLFunction> mtlFunction = ((MVKShaderModule*)_pTessCtlSS->module)->getMTLFunction(&shaderContext, _pTessCtlSS->pSpecializationInfo, _pipelineCache).mtlFunction;
-	if ( !mtlFunction ) {
+
+	MVKMTLFunction func = ((MVKShaderModule*)_pTessCtlSS->module)->getMTLFunction(&shaderContext, _pTessCtlSS->pSpecializationInfo, _pipelineCache);
+	id<MTLFunction> mtlFunc = func.getMTLFunction();
+	if ( !mtlFunc ) {
 		setConfigurationResult(reportError(VK_ERROR_INVALID_SHADER_NV, "Tessellation control shader function could not be compiled into pipeline. See previous logged error."));
 		return false;
 	}
-	plDesc.computeFunction = mtlFunction;
-	_needsTessCtlSwizzleBuffer = shaderContext.options.needsSwizzleBuffer;
-	_needsTessCtlBufferSizeBuffer = shaderContext.options.needsBufferSizeBuffer;
-	_needsTessCtlOutputBuffer = shaderContext.options.needsOutputBuffer;
-	_needsTessCtlPatchOutputBuffer = shaderContext.options.needsPatchOutputBuffer;
-	_needsTessCtlInput = shaderContext.options.needsInputThreadgroupMem;
+	plDesc.computeFunction = mtlFunc;
+
+	auto& funcRslts = func.shaderConversionResults;
+	_needsTessCtlSwizzleBuffer = funcRslts.needsSwizzleBuffer;
+	_needsTessCtlBufferSizeBuffer = funcRslts.needsBufferSizeBuffer;
+	_needsTessCtlOutputBuffer = funcRslts.needsOutputBuffer;
+	_needsTessCtlPatchOutputBuffer = funcRslts.needsPatchOutputBuffer;
+	_needsTessCtlInput = funcRslts.needsInputThreadgroupMem;
+
 	if (!verifyImplicitBuffer(_needsTessCtlSwizzleBuffer, _swizzleBufferIndex, kMVKShaderStageTessCtl, "swizzle", kMVKTessCtlNumReservedBuffers)) {
 		return false;
 	}
@@ -839,7 +870,7 @@
 
 bool MVKGraphicsPipeline::addTessEvalShaderToPipeline(MTLRenderPipelineDescriptor* plDesc,
 													  const VkGraphicsPipelineCreateInfo* pCreateInfo,
-													  SPIRVToMSLConverterContext& shaderContext,
+													  SPIRVToMSLConversionConfiguration& shaderContext,
 													  std::vector<SPIRVShaderOutput>& tcOutputs) {
 	shaderContext.options.entryPointStage = spv::ExecutionModelTessellationEvaluation;
 	shaderContext.options.entryPointName = _pTessEvalSS->pName;
@@ -848,16 +879,21 @@
 	shaderContext.options.mslOptions.capture_output_to_buffer = false;
 	shaderContext.options.mslOptions.disable_rasterization = (pCreateInfo->pRasterizationState && (pCreateInfo->pRasterizationState->rasterizerDiscardEnable));
 	addPrevStageOutputToShaderConverterContext(shaderContext, tcOutputs);
-	id<MTLFunction> mtlFunction = ((MVKShaderModule*)_pTessEvalSS->module)->getMTLFunction(&shaderContext, _pTessEvalSS->pSpecializationInfo, _pipelineCache).mtlFunction;
-	if ( !mtlFunction ) {
+
+	MVKMTLFunction func = ((MVKShaderModule*)_pTessEvalSS->module)->getMTLFunction(&shaderContext, _pTessEvalSS->pSpecializationInfo, _pipelineCache);
+	id<MTLFunction> mtlFunc = func.getMTLFunction();
+	if ( !mtlFunc ) {
 		setConfigurationResult(reportError(VK_ERROR_INVALID_SHADER_NV, "Tessellation evaluation shader function could not be compiled into pipeline. See previous logged error."));
 		return false;
 	}
 	// Yeah, you read that right. Tess. eval functions are a kind of vertex function in Metal.
-	plDesc.vertexFunction = mtlFunction;
-	plDesc.rasterizationEnabled = !shaderContext.options.mslOptions.disable_rasterization;
-	_needsTessEvalSwizzleBuffer = shaderContext.options.needsSwizzleBuffer;
-	_needsTessEvalBufferSizeBuffer = shaderContext.options.needsBufferSizeBuffer;
+	plDesc.vertexFunction = mtlFunc;
+
+	auto& funcRslts = func.shaderConversionResults;
+	plDesc.rasterizationEnabled = !funcRslts.isRasterizationDisabled;
+	_needsTessEvalSwizzleBuffer = funcRslts.needsSwizzleBuffer;
+	_needsTessEvalBufferSizeBuffer = funcRslts.needsBufferSizeBuffer;
+
 	if (!verifyImplicitBuffer(_needsTessEvalSwizzleBuffer, _swizzleBufferIndex, kMVKShaderStageTessEval, "swizzle", kMVKTessEvalNumReservedBuffers)) {
 		return false;
 	}
@@ -869,21 +905,25 @@
 
 bool MVKGraphicsPipeline::addFragmentShaderToPipeline(MTLRenderPipelineDescriptor* plDesc,
 													  const VkGraphicsPipelineCreateInfo* pCreateInfo,
-													  SPIRVToMSLConverterContext& shaderContext) {
+													  SPIRVToMSLConversionConfiguration& shaderContext) {
 	if (_pFragmentSS) {
 		shaderContext.options.entryPointStage = spv::ExecutionModelFragment;
 		shaderContext.options.mslOptions.swizzle_buffer_index = _swizzleBufferIndex.stages[kMVKShaderStageFragment];
 		shaderContext.options.mslOptions.buffer_size_buffer_index = _bufferSizeBufferIndex.stages[kMVKShaderStageFragment];
 		shaderContext.options.entryPointName = _pFragmentSS->pName;
 		shaderContext.options.mslOptions.capture_output_to_buffer = false;
-		id<MTLFunction> mtlFunction = ((MVKShaderModule*)_pFragmentSS->module)->getMTLFunction(&shaderContext, _pFragmentSS->pSpecializationInfo, _pipelineCache).mtlFunction;
-		if ( !mtlFunction ) {
+
+		MVKMTLFunction func = ((MVKShaderModule*)_pFragmentSS->module)->getMTLFunction(&shaderContext, _pFragmentSS->pSpecializationInfo, _pipelineCache);
+		id<MTLFunction> mtlFunc = func.getMTLFunction();
+		if ( !mtlFunc ) {
 			setConfigurationResult(reportError(VK_ERROR_INVALID_SHADER_NV, "Fragment shader function could not be compiled into pipeline. See previous logged error."));
 			return false;
 		}
-		plDesc.fragmentFunction = mtlFunction;
-		_needsFragmentSwizzleBuffer = shaderContext.options.needsSwizzleBuffer;
-		_needsFragmentBufferSizeBuffer = shaderContext.options.needsBufferSizeBuffer;
+		plDesc.fragmentFunction = mtlFunc;
+
+		auto& funcRslts = func.shaderConversionResults;
+		_needsFragmentSwizzleBuffer = funcRslts.needsSwizzleBuffer;
+		_needsFragmentBufferSizeBuffer = funcRslts.needsBufferSizeBuffer;
 		if (!verifyImplicitBuffer(_needsFragmentSwizzleBuffer, _swizzleBufferIndex, kMVKShaderStageFragment, "swizzle", 0)) {
 			return false;
 		}
@@ -896,7 +936,7 @@
 
 bool MVKGraphicsPipeline::addVertexInputToPipeline(MTLRenderPipelineDescriptor* plDesc,
 												   const VkPipelineVertexInputStateCreateInfo* pVI,
-												   const SPIRVToMSLConverterContext& shaderContext) {
+												   const SPIRVToMSLConversionConfiguration& shaderContext) {
     // Collect extension structures
     VkPipelineVertexInputDivisorStateCreateInfoEXT* pVertexInputDivisorState = nullptr;
     auto* next = (MVKVkAPIStructHeader*)pVI->pNext;
@@ -1080,7 +1120,7 @@
 }
 
 // Initializes the context used to prepare the MSL library used by this pipeline.
-void MVKGraphicsPipeline::initMVKShaderConverterContext(SPIRVToMSLConverterContext& shaderContext,
+void MVKGraphicsPipeline::initMVKShaderConverterContext(SPIRVToMSLConversionConfiguration& shaderContext,
                                                         const VkGraphicsPipelineCreateInfo* pCreateInfo,
                                                         const SPIRVTessReflectionData& reflectData) {
 
@@ -1102,6 +1142,7 @@
 
     shaderContext.options.mslOptions.msl_version = _device->_pMetalFeatures->mslVersion;
     shaderContext.options.mslOptions.texel_buffer_texture_width = _device->_pMetalFeatures->maxTextureDimension;
+	shaderContext.options.mslOptions.texture_buffer_native = _device->_pMetalFeatures->textureBuffers;
 
     MVKPipelineLayout* layout = (MVKPipelineLayout*)pCreateInfo->layout;
     layout->populateShaderConverterContext(shaderContext);
@@ -1122,7 +1163,7 @@
 }
 
 // Initializes the vertex attributes in a shader converter context.
-void MVKGraphicsPipeline::addVertexInputToShaderConverterContext(SPIRVToMSLConverterContext& shaderContext,
+void MVKGraphicsPipeline::addVertexInputToShaderConverterContext(SPIRVToMSLConversionConfiguration& shaderContext,
                                                                  const VkGraphicsPipelineCreateInfo* pCreateInfo) {
     // Set the shader context vertex attribute information
     shaderContext.vertexAttributes.clear();
@@ -1186,7 +1227,7 @@
 }
 
 // Initializes the vertex attributes in a shader converter context from the previous stage output.
-void MVKGraphicsPipeline::addPrevStageOutputToShaderConverterContext(SPIRVToMSLConverterContext& shaderContext,
+void MVKGraphicsPipeline::addPrevStageOutputToShaderConverterContext(SPIRVToMSLConversionConfiguration& shaderContext,
                                                                      std::vector<SPIRVShaderOutput>& shaderOutputs) {
     // Set the shader context vertex attribute information
     shaderContext.vertexAttributes.clear();
@@ -1250,14 +1291,17 @@
 MVKComputePipeline::MVKComputePipeline(MVKDevice* device,
 									   MVKPipelineCache* pipelineCache,
 									   MVKPipeline* parent,
-									   const VkComputePipelineCreateInfo* pCreateInfo) : MVKPipeline(device, pipelineCache, parent) {
-	MVKMTLFunction shaderFunc = getMTLFunction(pCreateInfo);
-	_mtlThreadgroupSize = shaderFunc.threadGroupSize;
+									   const VkComputePipelineCreateInfo* pCreateInfo) :
+	MVKPipeline(device, pipelineCache, (MVKPipelineLayout*)pCreateInfo->layout, parent) {
+
+	MVKMTLFunction func = getMTLFunction(pCreateInfo);
+	_mtlThreadgroupSize = func.threadGroupSize;
 	_mtlPipelineState = nil;
 
-	if (shaderFunc.mtlFunction) {
-		MTLComputePipelineDescriptor* plDesc = [[MTLComputePipelineDescriptor new] autorelease];
-		plDesc.computeFunction = shaderFunc.mtlFunction;
+	id<MTLFunction> mtlFunc = func.getMTLFunction();
+	if (mtlFunc) {
+		MTLComputePipelineDescriptor* plDesc = [MTLComputePipelineDescriptor new];	// temp retain
+		plDesc.computeFunction = mtlFunc;
 
 		// Metal does not allow the name of the pipeline to be changed after it has been created,
 		// and we need to create the Metal pipeline immediately to provide error feedback to app.
@@ -1267,6 +1311,8 @@
 		MVKComputePipelineCompiler* plc = new MVKComputePipelineCompiler(this);
 		_mtlPipelineState = plc->newMTLComputePipelineState(plDesc);	// retained
 		plc->destroy();
+		[plDesc release];															// temp release
+
 		if ( !_mtlPipelineState ) { _hasValidMTLPipelineStates = false; }
 	} else {
 		setConfigurationResult(reportError(VK_ERROR_INVALID_SHADER_NV, "Compute shader function could not be compiled into pipeline. See previous logged error."));
@@ -1284,14 +1330,15 @@
 MVKMTLFunction MVKComputePipeline::getMTLFunction(const VkComputePipelineCreateInfo* pCreateInfo) {
 
     const VkPipelineShaderStageCreateInfo* pSS = &pCreateInfo->stage;
-    if ( !mvkAreFlagsEnabled(pSS->stage, VK_SHADER_STAGE_COMPUTE_BIT) ) { return MVKMTLFunctionNull; }
+    if ( !mvkAreAllFlagsEnabled(pSS->stage, VK_SHADER_STAGE_COMPUTE_BIT) ) { return MVKMTLFunctionNull; }
 
-    SPIRVToMSLConverterContext shaderContext;
+    SPIRVToMSLConversionConfiguration shaderContext;
 	shaderContext.options.entryPointName = pCreateInfo->stage.pName;
 	shaderContext.options.entryPointStage = spv::ExecutionModelGLCompute;
     shaderContext.options.mslOptions.msl_version = _device->_pMetalFeatures->mslVersion;
     shaderContext.options.mslOptions.texel_buffer_texture_width = _device->_pMetalFeatures->maxTextureDimension;
 	shaderContext.options.mslOptions.swizzle_texture_samples = _fullImageViewSwizzle;
+	shaderContext.options.mslOptions.texture_buffer_native = _device->_pMetalFeatures->textureBuffers;
 
     MVKPipelineLayout* layout = (MVKPipelineLayout*)pCreateInfo->layout;
     layout->populateShaderConverterContext(shaderContext);
@@ -1300,11 +1347,13 @@
     shaderContext.options.mslOptions.swizzle_buffer_index = _swizzleBufferIndex.stages[kMVKShaderStageCompute];
     shaderContext.options.mslOptions.buffer_size_buffer_index = _bufferSizeBufferIndex.stages[kMVKShaderStageCompute];
 
-    MVKShaderModule* mvkShdrMod = (MVKShaderModule*)pSS->module;
-    MVKMTLFunction func = mvkShdrMod->getMTLFunction(&shaderContext, pSS->pSpecializationInfo, _pipelineCache);
-    _needsSwizzleBuffer = shaderContext.options.needsSwizzleBuffer;
-    _needsBufferSizeBuffer = shaderContext.options.needsBufferSizeBuffer;
-    return func;
+    MVKMTLFunction func = ((MVKShaderModule*)pSS->module)->getMTLFunction(&shaderContext, pSS->pSpecializationInfo, _pipelineCache);
+
+	auto& funcRslts = func.shaderConversionResults;
+	_needsSwizzleBuffer = funcRslts.needsSwizzleBuffer;
+    _needsBufferSizeBuffer = funcRslts.needsBufferSizeBuffer;
+
+	return func;
 }
 
 MVKComputePipeline::~MVKComputePipeline() {
@@ -1316,7 +1365,7 @@
 #pragma mark MVKPipelineCache
 
 // Return a shader library from the specified shader context sourced from the specified shader module.
-MVKShaderLibrary* MVKPipelineCache::getShaderLibrary(SPIRVToMSLConverterContext* pContext, MVKShaderModule* shaderModule) {
+MVKShaderLibrary* MVKPipelineCache::getShaderLibrary(SPIRVToMSLConversionConfiguration* pContext, MVKShaderModule* shaderModule) {
 	lock_guard<mutex> lock(_shaderCacheLock);
 
 	bool wasAdded = false;
@@ -1358,9 +1407,9 @@
 	friend MVKPipelineCache;
 
 	bool next() { return (++_index < (_pSLCache ? _pSLCache->_shaderLibraries.size() : 0)); }
-	SPIRVToMSLConverterContext& getShaderContext() { return _pSLCache->_shaderLibraries[_index].first; }
+	SPIRVToMSLConversionConfiguration& getShaderConversionConfig() { return _pSLCache->_shaderLibraries[_index].first; }
 	std::string& getMSL() { return _pSLCache->_shaderLibraries[_index].second->_msl; }
-	SPIRVEntryPoint& getEntryPoint() { return _pSLCache->_shaderLibraries[_index].second->_entryPoint; }
+	SPIRVToMSLConversionResults& getShaderConversionResults() { return _pSLCache->_shaderLibraries[_index].second->_shaderConversionResults; }
 	MVKShaderCacheIterator(MVKShaderLibraryCache* pSLCache) : _pSLCache(pSLCache) {}
 
 	MVKShaderLibraryCache* _pSLCache;
@@ -1410,7 +1459,7 @@
 // Serializes the data in this cache to a stream
 void MVKPipelineCache::writeData(ostream& outstream, bool isCounting) {
 
-	MVKPerformanceTracker& shaderCompilationEvent = isCounting
+	MVKPerformanceTracker& activityTracker = isCounting
 		? _device->_performanceStatistics.pipelineCache.sizePipelineCache
 		: _device->_performanceStatistics.pipelineCache.writePipelineCache;
 
@@ -1435,10 +1484,10 @@
 			uint64_t startTime = _device->getPerformanceTimestamp();
 			writer(cacheEntryType);
 			writer(smKey);
-			writer(cacheIter.getShaderContext());
-			writer(cacheIter.getEntryPoint());
+			writer(cacheIter.getShaderConversionConfig());
+			writer(cacheIter.getShaderConversionResults());
 			writer(cacheIter.getMSL());
-			_device->addActivityPerformance(shaderCompilationEvent, startTime);
+			_device->addActivityPerformance(activityTracker, startTime);
 		}
 	}
 
@@ -1492,11 +1541,11 @@
 					MVKShaderModuleKey smKey;
 					reader(smKey);
 
-					SPIRVToMSLConverterContext shaderContext;
-					reader(shaderContext);
+					SPIRVToMSLConversionConfiguration shaderConversionConfig;
+					reader(shaderConversionConfig);
 
-					SPIRVEntryPoint entryPoint;
-					reader(entryPoint);
+					SPIRVToMSLConversionResults shaderConversionResults;
+					reader(shaderConversionResults);
 
 					string msl;
 					reader(msl);
@@ -1504,7 +1553,7 @@
 					// Add the shader library to the staging cache.
 					MVKShaderLibraryCache* slCache = getShaderLibraryCache(smKey);
 					_device->addActivityPerformance(_device->_performanceStatistics.pipelineCache.readPipelineCache, startTime);
-					slCache->addShaderLibrary(&shaderContext, msl, entryPoint);
+					slCache->addShaderLibrary(&shaderConversionConfig, msl, shaderConversionResults);
 
 					break;
 				}
@@ -1625,18 +1674,13 @@
 	}
 
 	template<class Archive>
-	void serialize(Archive & archive, SPIRVToMSLConverterOptions& opt) {
+	void serialize(Archive & archive, SPIRVToMSLConversionOptions& opt) {
 		archive(opt.mslOptions,
 				opt.entryPointName,
 				opt.entryPointStage,
 				opt.tessPatchKind,
 				opt.numTessControlPoints,
-				opt.shouldFlipVertexY,
-				opt.needsSwizzleBuffer,
-				opt.needsOutputBuffer,
-				opt.needsPatchOutputBuffer,
-				opt.needsBufferSizeBuffer,
-				opt.needsInputThreadgroupMem);
+				opt.shouldFlipVertexY);
 	}
 
 	template<class Archive>
@@ -1654,10 +1698,21 @@
 	}
 
 	template<class Archive>
-	void serialize(Archive & archive, SPIRVToMSLConverterContext& ctx) {
+	void serialize(Archive & archive, SPIRVToMSLConversionConfiguration& ctx) {
 		archive(ctx.options, ctx.vertexAttributes, ctx.resourceBindings);
 	}
 
+	template<class Archive>
+	void serialize(Archive & archive, SPIRVToMSLConversionResults& scr) {
+		archive(scr.entryPoint,
+				scr.isRasterizationDisabled,
+				scr.needsSwizzleBuffer,
+				scr.needsOutputBuffer,
+				scr.needsPatchOutputBuffer,
+				scr.needsBufferSizeBuffer,
+				scr.needsInputThreadgroupMem);
+	}
+
 }
 
 template<class Archive>
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm
index 1b5e77b..0090244 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm
@@ -71,7 +71,7 @@
 
 	uint32_t endQuery = firstQuery + queryCount;
 
-	if (mvkAreFlagsEnabled(flags, VK_QUERY_RESULT_WAIT_BIT)) {
+	if (mvkAreAllFlagsEnabled(flags, VK_QUERY_RESULT_WAIT_BIT)) {
 		_availabilityBlocker.wait(lock, [this, firstQuery, endQuery]{
 			return areQueriesHostAvailable(firstQuery, endQuery);
 		});
@@ -104,14 +104,14 @@
 VkResult MVKQueryPool::getResult(uint32_t query, void* pQryData, VkQueryResultFlags flags) {
 
 	bool isAvailable = _availability[query] == Available;
-	bool shouldOutput = (isAvailable || mvkAreFlagsEnabled(flags, VK_QUERY_RESULT_PARTIAL_BIT));
-	bool shouldOutput64Bit = mvkAreFlagsEnabled(flags, VK_QUERY_RESULT_64_BIT);
+	bool shouldOutput = (isAvailable || mvkAreAllFlagsEnabled(flags, VK_QUERY_RESULT_PARTIAL_BIT));
+	bool shouldOutput64Bit = mvkAreAllFlagsEnabled(flags, VK_QUERY_RESULT_64_BIT);
 
 	// Output the results of this query
 	if (shouldOutput) { getResult(query, pQryData, shouldOutput64Bit); }
 
 	// If requested, output the availability bit
-	if (mvkAreFlagsEnabled(flags, VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)) {
+	if (mvkAreAllFlagsEnabled(flags, VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)) {
 		if (shouldOutput64Bit) {
 			uintptr_t pAvailability = (uintptr_t)pQryData + (_queryElementCount * sizeof(uint64_t));
 			*(uint64_t*)pAvailability = isAvailable;
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueue.h b/MoltenVK/MoltenVK/GPUObjects/MVKQueue.h
index b661f64..7e326f6 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKQueue.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueue.h
@@ -184,6 +184,7 @@
 	MVKQueueSubmission* _next;
 	MVKVectorInline<MVKSemaphore*, 8> _waitSemaphores;
 	bool _isAwaitingSemaphores;
+	bool _trackPerformance;
 };
 
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueue.mm b/MoltenVK/MoltenVK/GPUObjects/MVKQueue.mm
index ecffbdb..6a8647d 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKQueue.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueue.mm
@@ -65,13 +65,13 @@
 
 #pragma mark Queue submissions
 
-// Execute the queue submission under an autorelease pool to ensure transient Metal objects are autoreleased.
+// Execute the queue submission under an autoreleasepool to ensure transient Metal objects are autoreleased.
 // This is critical for apps that don't use standard OS autoreleasing runloop threading.
 static inline void execute(MVKQueueSubmission* qSubmit) { @autoreleasepool { qSubmit->execute(); } }
 
 // Executes the submmission, either immediately, or by dispatching to an execution queue.
-// Submissions to the execution queue are wrapped in a dedicated autorelease pool.
-// Relying on the dispatch queue to find time to drain the autorelease pool can
+// Submissions to the execution queue are wrapped in a dedicated autoreleasepool.
+// Relying on the dispatch queue to find time to drain the autoreleasepool can
 // result in significant memory creep under heavy workloads.
 VkResult MVKQueue::submit(MVKQueueSubmission* qSubmit) {
 	if ( !qSubmit ) { return VK_SUCCESS; }     // Ignore nils
@@ -202,8 +202,9 @@
 									   uint32_t waitSemaphoreCount,
 									   const VkSemaphore* pWaitSemaphores) {
 	_queue = queue;
-	_prev = VK_NULL_HANDLE;
-	_next = VK_NULL_HANDLE;
+	_prev = nullptr;
+	_next = nullptr;
+	_trackPerformance = _queue->_device->_pMVKConfig->performanceTracking;
 
 	_isAwaitingSemaphores = waitSemaphoreCount > 0;
 	_waitSemaphores.reserve(waitSemaphoreCount);
@@ -280,9 +281,13 @@
 		for (auto& ws : _waitSemaphores) { ws->wait(); }
 	}
 
-	if (signalCompletion) {
+	MVKDevice* mkvDev = _queue->_device;
+	uint64_t startTime = mkvDev->getPerformanceTimestamp();
+
+	if (signalCompletion || _trackPerformance) {
 		[_activeMTLCommandBuffer addCompletedHandler: ^(id<MTLCommandBuffer> mtlCmdBuff) {
-			this->finish();
+			_queue->_device->addActivityPerformance(mkvDev->_performanceStatistics.queue.mtlCommandBufferCompletion, startTime);
+			if (signalCompletion) { this->finish(); }
 		}];
 	}
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
index d53a4ec..d9a8f84 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
@@ -38,14 +38,23 @@
 #pragma mark -
 #pragma mark MVKShaderLibrary
 
-/** Specifies the SPIRV LocalSize, which is the number of threads in a compute shader workgroup. */
-typedef struct {
-    id<MTLFunction> mtlFunction;
-    MTLSize threadGroupSize;
+/** A MTLFunction and corresponding result information resulting from a shader conversion. */
+typedef struct MVKMTLFunction {
+	SPIRVToMSLConversionResults shaderConversionResults;
+	MTLSize threadGroupSize;
+	inline id<MTLFunction> getMTLFunction() { return _mtlFunction; }
+
+	MVKMTLFunction(id<MTLFunction> mtlFunc, const SPIRVToMSLConversionResults scRslts, MTLSize tgSize);
+	MVKMTLFunction(const MVKMTLFunction& other);
+	~MVKMTLFunction();
+
+private:
+	id<MTLFunction> _mtlFunction;
+
 } MVKMTLFunction;
 
 /** A MVKMTLFunction indicating an invalid MTLFunction. The mtlFunction member is nil. */
-extern const MVKMTLFunction MVKMTLFunctionNull;
+const MVKMTLFunction MVKMTLFunctionNull(nil, SPIRVToMSLConversionResults(), MTLSizeMake(1, 1, 1));
 
 /** Wraps a single MTLLibrary. */
 class MVKShaderLibrary : public MVKBaseObject {
@@ -55,13 +64,28 @@
 	/** Returns the Vulkan API opaque object controlling this object. */
 	MVKVulkanAPIObject* getVulkanAPIObject() override { return _owner->getVulkanAPIObject(); };
 
-    /** Sets the number of threads in a single compute kernel workgroup, per dimension. */
+	/**
+	 * Sets the entry point function name.
+	 *
+	 * This is usually set automatically during shader conversion from SPIR-V to MSL.
+	 * For a library that was created directly from MSL, this function can be used to
+	 * set the name of the function if it has a different name than the default main0().
+	 */
+	void setEntryPointName(std::string& funcName);
+
+    /**
+	 * Sets the number of threads in a single compute kernel workgroup, per dimension.
+	 *
+	 * This is usually set automatically during shader conversion from SPIR-V to MSL.
+	 * For a library that was created directly from MSL, this function can be used to
+	 * set the workgroup size..
+	 */
     void setWorkgroupSize(uint32_t x, uint32_t y, uint32_t z);
     
 	/** Constructs an instance from the specified MSL source code. */
 	MVKShaderLibrary(MVKVulkanAPIDeviceObject* owner,
 					 const std::string& mslSourceCode,
-					 const SPIRVEntryPoint& entryPoint);
+					 const SPIRVToMSLConversionResults& shaderConversionResults);
 
 	/** Constructs an instance from the specified compiled MSL code data. */
 	MVKShaderLibrary(MVKVulkanAPIDeviceObject* owner,
@@ -69,7 +93,7 @@
 					 size_t mslCompiledCodeLength);
 
 	/** Copy constructor. */
-	MVKShaderLibrary(MVKShaderLibrary& other);
+	MVKShaderLibrary(const MVKShaderLibrary& other);
 
 	~MVKShaderLibrary() override;
 
@@ -84,7 +108,7 @@
 
 	MVKVulkanAPIDeviceObject* _owner;
 	id<MTLLibrary> _mtlLibrary;
-	SPIRVEntryPoint _entryPoint;
+	SPIRVToMSLConversionResults _shaderConversionResults;
 	std::string _msl;
 };
 
@@ -107,7 +131,7 @@
 	 * If pWasAdded is not nil, this function will set it to true if a new shader library was created,
 	 * and to false if an existing shader library was found and returned.
 	 */
-	MVKShaderLibrary* getShaderLibrary(SPIRVToMSLConverterContext* pContext,
+	MVKShaderLibrary* getShaderLibrary(SPIRVToMSLConversionConfiguration* pContext,
 									   MVKShaderModule* shaderModule,
 									   bool* pWasAdded = nullptr);
 
@@ -120,14 +144,14 @@
 	friend MVKPipelineCache;
 	friend MVKShaderModule;
 
-	MVKShaderLibrary* findShaderLibrary(SPIRVToMSLConverterContext* pContext);
-	MVKShaderLibrary* addShaderLibrary(SPIRVToMSLConverterContext* pContext,
+	MVKShaderLibrary* findShaderLibrary(SPIRVToMSLConversionConfiguration* pContext);
+	MVKShaderLibrary* addShaderLibrary(SPIRVToMSLConversionConfiguration* pContext,
 									   const std::string& mslSourceCode,
-									   const SPIRVEntryPoint& entryPoint);
+									   const SPIRVToMSLConversionResults& shaderConversionResults);
 	void merge(MVKShaderLibraryCache* other);
 
 	MVKVulkanAPIDeviceObject* _owner;
-	std::vector<std::pair<SPIRVToMSLConverterContext, MVKShaderLibrary*>> _shaderLibraries;
+	std::vector<std::pair<SPIRVToMSLConversionConfiguration, MVKShaderLibrary*>> _shaderLibraries;
 };
 
 
@@ -168,12 +192,12 @@
 	VkDebugReportObjectTypeEXT getVkDebugReportObjectType() override { return VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT; }
 
 	/** Returns the Metal shader function, possibly specialized. */
-	MVKMTLFunction getMTLFunction(SPIRVToMSLConverterContext* pContext,
+	MVKMTLFunction getMTLFunction(SPIRVToMSLConversionConfiguration* pContext,
 								  const VkSpecializationInfo* pSpecializationInfo,
 								  MVKPipelineCache* pipelineCache);
 
 	/** Convert the SPIR-V to MSL, using the specified shader conversion context. */
-	bool convert(SPIRVToMSLConverterContext* pContext);
+	bool convert(SPIRVToMSLConversionConfiguration* pContext);
 
 	/** Returns the original SPIR-V code that was specified when this object was created. */
 	const std::vector<uint32_t>& getSPIRV() { return _spvConverter.getSPIRV(); }
@@ -184,12 +208,9 @@
 	 */
 	const std::string& getMSL() { return _spvConverter.getMSL(); }
 
-	/**
-	 * Returns information about the shader entry point as converted by the most recent
-	 * call to convert() function, or set directly using the setMSL() function.
-	 */
-	const SPIRVEntryPoint& getEntryPoint() { return _spvConverter.getEntryPoint(); }
-    
+	/** Returns information about the shader conversion results. */
+	const SPIRVToMSLConversionResults& getConversionResults() { return _spvConverter.getConversionResults(); }
+
     /** Sets the number of threads in a single compute kernel workgroup, per dimension. */
     void setWorkgroupSize(uint32_t x, uint32_t y, uint32_t z);
     
@@ -204,12 +225,12 @@
 	friend MVKShaderCacheIterator;
 
 	void propogateDebugName() override {}
-	MVKGLSLConversionShaderStage getMVKGLSLConversionShaderStage(SPIRVToMSLConverterContext* pContext);
+	MVKGLSLConversionShaderStage getMVKGLSLConversionShaderStage(SPIRVToMSLConversionConfiguration* pContext);
 
 	MVKShaderLibraryCache _shaderLibraryCache;
 	SPIRVToMSLConverter _spvConverter;
 	GLSLToSPIRVConverter _glslConverter;
-	MVKShaderLibrary* _defaultLibrary;
+	MVKShaderLibrary* _directMSLLibrary;
 	MVKShaderModuleKey _key;
     std::mutex _accessLock;
 };
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm
index 426670a..aa0823f 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm
@@ -26,7 +26,22 @@
 using namespace std;
 
 
-const MVKMTLFunction MVKMTLFunctionNull = { nil, MTLSizeMake(1, 1, 1) };
+MVKMTLFunction::MVKMTLFunction(id<MTLFunction> mtlFunc, const SPIRVToMSLConversionResults scRslts, MTLSize tgSize) {
+	_mtlFunction = [mtlFunc retain];		// retained
+	shaderConversionResults = scRslts;
+	threadGroupSize = tgSize;
+}
+
+MVKMTLFunction::MVKMTLFunction(const MVKMTLFunction& other) {
+	_mtlFunction = [other._mtlFunction retain];		// retained
+	shaderConversionResults = other.shaderConversionResults;
+	threadGroupSize = other.threadGroupSize;
+}
+
+MVKMTLFunction::~MVKMTLFunction() {
+	[_mtlFunction release];
+}
+
 
 #pragma mark -
 #pragma mark MVKShaderLibrary
@@ -42,7 +57,6 @@
 			}
 		}
 	}
-
 	return wgDim.size;
 }
 
@@ -50,56 +64,65 @@
 
     if ( !_mtlLibrary ) { return MVKMTLFunctionNull; }
 
-    NSString* mtlFuncName = @(_entryPoint.mtlFunctionName.c_str());
-	MVKDevice* mvkDev = _owner->getDevice();
-    uint64_t startTime = mvkDev->getPerformanceTimestamp();
-    id<MTLFunction> mtlFunc = [[_mtlLibrary newFunctionWithName: mtlFuncName] autorelease];
-    mvkDev->addActivityPerformance(mvkDev->_performanceStatistics.shaderCompilation.functionRetrieval, startTime);
+	id<MTLFunction> mtlFunc = nil;
+	@autoreleasepool {
+		NSString* mtlFuncName = @(_shaderConversionResults.entryPoint.mtlFunctionName.c_str());
+		MVKDevice* mvkDev = _owner->getDevice();
+		uint64_t startTime = mvkDev->getPerformanceTimestamp();
+		mtlFunc = [_mtlLibrary newFunctionWithName: mtlFuncName];								// temp retain
+		mvkDev->addActivityPerformance(mvkDev->_performanceStatistics.shaderCompilation.functionRetrieval, startTime);
 
-    if (mtlFunc) {
-        // If the Metal device supports shader specialization, and the Metal function expects to be
-        // specialized, populate Metal function constant values from the Vulkan specialization info,
-        // and compiled a specialized Metal function, otherwise simply use the unspecialized Metal function.
-        if (mvkDev->_pMetalFeatures->shaderSpecialization) {
-            NSArray<MTLFunctionConstant*>* mtlFCs = mtlFunc.functionConstantsDictionary.allValues;
-            if (mtlFCs.count) {
-                // The Metal shader contains function constants and expects to be specialized
-                // Populate the Metal function constant values from the Vulkan specialization info.
-                MTLFunctionConstantValues* mtlFCVals = [[MTLFunctionConstantValues new] autorelease];
-                if (pSpecializationInfo) {
-                    // Iterate through the provided Vulkan specialization entries, and populate the
-                    // Metal function constant value that matches the Vulkan specialization constantID.
-                    for (uint32_t specIdx = 0; specIdx < pSpecializationInfo->mapEntryCount; specIdx++) {
-                        const VkSpecializationMapEntry* pMapEntry = &pSpecializationInfo->pMapEntries[specIdx];
-                        NSUInteger mtlFCIndex = pMapEntry->constantID;
-                        MTLFunctionConstant* mtlFC = getFunctionConstant(mtlFCs, mtlFCIndex);
-                        if (mtlFC) {
-                            [mtlFCVals setConstantValue: &(((char*)pSpecializationInfo->pData)[pMapEntry->offset])
-                                                   type: mtlFC.type
-                                                atIndex: mtlFCIndex];
-                        }
-                    }
-                }
+		if (mtlFunc) {
+			// If the Metal device supports shader specialization, and the Metal function expects to be
+			// specialized, populate Metal function constant values from the Vulkan specialization info,
+			// and compiled a specialized Metal function, otherwise simply use the unspecialized Metal function.
+			if (mvkDev->_pMetalFeatures->shaderSpecialization) {
+				NSArray<MTLFunctionConstant*>* mtlFCs = mtlFunc.functionConstantsDictionary.allValues;
+				if (mtlFCs.count) {
+					// The Metal shader contains function constants and expects to be specialized
+					// Populate the Metal function constant values from the Vulkan specialization info.
+					MTLFunctionConstantValues* mtlFCVals = [MTLFunctionConstantValues new];		// temp retain
+					if (pSpecializationInfo) {
+						// Iterate through the provided Vulkan specialization entries, and populate the
+						// Metal function constant value that matches the Vulkan specialization constantID.
+						for (uint32_t specIdx = 0; specIdx < pSpecializationInfo->mapEntryCount; specIdx++) {
+							const VkSpecializationMapEntry* pMapEntry = &pSpecializationInfo->pMapEntries[specIdx];
+							NSUInteger mtlFCIndex = pMapEntry->constantID;
+							MTLFunctionConstant* mtlFC = getFunctionConstant(mtlFCs, mtlFCIndex);
+							if (mtlFC) {
+								[mtlFCVals setConstantValue: &(((char*)pSpecializationInfo->pData)[pMapEntry->offset])
+													   type: mtlFC.type
+													atIndex: mtlFCIndex];
+							}
+						}
+					}
 
-                // Compile the specialized Metal function, and use it instead of the unspecialized Metal function.
-				MVKFunctionSpecializer* fs = new MVKFunctionSpecializer(_owner);
-				mtlFunc = [fs->newMTLFunction(_mtlLibrary, mtlFuncName, mtlFCVals) autorelease];
-				fs->destroy();
-            }
-        }
-    } else {
-        reportError(VK_ERROR_INVALID_SHADER_NV, "Shader module does not contain an entry point named '%s'.", mtlFuncName.UTF8String);
-    }
+					// Compile the specialized Metal function, and use it instead of the unspecialized Metal function.
+					MVKFunctionSpecializer* fs = new MVKFunctionSpecializer(_owner);
+					[mtlFunc release];															// temp release
+					mtlFunc = fs->newMTLFunction(_mtlLibrary, mtlFuncName, mtlFCVals);			// temp retain
+					fs->destroy();
+					[mtlFCVals release];														// temp release
+				}
+			}
+		} else {
+			reportError(VK_ERROR_INVALID_SHADER_NV, "Shader module does not contain an entry point named '%s'.", mtlFuncName.UTF8String);
+		}
 
-	// Set the debug name. First try name of shader module, otherwise try name of owner.
-	NSString* dbName = shaderModule-> getDebugName();
-	if ( !dbName ) { dbName = _owner-> getDebugName(); }
-	setLabelIfNotNil(mtlFunc, dbName);
+		// Set the debug name. First try name of shader module, otherwise try name of owner.
+		NSString* dbName = shaderModule-> getDebugName();
+		if ( !dbName ) { dbName = _owner-> getDebugName(); }
+		setLabelIfNotNil(mtlFunc, dbName);
+	}
 
-	return { mtlFunc, MTLSizeMake(getWorkgroupDimensionSize(_entryPoint.workgroupSize.width, pSpecializationInfo),
-								  getWorkgroupDimensionSize(_entryPoint.workgroupSize.height, pSpecializationInfo),
-								  getWorkgroupDimensionSize(_entryPoint.workgroupSize.depth, pSpecializationInfo)) };
+	auto& wgSize = _shaderConversionResults.entryPoint.workgroupSize;
 
+	MVKMTLFunction mvkMTLFunc(mtlFunc, _shaderConversionResults, MTLSizeMake(getWorkgroupDimensionSize(wgSize.width, pSpecializationInfo),
+																			 getWorkgroupDimensionSize(wgSize.height, pSpecializationInfo),
+																			 getWorkgroupDimensionSize(wgSize.depth, pSpecializationInfo)));
+	[mtlFunc release];																			// temp release
+
+	return mvkMTLFunc;
 }
 
 // Returns the MTLFunctionConstant with the specified ID from the specified array of function constants.
@@ -109,12 +132,29 @@
     return nil;
 }
 
-MVKShaderLibrary::MVKShaderLibrary(MVKVulkanAPIDeviceObject* owner, const string& mslSourceCode, const SPIRVEntryPoint& entryPoint) : _owner(owner) {
+void MVKShaderLibrary::setEntryPointName(string& funcName) {
+	_shaderConversionResults.entryPoint.mtlFunctionName = funcName;
+}
+
+void MVKShaderLibrary::setWorkgroupSize(uint32_t x, uint32_t y, uint32_t z) {
+	auto& wgSize = _shaderConversionResults.entryPoint.workgroupSize;
+	wgSize.width.size = x;
+	wgSize.height.size = y;
+	wgSize.depth.size = z;
+}
+
+MVKShaderLibrary::MVKShaderLibrary(MVKVulkanAPIDeviceObject* owner,
+								   const string& mslSourceCode,
+								   const SPIRVToMSLConversionResults& shaderConversionResults) : _owner(owner) {
 	MVKShaderLibraryCompiler* slc = new MVKShaderLibraryCompiler(_owner);
-	_mtlLibrary = slc->newMTLLibrary(@(mslSourceCode.c_str()));	// retained
+
+	NSString* nsSrc = [[NSString alloc] initWithUTF8String: mslSourceCode.c_str()];	// temp retained
+	_mtlLibrary = slc->newMTLLibrary(nsSrc);	// retained
+	[nsSrc release];	// release temp string
+
 	slc->destroy();
 
-	_entryPoint = entryPoint;
+	_shaderConversionResults = shaderConversionResults;
 	_msl = mslSourceCode;
 }
 
@@ -136,9 +176,9 @@
     mvkDev->addActivityPerformance(mvkDev->_performanceStatistics.shaderCompilation.mslLoad, startTime);
 }
 
-MVKShaderLibrary::MVKShaderLibrary(MVKShaderLibrary& other) : _owner(other._owner) {
+MVKShaderLibrary::MVKShaderLibrary(const MVKShaderLibrary& other) : _owner(other._owner) {
 	_mtlLibrary = [other._mtlLibrary retain];
-	_entryPoint = other._entryPoint;
+	_shaderConversionResults = other._shaderConversionResults;
 	_msl = other._msl;
 }
 
@@ -158,12 +198,6 @@
     }
 }
 
-void MVKShaderLibrary::setWorkgroupSize(uint32_t x, uint32_t y, uint32_t z) {
-    _entryPoint.workgroupSize.width.size = x;
-    _entryPoint.workgroupSize.height.size = y;
-    _entryPoint.workgroupSize.depth.size = z;
-}
-
 MVKShaderLibrary::~MVKShaderLibrary() {
 	[_mtlLibrary release];
 }
@@ -172,14 +206,14 @@
 #pragma mark -
 #pragma mark MVKShaderLibraryCache
 
-MVKShaderLibrary* MVKShaderLibraryCache::getShaderLibrary(SPIRVToMSLConverterContext* pContext,
+MVKShaderLibrary* MVKShaderLibraryCache::getShaderLibrary(SPIRVToMSLConversionConfiguration* pContext,
 														  MVKShaderModule* shaderModule,
 														  bool* pWasAdded) {
 	bool wasAdded = false;
 	MVKShaderLibrary* shLib = findShaderLibrary(pContext);
 	if ( !shLib ) {
 		if (shaderModule->convert(pContext)) {
-			shLib = addShaderLibrary(pContext, shaderModule->getMSL(), shaderModule->getEntryPoint());
+			shLib = addShaderLibrary(pContext, shaderModule->getMSL(), shaderModule->getConversionResults());
 			wasAdded = true;
 		}
 	}
@@ -191,7 +225,7 @@
 
 // Finds and returns a shader library matching the specified context, or returns nullptr if it doesn't exist.
 // If a match is found, the specified context is aligned with the context of the matching library.
-MVKShaderLibrary* MVKShaderLibraryCache::findShaderLibrary(SPIRVToMSLConverterContext* pContext) {
+MVKShaderLibrary* MVKShaderLibraryCache::findShaderLibrary(SPIRVToMSLConversionConfiguration* pContext) {
 	for (auto& slPair : _shaderLibraries) {
 		if (slPair.first.matches(*pContext)) {
 			pContext->alignWith(slPair.first);
@@ -202,10 +236,10 @@
 }
 
 // Adds and returns a new shader library configured from the specified context.
-MVKShaderLibrary* MVKShaderLibraryCache::addShaderLibrary(SPIRVToMSLConverterContext* pContext,
+MVKShaderLibrary* MVKShaderLibraryCache::addShaderLibrary(SPIRVToMSLConversionConfiguration* pContext,
 														  const string& mslSourceCode,
-														  const SPIRVEntryPoint& entryPoint) {
-	MVKShaderLibrary* shLib = new MVKShaderLibrary(_owner, mslSourceCode, entryPoint);
+														  const SPIRVToMSLConversionResults& shaderConversionResults) {
+	MVKShaderLibrary* shLib = new MVKShaderLibrary(_owner, mslSourceCode, shaderConversionResults);
 	_shaderLibraries.emplace_back(*pContext, shLib);
 	return shLib;
 }
@@ -228,12 +262,12 @@
 #pragma mark -
 #pragma mark MVKShaderModule
 
-MVKMTLFunction MVKShaderModule::getMTLFunction(SPIRVToMSLConverterContext* pContext,
+MVKMTLFunction MVKShaderModule::getMTLFunction(SPIRVToMSLConversionConfiguration* pContext,
 											   const VkSpecializationInfo* pSpecializationInfo,
 											   MVKPipelineCache* pipelineCache) {
 	lock_guard<mutex> lock(_accessLock);
 	
-	MVKShaderLibrary* mvkLib = _defaultLibrary;
+	MVKShaderLibrary* mvkLib = _directMSLLibrary;
 	if ( !mvkLib ) {
 		uint64_t startTime = _device->getPerformanceTimestamp();
 		if (pipelineCache) {
@@ -243,13 +277,14 @@
 		}
 		_device->addActivityPerformance(_device->_performanceStatistics.shaderCompilation.shaderLibraryFromCache, startTime);
 	} else {
+		mvkLib->setEntryPointName(pContext->options.entryPointName);
 		pContext->markAllAttributesAndResourcesUsed();
 	}
 
 	return mvkLib ? mvkLib->getMTLFunction(pSpecializationInfo, this) : MVKMTLFunctionNull;
 }
 
-bool MVKShaderModule::convert(SPIRVToMSLConverterContext* pContext) {
+bool MVKShaderModule::convert(SPIRVToMSLConversionConfiguration* pContext) {
 	bool shouldLogCode = _device->_pMVKConfig->debugMode;
 	bool shouldLogEstimatedGLSL = shouldLogCode;
 
@@ -283,7 +318,7 @@
 }
 
 // Returns the MVKGLSLConversionShaderStage corresponding to the shader stage in the SPIR-V converter context.
-MVKGLSLConversionShaderStage MVKShaderModule::getMVKGLSLConversionShaderStage(SPIRVToMSLConverterContext* pContext) {
+MVKGLSLConversionShaderStage MVKShaderModule::getMVKGLSLConversionShaderStage(SPIRVToMSLConversionConfiguration* pContext) {
 	switch (pContext->options.entryPointStage) {
 		case spv::ExecutionModelVertex:						return kMVKGLSLConversionShaderStageVertex;
 		case spv::ExecutionModelTessellationControl:		return kMVKGLSLConversionShaderStageTessControl;
@@ -299,12 +334,18 @@
 	}
 }
 
+void MVKShaderModule::setWorkgroupSize(uint32_t x, uint32_t y, uint32_t z) {
+	_spvConverter.setWorkgroupSize(x, y, z);
+	if(_directMSLLibrary) { _directMSLLibrary->setWorkgroupSize(x, y, z); }
+}
+
+
 #pragma mark Construction
 
 MVKShaderModule::MVKShaderModule(MVKDevice* device,
 								 const VkShaderModuleCreateInfo* pCreateInfo) : MVKVulkanAPIDeviceObject(device), _shaderLibraryCache(this) {
 
-	_defaultLibrary = nullptr;
+	_directMSLLibrary = nullptr;
 
 	size_t codeSize = pCreateInfo->codeSize;
 
@@ -341,7 +382,7 @@
 			_device->addActivityPerformance(_device->_performanceStatistics.shaderCompilation.hashShaderCode, startTime);
 
 			_spvConverter.setMSL(pMSLCode, nullptr);
-			_defaultLibrary = new MVKShaderLibrary(this, _spvConverter.getMSL().c_str(), _spvConverter.getEntryPoint());
+			_directMSLLibrary = new MVKShaderLibrary(this, _spvConverter.getMSL().c_str(), _spvConverter.getConversionResults());
 
 			break;
 		}
@@ -355,7 +396,7 @@
 			codeHash = mvkHash(pMSLCode, mslCodeLen, codeHash);
 			_device->addActivityPerformance(_device->_performanceStatistics.shaderCompilation.hashShaderCode, startTime);
 
-			_defaultLibrary = new MVKShaderLibrary(this, (void*)(pMSLCode), mslCodeLen);
+			_directMSLLibrary = new MVKShaderLibrary(this, (void*)(pMSLCode), mslCodeLen);
 
 			break;
 		}
@@ -379,12 +420,7 @@
 }
 
 MVKShaderModule::~MVKShaderModule() {
-	if (_defaultLibrary) { _defaultLibrary->destroy(); }
-}
-
-void MVKShaderModule::setWorkgroupSize(uint32_t x, uint32_t y, uint32_t z) {
-    _spvConverter.setWorkgroupSize(x, y, z);
-    if(_defaultLibrary) { _defaultLibrary->setWorkgroupSize(x, y, z); }
+	if (_directMSLLibrary) { _directMSLLibrary->destroy(); }
 }
 
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSurface.h b/MoltenVK/MoltenVK/GPUObjects/MVKSurface.h
index 59f8b73..f34df5a 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSurface.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSurface.h
@@ -66,6 +66,10 @@
 #pragma mark Construction
 
 	MVKSurface(MVKInstance* mvkInstance,
+			   const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
+			   const VkAllocationCallbacks* pAllocator);
+
+	MVKSurface(MVKInstance* mvkInstance,
 			   const Vk_PLATFORM_SurfaceCreateInfoMVK* pCreateInfo,
 			   const VkAllocationCallbacks* pAllocator);
 
@@ -73,6 +77,7 @@
 
 protected:
 	void propogateDebugName() override {}
+	void initLayerObserver();
 
 	MVKInstance* _mvkInstance;
 	CAMetalLayer* _mtlCAMetalLayer;
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSurface.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSurface.mm
index f2f5596..3dd8118 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSurface.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSurface.mm
@@ -23,16 +23,28 @@
 #include "MVKOSExtensions.h"
 #import "MVKBlockObserver.h"
 
-#define STR(NAME) #NAME
+// We need to double-dereference the name to first convert to the platform symbol, then to a string.
+#define STR_PLATFORM(NAME) #NAME
+#define STR(NAME) STR_PLATFORM(NAME)
 
 
 #pragma mark MVKSurface
 
+MVKSurface::MVKSurface(MVKInstance* mvkInstance,
+					   const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
+					   const VkAllocationCallbacks* pAllocator) : _mvkInstance(mvkInstance) {
+
+	_mtlCAMetalLayer = (CAMetalLayer*)[pCreateInfo->pLayer retain];
+	initLayerObserver();
+}
+
 // pCreateInfo->pView can be either a CAMetalLayer or a view (NSView/UIView).
 MVKSurface::MVKSurface(MVKInstance* mvkInstance,
 					   const Vk_PLATFORM_SurfaceCreateInfoMVK* pCreateInfo,
 					   const VkAllocationCallbacks* pAllocator) : _mvkInstance(mvkInstance) {
 
+	MVKLogInfo("%s(): This function is obsolete. Consider using the vkCreateMetalSurfaceEXT() function from the VK_EXT_metal_surface extension instead.", STR(vkCreate_PLATFORM_SurfaceMVK));
+
 	// Get the platform object contained in pView
 	id<NSObject> obj = (id<NSObject>)pCreateInfo->pView;
 
@@ -45,30 +57,34 @@
 		obj = ((PLATFORM_VIEW_CLASS*)obj).layer;
 	}
 
-	_layerObserver = nil;
-
 	// Confirm that we were provided with a CAMetalLayer
 	if ([obj isKindOfClass: [CAMetalLayer class]]) {
 		_mtlCAMetalLayer = (CAMetalLayer*)[obj retain];		// retained
-		if ([_mtlCAMetalLayer.delegate isKindOfClass: [PLATFORM_VIEW_CLASS class]]) {
-			// Sometimes, the owning view can replace its CAMetalLayer. In that case, the client
-			// needs to recreate the surface.
-			_layerObserver = [MVKBlockObserver observerWithBlock: ^(NSString* path, id, NSDictionary*, void*) {
-				if ( ![path isEqualToString: @"layer"] ) { return; }
-				std::lock_guard<std::mutex> lock(this->_lock);
-				[this->_mtlCAMetalLayer release];
-				this->_mtlCAMetalLayer = nil;
-				this->setConfigurationResult(VK_ERROR_SURFACE_LOST_KHR);
-				[this->_layerObserver release];
-				this->_layerObserver = nil;
-			} forObject: _mtlCAMetalLayer.delegate atKeyPath: @"layer"];
-		}
 	} else {
 		setConfigurationResult(reportError(VK_ERROR_INITIALIZATION_FAILED,
 										   "%s(): On-screen rendering requires a layer of type CAMetalLayer.",
 										   STR(vkCreate_PLATFORM_SurfaceMVK)));
 		_mtlCAMetalLayer = nil;
 	}
+
+	initLayerObserver();
+}
+
+// Sometimes, the owning view can replace its CAMetalLayer. In that case, the client needs to recreate the surface.
+void MVKSurface::initLayerObserver() {
+
+	_layerObserver = nil;
+	if ( ![_mtlCAMetalLayer.delegate isKindOfClass: [PLATFORM_VIEW_CLASS class]] ) { return; }
+
+	_layerObserver = [MVKBlockObserver observerWithBlock: ^(NSString* path, id, NSDictionary*, void*) {
+		if ( ![path isEqualToString: @"layer"] ) { return; }
+		std::lock_guard<std::mutex> lock(this->_lock);
+		[this->_mtlCAMetalLayer release];
+		this->_mtlCAMetalLayer = nil;
+		this->setConfigurationResult(VK_ERROR_SURFACE_LOST_KHR);
+		[this->_layerObserver release];
+		this->_layerObserver = nil;
+	} forObject: _mtlCAMetalLayer.delegate atKeyPath: @"layer"];
 }
 
 MVKSurface::~MVKSurface() {
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
index 42a3b8b..ac3eabc 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
@@ -38,7 +38,9 @@
 	if (_debugName) {
 		size_t imgCnt = _surfaceImages.size();
 		for (size_t imgIdx = 0; imgIdx < imgCnt; imgIdx++) {
-			_surfaceImages[imgIdx]->setDebugName([NSString stringWithFormat: @"%@(%lu)", _debugName, imgIdx].UTF8String);
+			NSString* nsName = [[NSString alloc] initWithFormat: @"%@(%lu)", _debugName, imgIdx];	// temp retain
+			_surfaceImages[imgIdx]->setDebugName(nsName.UTF8String);
+			[nsName release];																		// release temp string
 		}
 	}
 }
@@ -224,12 +226,40 @@
 																			   VK_IMAGE_USAGE_TRANSFER_DST_BIT |
 																			   VK_IMAGE_USAGE_SAMPLED_BIT |
 																			   VK_IMAGE_USAGE_STORAGE_BIT));
+#if MVK_MACOS
+	switch (pCreateInfo->imageColorSpace) {
+		case VK_COLOR_SPACE_SRGB_NONLINEAR_KHR:
+			_mtlLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
+			break;
+		case VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT:
+			_mtlLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3);
+			break;
+		case VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT:
+			_mtlLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearSRGB);
+			break;
+		case VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT:
+			_mtlLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceDCIP3);
+			break;
+		case VK_COLOR_SPACE_BT709_NONLINEAR_EXT:
+			_mtlLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceITUR_709);
+			break;
+		case VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT:
+			_mtlLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceAdobeRGB1998);
+			break;
+		case VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT:
+			_mtlLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB);
+			break;
+		case VK_COLOR_SPACE_PASS_THROUGH_EXT:
+		default:
+			// Nothing - the default is not to do color matching.
+			break;
+	}
+#endif
 	_mtlLayerOrigDrawSize = _mtlLayer.updatedDrawableSizeMVK;
 
 	// TODO: set additional CAMetalLayer properties before extracting drawables:
 	//	- presentsWithTransaction
 	//	- drawsAsynchronously
-	//  - colorspace (macOS only) Vulkan only supports sRGB colorspace for now.
 	//  - wantsExtendedDynamicRangeContent (macOS only)
 
 	if ( [_mtlLayer.delegate isKindOfClass: [PLATFORM_VIEW_CLASS class]] ) {
@@ -268,7 +298,7 @@
         .flags = 0,
     };
 
-	if (mvkAreFlagsEnabled(pCreateInfo->flags, VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR)) {
+	if (mvkAreAllFlagsEnabled(pCreateInfo->flags, VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR)) {
 		mvkEnableFlag(imgInfo.flags, VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT);
 	}
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.h b/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
index 1fa52cf..fa5f647 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
@@ -197,7 +197,7 @@
 #pragma mark Construction
 
     MVKFence(MVKDevice* device, const VkFenceCreateInfo* pCreateInfo) :
-		MVKVulkanAPIDeviceObject(device), _isSignaled(mvkAreFlagsEnabled(pCreateInfo->flags, VK_FENCE_CREATE_SIGNALED_BIT)) {}
+		MVKVulkanAPIDeviceObject(device), _isSignaled(mvkAreAllFlagsEnabled(pCreateInfo->flags, VK_FENCE_CREATE_SIGNALED_BIT)) {}
 
 protected:
 	void propogateDebugName() override {}
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
index 171df2a..f0a1b1c 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
@@ -215,8 +215,10 @@
 	_blocker.wait_for(lock, nanoTimeout, [this]{ return _isCompileDone; });
 
 	if ( !_isCompileDone ) {
-		NSString* errDesc = [NSString stringWithFormat: @"Timeout after %.3f milliseconds. Likely internal Metal compiler error", (double)nanoTimeout.count() / 1e6];
-		_compileError = [[NSError alloc] initWithDomain: @"MoltenVK" code: 1 userInfo: @{NSLocalizedDescriptionKey : errDesc}];	// retained
+		@autoreleasepool {
+			NSString* errDesc = [NSString stringWithFormat: @"Timeout after %.3f milliseconds. Likely internal Metal compiler error", (double)nanoTimeout.count() / 1e6];
+			_compileError = [[NSError alloc] initWithDomain: @"MoltenVK" code: 1 userInfo: @{NSLocalizedDescriptionKey : errDesc}];	// retained
+		}
 	}
 
 	if (_compileError) { handleError(); }
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.h b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.h
index 0a326dd..8b3ada0 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.h
@@ -21,7 +21,7 @@
 #include "MVKBaseObject.h"
 #include <vulkan/vk_icd.h>
 #include <string>
-#include <mutex>
+#include <atomic>
 
 #import <Foundation/NSString.h>
 
@@ -93,25 +93,18 @@
 	static MVKVulkanAPIObject* getMVKVulkanAPIObject(VkObjectType objType, uint64_t objectHandle);
 
 	/** Construct an empty instance. Declared here to support copy constructor. */
-	MVKVulkanAPIObject() {}
+	MVKVulkanAPIObject() : _refCount(1) {}
 
-	/**
-	 * Construct an instance from a copy. Default copy constructor disallowed due to mutex.
-	 * Copies start with fresh reference counts.
-	 */
-	MVKVulkanAPIObject(const MVKVulkanAPIObject& other) {}
+	/** Default copy constructor disallowed due to mutex. Copy starts with fresh reference counts. */
+	MVKVulkanAPIObject(const MVKVulkanAPIObject& other) : _refCount(1) {}
 
 	~MVKVulkanAPIObject() override;
 
 protected:
-	bool decrementRetainCount();
-	bool markDestroyed();
 	virtual void propogateDebugName() = 0;
 
+	std::atomic<uint32_t> _refCount;
 	NSString* _debugName = nil;
-	std::mutex _refLock;
-	unsigned _refCount = 0;
-	bool _isDestroyed = false;
 };
 
 
@@ -129,21 +122,30 @@
 public:
 
     /**
-     * Returns a reference to this object suitable for use as a Vulkan API handle.
-     * This is the compliment of the getDispatchableObject() method.
+     * Returns a reference to this object suitable for use as a dispatchable Vulkan API handle.
+	 *
+	 * Establishes the loader magic number every time, in case the loader
+	 * overwrote it for some reason before passing the object back,
+	 * particularly in pooled objects that the loader might consider freed.
+	 *
+	 * This is the compliment of the getDispatchableObject() function.
      */
-    void* getVkHandle() override { return &_icdRef; }
+    void* getVkHandle() override {
+		set_loader_magic_value(&_icdRef);
+		return &_icdRef;
+	}
 
     /**
      * Retrieves the MVKDispatchableVulkanAPIObject instance referenced by the dispatchable Vulkan handle.
-     * This is the compliment of the getVkHandle() method.
+	 *
+     * This is the compliment of the getVkHandle() function.
      */
     static inline MVKDispatchableVulkanAPIObject* getDispatchableObject(void* vkHandle) {
 		return vkHandle ? ((MVKDispatchableObjectICDRef*)vkHandle)->mvkObject : nullptr;
     }
 
 protected:
-    MVKDispatchableObjectICDRef _icdRef = { ICD_LOADER_MAGIC, this };
+    MVKDispatchableObjectICDRef _icdRef = { VK_NULL_HANDLE, this };
 
 };
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
index 6fd294d..109844d 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
@@ -25,39 +25,21 @@
 #pragma mark MVKVulkanAPIObject
 
 void MVKVulkanAPIObject::retain() {
-	lock_guard<mutex> lock(_refLock);
-
 	_refCount++;
 }
 
 void MVKVulkanAPIObject::release() {
-	if (decrementRetainCount()) { destroy(); }
+	if (--_refCount == 0) { MVKConfigurableObject::destroy(); }
 }
 
 void MVKVulkanAPIObject::destroy() {
-	if (markDestroyed()) { MVKConfigurableObject::destroy(); }
-}
-
-// Decrements the reference count, and returns whether it's time to destroy this object.
-bool MVKVulkanAPIObject::decrementRetainCount() {
-	lock_guard<mutex> lock(_refLock);
-
-	if (_refCount > 0) { _refCount--; }
-	return (_isDestroyed && _refCount == 0);
-}
-
-// Marks this object as destroyed, and returns whether no references are left outstanding.
-bool MVKVulkanAPIObject::markDestroyed() {
-	lock_guard<mutex> lock(_refLock);
-
-	_isDestroyed = true;
-	return _refCount == 0;
+	release();
 }
 
 VkResult MVKVulkanAPIObject::setDebugName(const char* pObjectName) {
 	if (pObjectName) {
 		[_debugName release];
-		_debugName = [[NSString stringWithUTF8String: pObjectName] retain];		// retained
+		_debugName = [[NSString alloc] initWithUTF8String: pObjectName];	// retained
 		propogateDebugName();
 	}
 	return VK_SUCCESS;
diff --git a/MoltenVK/MoltenVK/Layers/MVKExtensions.def b/MoltenVK/MoltenVK/Layers/MVKExtensions.def
index 5e64a66..44589cb 100644
--- a/MoltenVK/MoltenVK/Layers/MVKExtensions.def
+++ b/MoltenVK/MoltenVK/Layers/MVKExtensions.def
@@ -35,6 +35,7 @@
 MVK_EXTENSION(KHR_bind_memory2, KHR_BIND_MEMORY_2)
 MVK_EXTENSION(KHR_dedicated_allocation, KHR_DEDICATED_ALLOCATION)
 MVK_EXTENSION(KHR_descriptor_update_template, KHR_DESCRIPTOR_UPDATE_TEMPLATE)
+MVK_EXTENSION(KHR_device_group_creation, KHR_DEVICE_GROUP_CREATION)
 MVK_EXTENSION(KHR_get_memory_requirements2, KHR_GET_MEMORY_REQUIREMENTS_2)
 MVK_EXTENSION(KHR_get_physical_device_properties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2)
 MVK_EXTENSION(KHR_get_surface_capabilities2, KHR_GET_SURFACE_CAPABILITIES_2)
@@ -51,13 +52,20 @@
 MVK_EXTENSION(KHR_surface, KHR_SURFACE)
 MVK_EXTENSION(KHR_swapchain, KHR_SWAPCHAIN)
 MVK_EXTENSION(KHR_swapchain_mutable_format, KHR_SWAPCHAIN_MUTABLE_FORMAT)
+MVK_EXTENSION(KHR_uniform_buffer_standard_layout, KHR_UNIFORM_BUFFER_STANDARD_LAYOUT)
 MVK_EXTENSION(KHR_variable_pointers, KHR_VARIABLE_POINTERS)
 MVK_EXTENSION(EXT_debug_marker, EXT_DEBUG_MARKER)
 MVK_EXTENSION(EXT_debug_report, EXT_DEBUG_REPORT)
 MVK_EXTENSION(EXT_debug_utils, EXT_DEBUG_UTILS)
 MVK_EXTENSION(EXT_host_query_reset, EXT_HOST_QUERY_RESET)
 MVK_EXTENSION(EXT_memory_budget, EXT_MEMORY_BUDGET)
+MVK_EXTENSION(EXT_metal_surface, EXT_METAL_SURFACE)
+MVK_EXTENSION(EXT_post_depth_coverage, EXT_POST_DEPTH_COVERAGE)
+MVK_EXTENSION(EXT_scalar_block_layout, EXT_SCALAR_BLOCK_LAYOUT)
+MVK_EXTENSION(EXT_shader_stencil_export, EXT_SHADER_STENCIL_EXPORT)
 MVK_EXTENSION(EXT_shader_viewport_index_layer, EXT_SHADER_VIEWPORT_INDEX_LAYER)
+MVK_EXTENSION(EXT_swapchain_colorspace, EXT_SWAPCHAIN_COLOR_SPACE)
+MVK_EXTENSION(EXT_texel_buffer_alignment, EXT_TEXEL_BUFFER_ALIGNMENT)
 MVK_EXTENSION(EXT_vertex_attribute_divisor, EXT_VERTEX_ATTRIBUTE_DIVISOR)
 MVK_EXTENSION(EXTX_portability_subset, EXTX_PORTABILITY_SUBSET)
 MVK_EXTENSION(MVK_ios_surface, MVK_IOS_SURFACE)
@@ -65,7 +73,10 @@
 MVK_EXTENSION(MVK_moltenvk, MVK_MOLTENVK)
 MVK_EXTENSION(AMD_gpu_shader_half_float, AMD_GPU_SHADER_HALF_FLOAT)
 MVK_EXTENSION(AMD_negative_viewport_height, AMD_NEGATIVE_VIEWPORT_HEIGHT)
+MVK_EXTENSION(AMD_shader_image_load_store_lod, AMD_SHADER_IMAGE_LOAD_STORE_LOD)
+MVK_EXTENSION(AMD_shader_trinary_minmax, AMD_SHADER_TRINARY_MINMAX)
 MVK_EXTENSION(IMG_format_pvrtc, IMG_FORMAT_PVRTC)
+MVK_EXTENSION(INTEL_shader_integer_functions2, INTEL_SHADER_INTEGER_FUNCTIONS2)
 MVK_EXTENSION_LAST(NV_glsl_shader, NV_GLSL_SHADER)
 
 #undef MVK_EXTENSION
diff --git a/MoltenVK/MoltenVK/Layers/MVKExtensions.h b/MoltenVK/MoltenVK/Layers/MVKExtensions.h
index e93fa50..f42aa0f 100644
--- a/MoltenVK/MoltenVK/Layers/MVKExtensions.h
+++ b/MoltenVK/MoltenVK/Layers/MVKExtensions.h
@@ -85,6 +85,20 @@
 	 */
 	std::string enabledNamesString(const char* separator = " ", bool prefixFirstWithSeparator = false) const;
 
+	/**
+	 * If pProperties is null, the value of pCount is updated with the number of extensions
+	 * enabled in this list.
+	 *
+	 * If pProperties is not null, then pCount extension properties are copied into the array.
+	 * If the number of available extensions is less than pCount, the value of pCount is updated
+	 * to indicate the number of extension properties actually returned in the array.
+	 *
+	 * Returns VK_SUCCESS if successful. Returns VK_INCOMPLETE if the number of extensions
+	 * enabled in this list is larger than the specified pCount. Returns other values
+	 * if an error occurs.
+	 */
+	VkResult getProperties(uint32_t* pCount, VkExtensionProperties* pProperties);
+
 	MVKExtensionList(MVKVulkanAPIObject* apiObject, bool enableForPlatform = false);
 
 protected:
diff --git a/MoltenVK/MoltenVK/Layers/MVKExtensions.mm b/MoltenVK/MoltenVK/Layers/MVKExtensions.mm
index 8ca031a..f6bad88 100644
--- a/MoltenVK/MoltenVK/Layers/MVKExtensions.mm
+++ b/MoltenVK/MoltenVK/Layers/MVKExtensions.mm
@@ -46,19 +46,43 @@
 
 // Returns whether the specified properties are valid for this platform
 static bool mvkIsSupportedOnPlatform(VkExtensionProperties* pProperties) {
-#if !(MVK_IOS)
+#if MVK_MACOS
 	if (pProperties == &kVkExtProps_EXT_MEMORY_BUDGET) {
 		return mvkOSVersion() >= 10.13;
 	}
+	if (pProperties == &kVkExtProps_EXT_POST_DEPTH_COVERAGE) { return false; }
+	if (pProperties == &kVkExtProps_EXT_SHADER_STENCIL_EXPORT) {
+		return mvkOSVersion() >= 10.14;
+	}
+	if (pProperties == &kVkExtProps_EXT_TEXEL_BUFFER_ALIGNMENT) {
+		return mvkOSVersion() >= 10.13;
+	}
 	if (pProperties == &kVkExtProps_MVK_IOS_SURFACE) { return false; }
+	if (pProperties == &kVkExtProps_AMD_SHADER_IMAGE_LOAD_STORE_LOD) { return false; }
+	if (pProperties == &kVkExtProps_AMD_SHADER_TRINARY_MINMAX) {
+		return mvkOSVersion() >= 10.14;
+	}
 	if (pProperties == &kVkExtProps_IMG_FORMAT_PVRTC) { return false; }
 #endif
-#if !(MVK_MACOS)
+#if MVK_IOS
 	if (pProperties == &kVkExtProps_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE) { return false; }
 	if (pProperties == &kVkExtProps_EXT_MEMORY_BUDGET) {
 		return mvkOSVersion() >= 11.0;
 	}
+	if (pProperties == &kVkExtProps_EXT_POST_DEPTH_COVERAGE) {
+		return mvkOSVersion() >= 11.0;
+	}
+	if (pProperties == &kVkExtProps_EXT_SHADER_STENCIL_EXPORT) {
+		return mvkOSVersion() >= 12.0;
+	}
+	if (pProperties == &kVkExtProps_EXT_SWAPCHAIN_COLOR_SPACE) { return false; }
+	if (pProperties == &kVkExtProps_EXT_TEXEL_BUFFER_ALIGNMENT) {
+		return mvkOSVersion() >= 11.0;
+	}
 	if (pProperties == &kVkExtProps_MVK_MACOS_SURFACE) { return false; }
+	if (pProperties == &kVkExtProps_AMD_SHADER_TRINARY_MINMAX) {
+		return mvkOSVersion() >= 12.0;
+	}
 #endif
 
 	return true;
@@ -157,3 +181,31 @@
 	}
 	return logMsg;
 }
+
+VkResult MVKExtensionList::getProperties(uint32_t* pCount, VkExtensionProperties* pProperties) {
+
+	uint32_t enabledCnt = 0;
+
+	// Iterate extensions and handle those that are enabled. Count them,
+	// and if they are to be returned, and there is room, do so.
+	uint32_t extnCnt = getCount();
+	MVKExtension* extnAry = &extensionArray;
+	for (uint32_t extnIdx = 0; extnIdx < extnCnt; extnIdx++) {
+		if (extnAry[extnIdx].enabled) {
+			if (pProperties) {
+				if (enabledCnt < *pCount) {
+					pProperties[enabledCnt] = *(extnAry[extnIdx].pProperties);
+				} else {
+					return VK_INCOMPLETE;
+				}
+			}
+			enabledCnt++;
+		}
+	}
+
+	// Return the count of enabled extensions. This will either be a
+	// count of all enabled extensions, or a count of those returned.
+	*pCount = enabledCnt;
+	return VK_SUCCESS;
+}
+
diff --git a/MoltenVK/MoltenVK/Layers/MVKLayers.mm b/MoltenVK/MoltenVK/Layers/MVKLayers.mm
index bbc5a79..0fb19e6 100644
--- a/MoltenVK/MoltenVK/Layers/MVKLayers.mm
+++ b/MoltenVK/MoltenVK/Layers/MVKLayers.mm
@@ -32,29 +32,7 @@
 
 VkResult MVKLayer::getExtensionProperties(uint32_t* pCount, VkExtensionProperties* pProperties) {
 
-	uint32_t enabledCnt = 0;
-
-	// Iterate extensions and handle those that are enabled. Count them,
-	// and if they are to be returned, and there is room, do so.
-	uint32_t extnCnt = _supportedExtensions.getCount();
-	MVKExtension* extnAry = &_supportedExtensions.extensionArray;
-	for (uint32_t extnIdx = 0; extnIdx < extnCnt; extnIdx++) {
-		if (extnAry[extnIdx].enabled) {
-			if (pProperties) {
-				if (enabledCnt < *pCount) {
-					pProperties[enabledCnt] = *(extnAry[extnIdx].pProperties);
-				} else {
-					return VK_INCOMPLETE;
-				}
-			}
-			enabledCnt++;
-		}
-	}
-
-	// Return the count of enabled extensions. This will either be a
-	// count of all enabled extensions, or a count of those returned.
-	*pCount = enabledCnt;
-	return VK_SUCCESS;
+	return _supportedExtensions.getProperties(pCount, pProperties);
 }
 
 
diff --git a/MoltenVK/MoltenVK/OS/MVKGPUCapture.mm b/MoltenVK/MoltenVK/OS/MVKGPUCapture.mm
index 156a16e..4ae0de9 100644
--- a/MoltenVK/MoltenVK/OS/MVKGPUCapture.mm
+++ b/MoltenVK/MoltenVK/OS/MVKGPUCapture.mm
@@ -59,8 +59,10 @@
 MVKGPUCaptureScope::MVKGPUCaptureScope(MVKQueue* mvkQueue, const char* purpose) : _queue(mvkQueue) {
 	_mtlQueue = [_queue->getMTLCommandQueue() retain];	// retained
 	if (mvkOSVersion() >= kMinOSVersionMTLCaptureScope) {
+		NSString* nsQLbl = [[NSString alloc] initWithUTF8String: (_queue->getName() + "-" + purpose).c_str()];		// temp retained
 		_mtlCaptureScope = [[MTLCaptureManager sharedCaptureManager] newCaptureScopeWithCommandQueue: _mtlQueue];	// retained
-		_mtlCaptureScope.label = @((_queue->getName() + "-" + purpose).c_str());
+		_mtlCaptureScope.label = nsQLbl;
+		[nsQLbl release];																							// release temp
 	}
 }
 
diff --git a/MoltenVK/MoltenVK/Utility/MVKFoundation.h b/MoltenVK/MoltenVK/Utility/MVKFoundation.h
index 00b0b85..0fddedd 100644
--- a/MoltenVK/MoltenVK/Utility/MVKFoundation.h
+++ b/MoltenVK/MoltenVK/Utility/MVKFoundation.h
@@ -391,6 +391,13 @@
 }
 #endif
 
+/** Returns whether the container contains an item equal to the value. */
+template<class C, class T>
+bool contains(const C& container, const T& val) {
+	for (const T& cVal : container) { if (cVal == val) { return true; } }
+	return false;
+}
+
 /** Removes the first occurance of the specified value from the specified container. */
 template<class C, class T>
 void mvkRemoveFirstOccurance(C& container, T val) {
@@ -465,19 +472,19 @@
 template<typename T1, typename T2>
 void mvkDisableFlag(T1& value, const T2 bitMask) { value &= ~bitMask; }
 
-/** Returns whether the specified value has ALL of the flags specified in bitMask enabled (set to 1). */
-template<typename T1, typename T2>
-bool mvkAreFlagsEnabled(T1 value, const T2 bitMask) { return ((value & bitMask) == bitMask); }
-
 /** Returns whether the specified value has ANY of the flags specified in bitMask enabled (set to 1). */
 template<typename T1, typename T2>
 bool mvkIsAnyFlagEnabled(T1 value, const T2 bitMask) { return !!(value & bitMask); }
 
-/** Returns whether the specified value has ONLY ALL of the flags specified in bitMask enabled (set to 1), and none others. */
+/** Returns whether the specified value has ALL of the flags specified in bitMask enabled (set to 1). */
 template<typename T1, typename T2>
-bool mvkAreOnlyAllFlagsEnabled(T1 value, const T2 bitMask) { return (value == bitMask); }
+bool mvkAreAllFlagsEnabled(T1 value, const T2 bitMask) { return ((value & bitMask) == bitMask); }
 
 /** Returns whether the specified value has ONLY one or more of the flags specified in bitMask enabled (set to 1), and none others. */
 template<typename T1, typename T2>
-bool mvkAreOnlyAnyFlagsEnabled(T1 value, const T2 bitMask) { return (mvkIsAnyFlagEnabled(value, bitMask) && ((value | bitMask) == bitMask)); }
+bool mvkIsOnlyAnyFlagEnabled(T1 value, const T2 bitMask) { return (mvkIsAnyFlagEnabled(value, bitMask) && ((value | bitMask) == bitMask)); }
+
+/** Returns whether the specified value has ONLY ALL of the flags specified in bitMask enabled (set to 1), and none others. */
+template<typename T1, typename T2>
+bool mvkAreOnlyAllFlagsEnabled(T1 value, const T2 bitMask) { return (value == bitMask); }
 
diff --git a/MoltenVK/MoltenVK/Utility/MVKWatermark.mm b/MoltenVK/MoltenVK/Utility/MVKWatermark.mm
index db7740c..cfc4b56 100644
--- a/MoltenVK/MoltenVK/Utility/MVKWatermark.mm
+++ b/MoltenVK/MoltenVK/Utility/MVKWatermark.mm
@@ -75,7 +75,7 @@
 }
 
 id<MTLRenderPipelineState> MVKWatermark::newRenderPipelineState() {
-    MTLRenderPipelineDescriptor* plDesc = [[MTLRenderPipelineDescriptor new] autorelease];
+    MTLRenderPipelineDescriptor* plDesc = [MTLRenderPipelineDescriptor new];	// temp retained
     plDesc.label = _mtlName;
 
     plDesc.vertexFunction = _mtlFunctionVertex;
@@ -128,7 +128,8 @@
     NSError* err = nil;
     id<MTLRenderPipelineState> rps = [_mtlDevice newRenderPipelineStateWithDescriptor: plDesc error: &err];	// retained
     MVKAssert( !err, "Could not create watermark pipeline state (Error code %li)\n%s", (long)err.code, err.localizedDescription.UTF8String);
-    return rps;
+	[plDesc release];		// temp released
+	return rps;
 }
 
 
@@ -296,21 +297,26 @@
                    bytesPerRow: textureBytesPerRow
                  bytesPerImage: 0];
 
-    MTLSamplerDescriptor* sampDesc = [[MTLSamplerDescriptor new] autorelease];
+    MTLSamplerDescriptor* sampDesc = [MTLSamplerDescriptor new];				// temp retained
     sampDesc.minFilter = MTLSamplerMinMagFilterLinear;
-    _mtlSamplerState = [_mtlDevice newSamplerStateWithDescriptor: sampDesc];		// retained
+    _mtlSamplerState = [_mtlDevice newSamplerStateWithDescriptor: sampDesc];	// retained
+	[sampDesc release];															// temp released
 }
 
 // Initialize the shader functions for rendering the watermark
 void MVKWatermark::initShaders(const char* mslSourceCode) {
     NSError* err = nil;
-    id<MTLLibrary> mtlLib = [[_mtlDevice newLibraryWithSource: @(mslSourceCode)
-                                                      options: nil
-                                                        error: &err] autorelease];
+	NSString* nsSrc = [[NSString alloc] initWithUTF8String: mslSourceCode];	// temp retained
+	id<MTLLibrary> mtlLib = [_mtlDevice newLibraryWithSource: nsSrc
+													 options: nil
+													   error: &err];		// temp retained
 	MVKAssert( !err, "Could not compile watermark shaders (Error code %li):\n%s", (long)err.code, err.localizedDescription.UTF8String);
 
     _mtlFunctionVertex = [mtlLib newFunctionWithName: @"watermarkVertex"];          // retained
     _mtlFunctionFragment = [mtlLib newFunctionWithName: @"watermarkFragment"];      // retained
+
+	[nsSrc release];	// temp released
+	[mtlLib release];	// temp released
 }
 
 // Initialize the vertex buffers to use for rendering the watermark
diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.hpp b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.hpp
index 6cc918f..62eeae7 100644
--- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.hpp
+++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.hpp
@@ -22,6 +22,8 @@
 
 #include "mvk_datatypes.h"
 
+#include <functional>
+
 class MVKBaseObject;
 
 /*
@@ -75,4 +77,13 @@
 MTLTessellationPartitionMode mvkMTLTessellationPartitionModeFromSpvExecutionModeInObj(uint32_t spvMode, MVKBaseObject* mvkObj);
 #define mvkMTLTessellationPartitionModeFromSpvExecutionMode(spvMode) mvkMTLTessellationPartitionModeFromSpvExecutionModeInObj(spvMode, this)
 
+
+#pragma mark -
+#pragma mark Image properties
+
+#pragma mark Texture formats
+
+/** Enumerates all formats that support the given features, calling a specified function for each one. */
+void mvkEnumerateSupportedFormats(VkFormatProperties properties, bool any, std::function<bool(VkFormat)> func);
+
 #endif
diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
index 0cdf559..e3890a0 100644
--- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
+++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
@@ -69,7 +69,7 @@
 
 #if MVK_MACOS
 // macOS does not support linear images as framebuffer attachments.
-#define MVK_FMT_LINEAR_TILING_FEATS	MVK_FMT_IMAGE_FEATS
+#define MVK_FMT_LINEAR_TILING_FEATS	(MVK_FMT_IMAGE_FEATS | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
 
 // macOS also does not support E5B9G9R9 for anything but filtering.
 #define MVK_FMT_E5B9G9R9_FEATS 		MVK_FMT_COMPRESSED_FEATS
@@ -245,7 +245,7 @@
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8_SSCALED, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 1, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8_UINT, MTLPixelFormatR8Uint, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 1, MTLVertexFormatUChar, MTLVertexFormatUChar2, 11.0, 10.13, kMVKFormatColorUInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8_SINT, MTLPixelFormatR8Sint, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 1, MTLVertexFormatChar, MTLVertexFormatChar2, 11.0, 10.13, kMVKFormatColorInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8_SRGB, MTLPixelFormatR8Unorm_sRGB, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 1, 1, 1, MTLVertexFormatUCharNormalized, MTLVertexFormatUChar2Normalized, 11.0, 10.13, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8_SRGB, MTLPixelFormatR8Unorm_sRGB, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 1, 1, 1, MTLVertexFormatUCharNormalized, MTLVertexFormatUChar2Normalized, 11.0, 10.13, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ),
 
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8_UNORM, MTLPixelFormatRG8Unorm, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 2, MTLVertexFormatUChar2Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8_SNORM, MTLPixelFormatRG8Snorm, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 2, MTLVertexFormatChar2Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
@@ -253,7 +253,7 @@
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8_SSCALED, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 2, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8_UINT, MTLPixelFormatRG8Uint, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 2, MTLVertexFormatUChar2, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorUInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8_SINT, MTLPixelFormatRG8Sint, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 2, MTLVertexFormatChar2, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8_SRGB, MTLPixelFormatRG8Unorm_sRGB, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 1, 1, 2, MTLVertexFormatUChar2Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8_SRGB, MTLPixelFormatRG8Unorm_sRGB, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 1, 1, 2, MTLVertexFormatUChar2Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ),
 
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8_UNORM, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatUChar3Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8_SNORM, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatChar3Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
@@ -261,7 +261,7 @@
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8_SSCALED, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8_UINT, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatUChar3, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorUInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8_SINT, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatChar3, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8_SRGB, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatUChar3Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8_SRGB, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatUChar3Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ),
 
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_B8G8R8_UNORM, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_B8G8R8_SNORM, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 3, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
@@ -277,7 +277,7 @@
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8A8_SSCALED, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 4, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8A8_UINT, MTLPixelFormatRGBA8Uint, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatUChar4, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorUInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8A8_SINT, MTLPixelFormatRGBA8Sint, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatChar4, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8A8_SRGB, MTLPixelFormatRGBA8Unorm_sRGB, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatUChar4Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_R8G8B8A8_SRGB, MTLPixelFormatRGBA8Unorm_sRGB, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatUChar4Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ),
 
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_B8G8R8A8_UNORM, MTLPixelFormatBGRA8Unorm, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatUChar4Normalized_BGRA, MTLVertexFormatInvalid, 11.0, 10.13, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_B8G8R8A8_SNORM, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 4, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
@@ -293,9 +293,9 @@
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A8B8G8R8_SSCALED_PACK32, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 4, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A8B8G8R8_UINT_PACK32, MTLPixelFormatRGBA8Uint, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatUChar4, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorUInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A8B8G8R8_SINT_PACK32, MTLPixelFormatRGBA8Sint, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatChar4, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorInt8, MVK_FMT_COLOR_INTEGER_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A8B8G8R8_SRGB_PACK32, MTLPixelFormatRGBA8Unorm_sRGB, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatUChar4Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_VTX_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A8B8G8R8_SRGB_PACK32, MTLPixelFormatRGBA8Unorm_sRGB, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatUChar4Normalized, MTLVertexFormatInvalid, 8.0, 10.11, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ),
 
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A2R10G10B10_UNORM_PACK32, MTLPixelFormatBGR10A2Unorm, MTLPixelFormatInvalid, 11.0, 10.13, 1, 1, 4, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_NO_FEATS ),	// Vulkan packed is reversed
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A2R10G10B10_UNORM_PACK32, MTLPixelFormatBGR10A2Unorm, MTLPixelFormatInvalid, 11.0, 10.13, 1, 1, 4, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ),	// Vulkan packed is reversed
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A2R10G10B10_SNORM_PACK32, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 4, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A2R10G10B10_USCALED_PACK32, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 4, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_A2R10G10B10_SSCALED_PACK32, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 4, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
@@ -665,6 +665,26 @@
     return formatDescForMTLPixelFormat(mtlFormat).mtlName;
 }
 
+void mvkEnumerateSupportedFormats(VkFormatProperties properties, bool any, std::function<bool(VkFormat)> func) {
+    static const auto areFeaturesSupported = [any](uint32_t a, uint32_t b) {
+        if (b == 0) return true;
+        if (any)
+            return mvkIsAnyFlagEnabled(a, b);
+        else
+            return mvkAreAllFlagsEnabled(a, b);
+    };
+    for (auto& formatDesc : _formatDescriptions) {
+        if (formatDesc.isSupported() &&
+            areFeaturesSupported(formatDesc.properties.linearTilingFeatures, properties.linearTilingFeatures) &&
+            areFeaturesSupported(formatDesc.properties.optimalTilingFeatures, properties.optimalTilingFeatures) &&
+            areFeaturesSupported(formatDesc.properties.bufferFeatures, properties.bufferFeatures)) {
+            if (!func(formatDesc.vk)) {
+                break;
+            }
+        }
+    }
+}
+
 #undef mvkMTLVertexFormatFromVkFormat
 MVK_PUBLIC_SYMBOL MTLVertexFormat mvkMTLVertexFormatFromVkFormat(VkFormat vkFormat) {
 	return mvkMTLVertexFormatFromVkFormatInObj(vkFormat, nullptr);
@@ -809,64 +829,67 @@
 }
 
 MVK_PUBLIC_SYMBOL VkImageType mvkVkImageTypeFromMTLTextureType(MTLTextureType mtlTextureType) {
-    switch (mtlTextureType) {
-        case MTLTextureType1D:          return VK_IMAGE_TYPE_1D;
-        case MTLTextureType1DArray:     return VK_IMAGE_TYPE_1D;
-        case MTLTextureType3D:          return VK_IMAGE_TYPE_3D;
-        default:                        return VK_IMAGE_TYPE_2D;
-    }
+	switch (mtlTextureType) {
+		case MTLTextureType1D:
+		case MTLTextureType1DArray:
+			return VK_IMAGE_TYPE_1D;
+		case MTLTextureType3D:
+			return VK_IMAGE_TYPE_3D;
+		default:
+			return VK_IMAGE_TYPE_2D;
+	}
 }
 
 MVK_PUBLIC_SYMBOL MTLTextureType mvkMTLTextureTypeFromVkImageViewType(VkImageViewType vkImageViewType,
-                                                                      bool isMultisample) {
-    switch (vkImageViewType) {
-        case VK_IMAGE_VIEW_TYPE_1D:             return MTLTextureType1D;
-        case VK_IMAGE_VIEW_TYPE_1D_ARRAY:       return MTLTextureType1DArray;
-        case VK_IMAGE_VIEW_TYPE_2D:             return (isMultisample ? MTLTextureType2DMultisample : MTLTextureType2D);
-        case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+																	  bool isMultisample) {
+	switch (vkImageViewType) {
+		case VK_IMAGE_VIEW_TYPE_1D:				return MTLTextureType1D;
+		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:		return MTLTextureType1DArray;
+		case VK_IMAGE_VIEW_TYPE_2D:				return (isMultisample ? MTLTextureType2DMultisample : MTLTextureType2D);
+		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
 #if MVK_MACOS
-            if (isMultisample) {
-                return MTLTextureType2DMultisampleArray;
-            }
+			if (isMultisample) { return MTLTextureType2DMultisampleArray; }
 #endif
-            return MTLTextureType2DArray;
-        case VK_IMAGE_VIEW_TYPE_3D:             return MTLTextureType3D;
-        case VK_IMAGE_VIEW_TYPE_CUBE:           return MTLTextureTypeCube;
-        case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:    return MTLTextureTypeCubeArray;
-        default:                            return MTLTextureType2D;
-    }
+			return MTLTextureType2DArray;
+		case VK_IMAGE_VIEW_TYPE_3D:				return MTLTextureType3D;
+		case VK_IMAGE_VIEW_TYPE_CUBE:			return MTLTextureTypeCube;
+		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:		return MTLTextureTypeCubeArray;
+		default:                            	return MTLTextureType2D;
+	}
 }
 
 MVK_PUBLIC_SYMBOL MTLTextureUsage mvkMTLTextureUsageFromVkImageUsageFlags(VkImageUsageFlags vkImageUsageFlags) {
     MTLTextureUsage mtlUsage = MTLTextureUsageUnknown;
 
-    if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_TRANSFER_SRC_BIT) ) {
-        mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
-    }
-    if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_TRANSFER_DST_BIT) ) {
-        mvkEnableFlag(mtlUsage, MTLTextureUsageRenderTarget);
-    }
-    if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_SAMPLED_BIT) ) {
-        mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
-        mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
-    }
-    if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_STORAGE_BIT) ) {
-        mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
-        mvkEnableFlag(mtlUsage, MTLTextureUsageShaderWrite);
-        mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
-    }
-    if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) ) {
-        mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
-        mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
-    }
-    if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) ) {
-        mvkEnableFlag(mtlUsage, MTLTextureUsageRenderTarget);
-        mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
-    }
-    if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ) {
-        mvkEnableFlag(mtlUsage, MTLTextureUsageRenderTarget);
-        mvkDisableFlag(mtlUsage, MTLTextureUsagePixelFormatView);        // Clears bit. Do this last.
-    }
+	// Read from...
+	if (mvkIsAnyFlagEnabled(vkImageUsageFlags, (VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+												VK_IMAGE_USAGE_SAMPLED_BIT |
+												VK_IMAGE_USAGE_STORAGE_BIT |
+												VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT))) {
+		mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
+	}
+
+	// Write to...
+	if (mvkIsAnyFlagEnabled(vkImageUsageFlags, (VK_IMAGE_USAGE_STORAGE_BIT))) {
+		mvkEnableFlag(mtlUsage, MTLTextureUsageShaderWrite);
+	}
+
+	// Render to...
+	if (mvkIsAnyFlagEnabled(vkImageUsageFlags, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+												VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
+												VK_IMAGE_USAGE_TRANSFER_DST_BIT))) {				// Scaling a BLIT may use rendering.
+		mvkEnableFlag(mtlUsage, MTLTextureUsageRenderTarget);
+	}
+
+	// Create view on...
+	if (mvkIsAnyFlagEnabled(vkImageUsageFlags, (VK_IMAGE_USAGE_TRANSFER_SRC_BIT |	 				// May use temp view if transfer involves format change
+												VK_IMAGE_USAGE_SAMPLED_BIT |
+												VK_IMAGE_USAGE_STORAGE_BIT |
+												VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
+												VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+												VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT))) {	// D/S may be filtered out after device check
+		mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
+	}
 
     return mtlUsage;
 }
@@ -874,12 +897,12 @@
 MVK_PUBLIC_SYMBOL VkImageUsageFlags mvkVkImageUsageFlagsFromMTLTextureUsage(MTLTextureUsage mtlUsage, MTLPixelFormat mtlFormat) {
     VkImageUsageFlags vkImageUsageFlags = 0;
 
-    if ( mvkAreFlagsEnabled(mtlUsage, MTLTextureUsageShaderRead) ) {
+    if ( mvkAreAllFlagsEnabled(mtlUsage, MTLTextureUsageShaderRead) ) {
         mvkEnableFlag(vkImageUsageFlags, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
         mvkEnableFlag(vkImageUsageFlags, VK_IMAGE_USAGE_SAMPLED_BIT);
         mvkEnableFlag(vkImageUsageFlags, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT);
     }
-    if ( mvkAreFlagsEnabled(mtlUsage, MTLTextureUsageRenderTarget) ) {
+    if ( mvkAreAllFlagsEnabled(mtlUsage, MTLTextureUsageRenderTarget) ) {
         mvkEnableFlag(vkImageUsageFlags, VK_IMAGE_USAGE_TRANSFER_DST_BIT);
         if (mvkMTLPixelFormatIsDepthFormat(mtlFormat) || mvkMTLPixelFormatIsStencilFormat(mtlFormat)) {
             mvkEnableFlag(vkImageUsageFlags, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
@@ -887,7 +910,7 @@
             mvkEnableFlag(vkImageUsageFlags, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
         }
     }
-    if ( mvkAreFlagsEnabled(mtlUsage, MTLTextureUsageShaderWrite) ) {
+    if ( mvkAreAllFlagsEnabled(mtlUsage, MTLTextureUsageShaderWrite) ) {
         mvkEnableFlag(vkImageUsageFlags, VK_IMAGE_USAGE_STORAGE_BIT);
     }
 
@@ -1003,10 +1026,10 @@
 
 MVK_PUBLIC_SYMBOL MTLColorWriteMask mvkMTLColorWriteMaskFromVkChannelFlags(VkColorComponentFlags vkWriteFlags) {
 	MTLColorWriteMask mtlWriteMask = MTLColorWriteMaskNone;
-	if (mvkAreFlagsEnabled(vkWriteFlags, VK_COLOR_COMPONENT_R_BIT)) { mvkEnableFlag(mtlWriteMask, MTLColorWriteMaskRed); }
-	if (mvkAreFlagsEnabled(vkWriteFlags, VK_COLOR_COMPONENT_G_BIT)) { mvkEnableFlag(mtlWriteMask, MTLColorWriteMaskGreen); }
-	if (mvkAreFlagsEnabled(vkWriteFlags, VK_COLOR_COMPONENT_B_BIT)) { mvkEnableFlag(mtlWriteMask, MTLColorWriteMaskBlue); }
-	if (mvkAreFlagsEnabled(vkWriteFlags, VK_COLOR_COMPONENT_A_BIT)) { mvkEnableFlag(mtlWriteMask, MTLColorWriteMaskAlpha); }
+	if (mvkAreAllFlagsEnabled(vkWriteFlags, VK_COLOR_COMPONENT_R_BIT)) { mvkEnableFlag(mtlWriteMask, MTLColorWriteMaskRed); }
+	if (mvkAreAllFlagsEnabled(vkWriteFlags, VK_COLOR_COMPONENT_G_BIT)) { mvkEnableFlag(mtlWriteMask, MTLColorWriteMaskGreen); }
+	if (mvkAreAllFlagsEnabled(vkWriteFlags, VK_COLOR_COMPONENT_B_BIT)) { mvkEnableFlag(mtlWriteMask, MTLColorWriteMaskBlue); }
+	if (mvkAreAllFlagsEnabled(vkWriteFlags, VK_COLOR_COMPONENT_A_BIT)) { mvkEnableFlag(mtlWriteMask, MTLColorWriteMaskAlpha); }
 	return mtlWriteMask;
 }
 
@@ -1325,14 +1348,14 @@
 	// barrier is to be placed before the render stages, it should come before the vertex stage, otherwise
 	// if the barrier is to be placed after the render stages, it should come after the fragment stage.
 	if (placeBarrierBefore) {
-		bool placeBeforeFragment = mvkAreOnlyAnyFlagsEnabled(vkStages, (VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+		bool placeBeforeFragment = mvkIsOnlyAnyFlagEnabled(vkStages, (VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
 																		VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
 																		VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
 																		VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
 																		VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT));
 		return placeBeforeFragment ? MTLRenderStageFragment : MTLRenderStageVertex;
 	} else {
-		bool placeAfterVertex = mvkAreOnlyAnyFlagsEnabled(vkStages, (VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+		bool placeAfterVertex = mvkIsOnlyAnyFlagEnabled(vkStages, (VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
 																	 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
 																	 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
 																	 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
@@ -1365,10 +1388,10 @@
 MVK_PUBLIC_SYMBOL MTLStorageMode mvkMTLStorageModeFromVkMemoryPropertyFlags(VkMemoryPropertyFlags vkFlags) {
 
 	// If not visible to the host: Private
-	if ( !mvkAreFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ) {
+	if ( !mvkAreAllFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ) {
 #if MVK_IOS
 		// iOS: If lazily allocated, Memoryless
-		if (mvkAreFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)) {
+		if (mvkAreAllFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)) {
 			return MTLStorageModeMemoryless;
 		}
 #endif
@@ -1376,7 +1399,7 @@
 	}
 
 	// If visible to the host and coherent: Shared
-	if (mvkAreFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
+	if (mvkAreAllFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
 		return MTLStorageModeShared;
 	}
 
@@ -1392,44 +1415,9 @@
 	return MTLCPUCacheModeDefaultCache;
 }
 
-MVK_PUBLIC_SYMBOL MTLResourceOptions mvkMTLResourceOptionsFromVkMemoryPropertyFlags(VkMemoryPropertyFlags vkFlags) {
-	MTLResourceOptions mtlFlags = 0;
-
-	// First set the resource CPU cache mode
-	MTLCPUCacheMode mtlCPUMode = mvkMTLCPUCacheModeFromVkMemoryPropertyFlags(vkFlags);
-	switch (mtlCPUMode) {
-		case MTLCPUCacheModeDefaultCache:
-			mvkEnableFlag(mtlFlags, MTLResourceCPUCacheModeDefaultCache);
-			break;
-		case MTLCPUCacheModeWriteCombined:
-			mvkEnableFlag(mtlFlags, MTLResourceCPUCacheModeWriteCombined);
-			break;
-	}
-
-	// Then set the resource storage mode
-	MTLStorageMode mtlStgMode = mvkMTLStorageModeFromVkMemoryPropertyFlags(vkFlags);
-	switch (mtlStgMode) {
-		case MTLStorageModePrivate:
-			mvkEnableFlag(mtlFlags, MTLResourceStorageModePrivate);
-			break;
-		case MTLStorageModeShared:
-			mvkEnableFlag(mtlFlags, MTLResourceStorageModeShared);
-			break;
-#if MVK_MACOS
-		case MTLStorageModeManaged:
-			mvkEnableFlag(mtlFlags, MTLResourceStorageModeManaged);
-			break;
-#endif
-#if MVK_IOS
-		case MTLStorageModeMemoryless:
-			mvkEnableFlag(mtlFlags, MTLResourceStorageModeMemoryless);
-			break;
-#endif
-		default:		// Silence erroneous -Wswitch-enum warning on MTLResourceStorageModeManaged under iOS
-			break;
-	}
-
-	return mtlFlags;
+MVK_PUBLIC_SYMBOL MTLResourceOptions mvkMTLResourceOptions(MTLStorageMode mtlStorageMode,
+														   MTLCPUCacheMode mtlCPUCacheMode) {
+	return (mtlStorageMode << MTLResourceStorageModeShift) | (mtlCPUCacheMode << MTLResourceCPUCacheModeShift);
 }
 
 
diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
index fb5ffac..3522f87 100644
--- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
@@ -40,29 +40,89 @@
 #include "MVKSwapchain.h"
 #include "MVKSurface.h"
 #include "MVKFoundation.h"
+#include "MVKOSExtensions.h"
 #include "MVKLogging.h"
 
-static bool _mvkTraceVulkanCalls = false;
-#define MVKTraceVulkanCall()	if (_mvkTraceVulkanCalls) { fprintf(stderr, "[mvk-trace] %s()\n", __FUNCTION__); }
+
+#pragma mark -
+#pragma mark Tracing Vulkan calls
+
+#ifndef MVK_CONFIG_TRACE_VULKAN_CALLS
+#   define MVK_CONFIG_TRACE_VULKAN_CALLS    0
+#endif
+
+static uint32_t _mvkTraceVulkanCalls = 0;
+static bool _mvkVulkanCallTracingInitialized = false;
+__attribute__((constructor)) static void MVKInitVulkanCallTracing() {
+	if (_mvkVulkanCallTracingInitialized ) { return; }
+	_mvkVulkanCallTracingInitialized = true;
+
+	MVK_SET_FROM_ENV_OR_BUILD_INT32(_mvkTraceVulkanCalls, MVK_CONFIG_TRACE_VULKAN_CALLS);
+}
+
+// Optionally log start of function calls to stderr
+static inline uint64_t MVKTraceVulkanCallStartImpl(const char* funcName) {
+	uint64_t timestamp = 0;
+	switch(_mvkTraceVulkanCalls) {
+		case 3:			// Fall through
+			timestamp = mvkGetTimestamp();
+		case 2:
+			fprintf(stderr, "[mvk-trace] %s() {\n", funcName);
+			break;
+		case 1:
+			fprintf(stderr, "[mvk-trace] %s()\n", funcName);
+			break;
+		case 0:
+		default:
+			break;
+	}
+	return timestamp;
+}
+
+// Optionally log end of function calls and timings to stderr
+static inline void MVKTraceVulkanCallEndImpl(const char* funcName, uint64_t startTime) {
+	switch(_mvkTraceVulkanCalls) {
+		case 3:
+			fprintf(stderr, "[mvk-trace] } %s() (%.4f ms)\n", funcName, mvkGetElapsedMilliseconds(startTime));
+			break;
+		case 2:
+			fprintf(stderr, "[mvk-trace] } %s()\n", funcName);
+			break;
+		case 1:
+		case 0:
+		default:
+			break;
+	}
+}
+
+#define MVKTraceVulkanCallStart()	uint64_t tvcStartTime = MVKTraceVulkanCallStartImpl(__FUNCTION__)
+#define MVKTraceVulkanCallEnd()		MVKTraceVulkanCallEndImpl(__FUNCTION__, tvcStartTime)
+
+
+#pragma mark -
+#pragma mark Vulkan calls
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateInstance(
     const VkInstanceCreateInfo*                 pCreateInfo,
 	const VkAllocationCallbacks*                pAllocator,
     VkInstance*                                 pInstance) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKInstance* mvkInst = new MVKInstance(pCreateInfo);
 	*pInstance = mvkInst->getVkInstance();
-	return mvkInst->getConfigurationResult();
+	VkResult rslt = mvkInst->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyInstance(
     VkInstance                                  instance,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !instance ) { return; }
 	MVKInstance::getMVKInstance(instance)->destroy();
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkEnumeratePhysicalDevices(
@@ -70,18 +130,21 @@
     uint32_t*                                   pPhysicalDeviceCount,
     VkPhysicalDevice*                           pPhysicalDevices) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
-	return mvkInst->getPhysicalDevices(pPhysicalDeviceCount, pPhysicalDevices);
+	VkResult rslt = mvkInst->getPhysicalDevices(pPhysicalDeviceCount, pPhysicalDevices);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceFeatures(
     VkPhysicalDevice                            physicalDevice,
     VkPhysicalDeviceFeatures*                   pFeatures) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	mvkPD->getFeatures(pFeatures);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceFormatProperties(
@@ -89,9 +152,10 @@
     VkFormat                                    format,
     VkFormatProperties*                         pFormatProperties) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	mvkPD->getFormatProperties(format, pFormatProperties);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceImageFormatProperties(
@@ -103,18 +167,21 @@
     VkImageCreateFlags                          flags,
     VkImageFormatProperties*                    pImageFormatProperties) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
-    return mvkPD->getImageFormatProperties(format, type, tiling, usage, flags, pImageFormatProperties);
+    VkResult rslt = mvkPD->getImageFormatProperties(format, type, tiling, usage, flags, pImageFormatProperties);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceProperties(
     VkPhysicalDevice                            physicalDevice,
     VkPhysicalDeviceProperties*                 pProperties) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	mvkPD->getProperties(pProperties);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceQueueFamilyProperties(
@@ -122,43 +189,53 @@
 	uint32_t*                                   pQueueFamilyPropertyCount,
 	VkQueueFamilyProperties*                    pQueueFamilyProperties) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	mvkPD->getQueueFamilyProperties(pQueueFamilyPropertyCount, pQueueFamilyProperties);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceMemoryProperties(
     VkPhysicalDevice                            physicalDevice,
     VkPhysicalDeviceMemoryProperties*           pMemoryProperties) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	mvkPD->getPhysicalDeviceMemoryProperties(pMemoryProperties);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL PFN_vkVoidFunction vkGetInstanceProcAddr(
     VkInstance                                  instance,
     const char*                                 pName) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 
 	// Handle the special platform functions where the instance parameter may be NULL.
-	if (strcmp(pName, "vkCreateInstance") == 0) { return (PFN_vkVoidFunction)vkCreateInstance; }
-	if (strcmp(pName, "vkEnumerateInstanceExtensionProperties") == 0) { return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties; }
-	if (strcmp(pName, "vkEnumerateInstanceLayerProperties") == 0) { return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties; }
-	if ( !instance ) { return nullptr; }
-
-	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
-	return mvkInst->getProcAddr(pName);
+	PFN_vkVoidFunction func = nullptr;
+	if (strcmp(pName, "vkCreateInstance") == 0) {
+		func = (PFN_vkVoidFunction)vkCreateInstance;
+	} else if (strcmp(pName, "vkEnumerateInstanceExtensionProperties") == 0) {
+		func = (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
+	} else if (strcmp(pName, "vkEnumerateInstanceLayerProperties") == 0) {
+		func = (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
+	} else if (instance) {
+		MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
+		func = mvkInst->getProcAddr(pName);
+	}
+	MVKTraceVulkanCallEnd();
+	return func;
 }
 
 MVK_PUBLIC_SYMBOL PFN_vkVoidFunction vkGetDeviceProcAddr(
     VkDevice                                    device,
     const char*                                 pName) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	return mvkDev->getProcAddr(pName);
+	PFN_vkVoidFunction func = mvkDev->getProcAddr(pName);
+	MVKTraceVulkanCallEnd();
+	return func;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateDevice(
@@ -167,20 +244,23 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkDevice*                                   pDevice) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	MVKDevice* mvkDev = new MVKDevice(mvkPD, pCreateInfo);
 	*pDevice = mvkDev->getVkDevice();
-	return mvkDev->getConfigurationResult();
+	VkResult rslt = mvkDev->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyDevice(
 	VkDevice                                    device,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !device ) { return; }
 	MVKDevice::getMVKDevice(device)->destroy();
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkEnumerateInstanceExtensionProperties(
@@ -188,8 +268,10 @@
     uint32_t*                                   pCount,
     VkExtensionProperties*                      pProperties) {
 
-	MVKTraceVulkanCall();
-	return MVKLayerManager::globalManager()->getLayerNamed(pLayerName)->getExtensionProperties(pCount, pProperties);
+	MVKTraceVulkanCallStart();
+	VkResult rslt = MVKLayerManager::globalManager()->getLayerNamed(pLayerName)->getExtensionProperties(pCount, pProperties);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkEnumerateDeviceExtensionProperties(
@@ -198,17 +280,21 @@
     uint32_t*                                   pCount,
     VkExtensionProperties*                      pProperties) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
-	return mvkPD->getInstance()->getLayerManager()->getLayerNamed(pLayerName)->getExtensionProperties(pCount, pProperties);
+	VkResult rslt = mvkPD->getExtensionProperties(pLayerName, pCount, pProperties);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkEnumerateInstanceLayerProperties(
     uint32_t*                                   pCount,
     VkLayerProperties*                          pProperties) {
 
-	MVKTraceVulkanCall();
-	return MVKLayerManager::globalManager()->getLayerProperties(pCount, pProperties);
+	MVKTraceVulkanCallStart();
+	VkResult rslt = MVKLayerManager::globalManager()->getLayerProperties(pCount, pProperties);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkEnumerateDeviceLayerProperties(
@@ -216,9 +302,11 @@
     uint32_t*                                   pCount,
     VkLayerProperties*                          pProperties) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
-	return mvkPD->getInstance()->getLayerManager()->getLayerProperties(pCount, pProperties);
+	VkResult rslt = mvkPD->getInstance()->getLayerManager()->getLayerProperties(pCount, pProperties);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkGetDeviceQueue(
@@ -227,11 +315,12 @@
     uint32_t                                    queueIndex,
     VkQueue*                                    pQueue) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if (pQueue) {
 		MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 		*pQueue = mvkDev->getQueue(queueFamilyIndex, queueIndex)->getVkQueue();
 	}
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkQueueSubmit(
@@ -240,25 +329,31 @@
 	const VkSubmitInfo*                         pSubmits,
 	VkFence                                     fence) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKQueue* mvkQ = MVKQueue::getMVKQueue(queue);
-	return mvkQ->submit(submitCount, pSubmits, fence);
+	VkResult rslt = mvkQ->submit(submitCount, pSubmits, fence);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkQueueWaitIdle(
     VkQueue                                     queue) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKQueue* mvkQ = MVKQueue::getMVKQueue(queue);
-	return mvkQ->waitIdle();
+	VkResult rslt = mvkQ->waitIdle();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkDeviceWaitIdle(
     VkDevice                                    device) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	return mvkDev->waitIdle();
+	VkResult rslt = mvkDev->waitIdle();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkAllocateMemory(
@@ -267,11 +362,12 @@
     const VkAllocationCallbacks*                pAllocator,
     VkDeviceMemory*                             pMem) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKDeviceMemory* mvkMem = mvkDev->allocateMemory(pAllocateInfo, pAllocator);
 	VkResult rslt = mvkMem->getConfigurationResult();
 	*pMem = (VkDeviceMemory)((rslt == VK_SUCCESS) ? mvkMem : VK_NULL_HANDLE);
+	MVKTraceVulkanCallEnd();
 	return rslt;
 }
 
@@ -280,10 +376,11 @@
 	VkDeviceMemory                              mem,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !mem ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->freeMemory((MVKDeviceMemory*)mem, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkMapMemory(
@@ -294,18 +391,21 @@
    VkMemoryMapFlags                            flags,
    void**                                      ppData) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDeviceMemory* mvkMem = (MVKDeviceMemory*)mem;
-	return mvkMem->map(offset, size, flags, ppData);
+	VkResult rslt = mvkMem->map(offset, size, flags, ppData);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkUnmapMemory(
     VkDevice                                    device,
     VkDeviceMemory                              mem) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDeviceMemory* mvkMem = (MVKDeviceMemory*)mem;
-	return mvkMem->unmap();
+	mvkMem->unmap();
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkFlushMappedMemoryRanges(
@@ -313,7 +413,7 @@
     uint32_t                                    memRangeCount,
     const VkMappedMemoryRange*                  pMemRanges) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	VkResult rslt = VK_SUCCESS;
 	for (uint32_t i = 0; i < memRangeCount; i++) {
 		const VkMappedMemoryRange* pMem = &pMemRanges[i];
@@ -321,6 +421,7 @@
 		VkResult r = mvkMem->flushToDevice(pMem->offset, pMem->size);
 		if (rslt == VK_SUCCESS) { rslt = r; }
 	}
+	MVKTraceVulkanCallEnd();
 	return rslt;
 }
 
@@ -329,7 +430,7 @@
     uint32_t                                    memRangeCount,
     const VkMappedMemoryRange*                  pMemRanges) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	VkResult rslt = VK_SUCCESS;
 	for (uint32_t i = 0; i < memRangeCount; i++) {
 		const VkMappedMemoryRange* pMem = &pMemRanges[i];
@@ -337,6 +438,7 @@
 		VkResult r = mvkMem->pullFromDevice(pMem->offset, pMem->size);
 		if (rslt == VK_SUCCESS) { rslt = r; }
 	}
+	MVKTraceVulkanCallEnd();
 	return rslt;
 }
 
@@ -345,11 +447,12 @@
     VkDeviceMemory                              memory,
     VkDeviceSize*                               pCommittedMemoryInBytes) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     if ( !pCommittedMemoryInBytes ) { return; }
 
     MVKDeviceMemory* mvkMem = (MVKDeviceMemory*)memory;
     *pCommittedMemoryInBytes = mvkMem->getDeviceMemoryCommitment();
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkBindBufferMemory(
@@ -358,10 +461,12 @@
     VkDeviceMemory                              mem,
     VkDeviceSize                                memOffset) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKBuffer* mvkBuff = (MVKBuffer*)buffer;
 	MVKDeviceMemory* mvkMem = (MVKDeviceMemory*)mem;
-	return mvkBuff->bindDeviceMemory(mvkMem, memOffset);
+	VkResult rslt = mvkBuff->bindDeviceMemory(mvkMem, memOffset);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkBindImageMemory(
@@ -370,10 +475,12 @@
     VkDeviceMemory                              mem,
     VkDeviceSize                                memOffset) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKImage* mvkImg = (MVKImage*)image;
 	MVKDeviceMemory* mvkMem = (MVKDeviceMemory*)mem;
-	return mvkImg->bindDeviceMemory(mvkMem, memOffset);
+	VkResult rslt = mvkImg->bindDeviceMemory(mvkMem, memOffset);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkGetBufferMemoryRequirements(
@@ -381,9 +488,10 @@
     VkBuffer                                    buffer,
     VkMemoryRequirements*                       pMemoryRequirements) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKBuffer* mvkBuff = (MVKBuffer*)buffer;
 	mvkBuff->getMemoryRequirements(pMemoryRequirements);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetImageMemoryRequirements(
@@ -391,9 +499,10 @@
     VkImage                                     image,
     VkMemoryRequirements*                       pMemoryRequirements) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKImage* mvkImg = (MVKImage*)image;
 	mvkImg->getMemoryRequirements(pMemoryRequirements);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetImageSparseMemoryRequirements(
@@ -402,13 +511,14 @@
     uint32_t*                                   pNumRequirements,
     VkSparseImageMemoryRequirements*            pSparseMemoryRequirements) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 
 	// Metal does not support sparse images.
 	// Vulkan spec: "If the image was not created with VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then
 	// pSparseMemoryRequirementCount will be set to zero and pSparseMemoryRequirements will not be written to.".
 
 	*pNumRequirements = 0;
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceSparseImageFormatProperties(
@@ -421,13 +531,14 @@
 	uint32_t*                                   pPropertyCount,
 	VkSparseImageFormatProperties*              pProperties) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 
 	// Metal does not support sparse images.
 	// Vulkan spec: "If VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT is not supported for the given arguments,
 	// pPropertyCount will be set to zero upon return, and no data will be written to pProperties.".
 
 	*pPropertyCount = 0;
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkQueueBindSparse(
@@ -436,9 +547,11 @@
 	const VkBindSparseInfo*                     pBindInfo,
 	VkFence                                     fence) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKQueue* mvkQ = MVKQueue::getMVKQueue(queue);
-	return mvkQ->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkQueueBindSparse(): Sparse binding is not supported.");
+	VkResult rslt = mvkQ->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkQueueBindSparse(): Sparse binding is not supported.");
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateFence(
@@ -447,11 +560,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkFence*                                    pFence) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKFence* mvkFence = mvkDev->createFence(pCreateInfo, pAllocator);
 	*pFence = (VkFence)mvkFence;
-	return mvkFence->getConfigurationResult();
+	VkResult rslt = mvkFence->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyFence(
@@ -459,10 +574,11 @@
 	VkFence                                     fence,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !fence ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyFence((MVKFence*)fence, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkResetFences(
@@ -470,17 +586,21 @@
     uint32_t                                    fenceCount,
     const VkFence*                              pFences) {
 	
-	MVKTraceVulkanCall();
-	return mvkResetFences(fenceCount, pFences);
+	MVKTraceVulkanCallStart();
+	VkResult rslt = mvkResetFences(fenceCount, pFences);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetFenceStatus(
     VkDevice                                    device,
     VkFence                                     fence) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKFence* mvkFence = (MVKFence*)fence;
-	return mvkFence->getIsSignaled() ? VK_SUCCESS : VK_NOT_READY;
+	VkResult rslt = mvkFence->getIsSignaled() ? VK_SUCCESS : VK_NOT_READY;
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkWaitForFences(
@@ -490,9 +610,11 @@
     VkBool32                                    waitAll,
     uint64_t                                    timeout) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	return mvkWaitForFences(mvkDev, fenceCount, pFences, waitAll, timeout);
+	VkResult rslt = mvkWaitForFences(mvkDev, fenceCount, pFences, waitAll, timeout);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateSemaphore(
@@ -501,11 +623,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkSemaphore*                                pSemaphore) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKSemaphore* mvkSem4 = mvkDev->createSemaphore(pCreateInfo, pAllocator);
 	*pSemaphore = (VkSemaphore)mvkSem4;
-	return mvkSem4->getConfigurationResult();
+	VkResult rslt = mvkSem4->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroySemaphore(
@@ -513,10 +637,11 @@
 	VkSemaphore                                 semaphore,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !semaphore ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroySemaphore((MVKSemaphore*)semaphore, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateEvent(
@@ -525,10 +650,12 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkEvent*                                    pEvent) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	//VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	return mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateEvent(): Vukan events are not supported.");
+	VkResult rslt = mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateEvent(): Vukan events are not supported.");
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyEvent(
@@ -536,37 +663,44 @@
 	VkEvent                                     event,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !event ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkDestroyEvent(): Vukan events are not supported.");
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetEventStatus(
     VkDevice                                    device,
     VkEvent                                     event) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	return mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkGetEventStatus(): Vukan events are not supported.");
+	VkResult rslt = mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkGetEventStatus(): Vukan events are not supported.");
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkSetEvent(
     VkDevice                                    device,
     VkEvent                                     event) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	return mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkSetEvent(): Vukan events are not supported.");
+	VkResult rslt = mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkSetEvent(): Vukan events are not supported.");
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkResetEvent(
     VkDevice                                    device,
     VkEvent                                     event) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	return mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkResetEvent(): Vukan events are not supported.");
+	VkResult rslt = mvkDev->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkResetEvent(): Vukan events are not supported.");
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateQueryPool(
@@ -575,11 +709,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkQueryPool*                                pQueryPool) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKQueryPool* mvkQP = mvkDev->createQueryPool(pCreateInfo, pAllocator);
 	*pQueryPool = (VkQueryPool)mvkQP;
-	return mvkQP->getConfigurationResult();
+	VkResult rslt = mvkQP->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyQueryPool(
@@ -587,10 +723,11 @@
 	VkQueryPool                                 queryPool,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !queryPool ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyQueryPool((MVKQueryPool*)queryPool, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetQueryPoolResults(
@@ -603,9 +740,11 @@
 	VkDeviceSize                                stride,
 	VkQueryResultFlags                          flags) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKQueryPool* mvkQP = (MVKQueryPool*)queryPool;
-	return mvkQP->getResults(firstQuery, queryCount, dataSize, pData, stride, flags);
+	VkResult rslt = mvkQP->getResults(firstQuery, queryCount, dataSize, pData, stride, flags);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateBuffer(
@@ -614,11 +753,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkBuffer*                                   pBuffer) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKBuffer* mvkBuff = mvkDev->createBuffer(pCreateInfo, pAllocator);
 	*pBuffer = (VkBuffer)mvkBuff;
-	return mvkBuff->getConfigurationResult();
+	VkResult rslt = mvkBuff->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyBuffer(
@@ -626,10 +767,11 @@
 	VkBuffer                                    buffer,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !buffer ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyBuffer((MVKBuffer*)buffer, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateBufferView(
@@ -638,11 +780,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkBufferView*                               pView) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
     MVKBufferView* mvkBuffView = mvkDev->createBufferView(pCreateInfo, pAllocator);
     *pView = (VkBufferView)mvkBuffView;
-    return mvkBuffView->getConfigurationResult();
+    VkResult rslt = mvkBuffView->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyBufferView(
@@ -650,10 +794,11 @@
 	VkBufferView                                bufferView,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !bufferView ) { return; }
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
     mvkDev->destroyBufferView((MVKBufferView*)bufferView, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateImage(
@@ -662,11 +807,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkImage*                                    pImage) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKImage* mvkImg = mvkDev->createImage(pCreateInfo, pAllocator);
 	*pImage = (VkImage)mvkImg;
-	return mvkImg->getConfigurationResult();
+	VkResult rslt = mvkImg->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyImage(
@@ -674,10 +821,11 @@
 	VkImage                                     image,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !image ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyImage((MVKImage*)image, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetImageSubresourceLayout(
@@ -686,9 +834,10 @@
     const VkImageSubresource*                   pSubresource,
     VkSubresourceLayout*                        pLayout) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKImage* mvkImg = (MVKImage*)image;
 	mvkImg->getSubresourceLayout(pSubresource, pLayout);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateImageView(
@@ -697,11 +846,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkImageView*                                pView) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKImageView* mvkImgView = mvkDev->createImageView(pCreateInfo, pAllocator);
 	*pView = (VkImageView)mvkImgView;
-	return mvkImgView->getConfigurationResult();
+	VkResult rslt = mvkImgView->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyImageView(
@@ -709,10 +860,11 @@
 	VkImageView                                 imageView,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !imageView ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyImageView((MVKImageView*)imageView, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateShaderModule(
@@ -721,11 +873,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkShaderModule*                             pShaderModule) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKShaderModule* mvkShdrMod = mvkDev->createShaderModule(pCreateInfo, pAllocator);
 	*pShaderModule = (VkShaderModule)mvkShdrMod;
-	return mvkShdrMod->getConfigurationResult();
+	VkResult rslt = mvkShdrMod->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyShaderModule(
@@ -733,10 +887,11 @@
 	VkShaderModule                              shaderModule,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !shaderModule ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyShaderModule((MVKShaderModule*)shaderModule, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreatePipelineCache(
@@ -745,11 +900,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkPipelineCache*                            pPipelineCache) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKPipelineCache* mvkPLC = mvkDev->createPipelineCache(pCreateInfo, pAllocator);
 	*pPipelineCache = (VkPipelineCache)mvkPLC;
-	return mvkPLC->getConfigurationResult();
+	VkResult rslt = mvkPLC->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyPipelineCache(
@@ -757,10 +914,11 @@
 	VkPipelineCache                             pipelineCache,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !pipelineCache ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyPipelineCache((MVKPipelineCache*)pipelineCache, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPipelineCacheData(
@@ -769,9 +927,11 @@
 	size_t*                                     pDataSize,
 	void*                                       pData) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPipelineCache* mvkPLC = (MVKPipelineCache*)pipelineCache;
-	return mvkPLC->writeData(pDataSize, pData);
+	VkResult rslt = mvkPLC->writeData(pDataSize, pData);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkMergePipelineCaches(
@@ -780,9 +940,11 @@
     uint32_t                                    srcCacheCount,
     const VkPipelineCache*                      pSrcCaches) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPipelineCache* mvkPLC = (MVKPipelineCache*)destCache;
-	return mvkPLC->mergePipelineCaches(srcCacheCount, pSrcCaches);
+	VkResult rslt = mvkPLC->mergePipelineCaches(srcCacheCount, pSrcCaches);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateGraphicsPipelines(
@@ -793,9 +955,11 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkPipeline*                                 pPipelines) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	return mvkDev->createPipelines<MVKGraphicsPipeline, VkGraphicsPipelineCreateInfo>(pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
+	VkResult rslt = mvkDev->createPipelines<MVKGraphicsPipeline, VkGraphicsPipelineCreateInfo>(pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateComputePipelines(
@@ -806,9 +970,11 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkPipeline*                                 pPipelines) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-    return mvkDev->createPipelines<MVKComputePipeline, VkComputePipelineCreateInfo>(pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
+    VkResult rslt = mvkDev->createPipelines<MVKComputePipeline, VkComputePipelineCreateInfo>(pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyPipeline(
@@ -816,10 +982,11 @@
 	VkPipeline                                  pipeline,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !pipeline ) { return; }
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
     mvkDev->destroyPipeline((MVKPipeline*)pipeline, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreatePipelineLayout(
@@ -828,11 +995,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkPipelineLayout*                           pPipelineLayout) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKPipelineLayout* mvkPLL = mvkDev->createPipelineLayout(pCreateInfo, pAllocator);
 	*pPipelineLayout = (VkPipelineLayout)mvkPLL;
-	return mvkPLL->getConfigurationResult();
+	VkResult rslt = mvkPLL->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyPipelineLayout(
@@ -840,10 +1009,11 @@
 	VkPipelineLayout                            pipelineLayout,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !pipelineLayout ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyPipelineLayout((MVKPipelineLayout*)pipelineLayout, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateSampler(
@@ -852,11 +1022,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkSampler*                                  pSampler) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKSampler* mvkSamp = mvkDev->createSampler(pCreateInfo, pAllocator);
 	*pSampler = (VkSampler)mvkSamp;
-	return mvkSamp->getConfigurationResult();
+	VkResult rslt = mvkSamp->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroySampler(
@@ -864,10 +1036,11 @@
 	VkSampler                                   sampler,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !sampler ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroySampler((MVKSampler*)sampler, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateDescriptorSetLayout(
@@ -876,11 +1049,13 @@
 	const VkAllocationCallbacks*                pAllocator,
 	VkDescriptorSetLayout*                      pSetLayout) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKDescriptorSetLayout* mvkDSL = mvkDev->createDescriptorSetLayout(pCreateInfo, pAllocator);
 	*pSetLayout = (VkDescriptorSetLayout)mvkDSL;
-	return mvkDSL->getConfigurationResult();
+	VkResult rslt = mvkDSL->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyDescriptorSetLayout(
@@ -888,10 +1063,11 @@
 	VkDescriptorSetLayout                       descriptorSetLayout,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !descriptorSetLayout ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyDescriptorSetLayout((MVKDescriptorSetLayout*)descriptorSetLayout, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateDescriptorPool(
@@ -900,11 +1076,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkDescriptorPool*                           pDescriptorPool) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKDescriptorPool* mvkDP = mvkDev->createDescriptorPool(pCreateInfo, pAllocator);
 	*pDescriptorPool = (VkDescriptorPool)mvkDP;
-	return mvkDP->getConfigurationResult();
+	VkResult rslt = mvkDP->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyDescriptorPool(
@@ -912,10 +1090,11 @@
 	VkDescriptorPool                            descriptorPool,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !descriptorPool ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyDescriptorPool((MVKDescriptorPool*)descriptorPool, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkResetDescriptorPool(
@@ -923,9 +1102,11 @@
 	VkDescriptorPool                            descriptorPool,
 	VkDescriptorPoolResetFlags                  flags) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDescriptorPool* mvkDP = (MVKDescriptorPool*)descriptorPool;
-	return mvkDP->reset(flags);
+	VkResult rslt = mvkDP->reset(flags);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkAllocateDescriptorSets(
@@ -933,11 +1114,13 @@
 	const VkDescriptorSetAllocateInfo*          pAllocateInfo,
 	VkDescriptorSet*                            pDescriptorSets) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDescriptorPool* mvkDP = (MVKDescriptorPool*)pAllocateInfo->descriptorPool;
-	return mvkDP->allocateDescriptorSets(pAllocateInfo->descriptorSetCount,
-										 pAllocateInfo->pSetLayouts,
-										 pDescriptorSets);
+	VkResult rslt = mvkDP->allocateDescriptorSets(pAllocateInfo->descriptorSetCount,
+												  pAllocateInfo->pSetLayouts,
+												  pDescriptorSets);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkFreeDescriptorSets(
@@ -946,9 +1129,11 @@
     uint32_t                                    count,
 	const VkDescriptorSet*                      pDescriptorSets) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDescriptorPool* mvkDP = (MVKDescriptorPool*)descriptorPool;
-	return mvkDP->freeDescriptorSets(count, pDescriptorSets);
+	VkResult rslt = mvkDP->freeDescriptorSets(count, pDescriptorSets);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkUpdateDescriptorSets(
@@ -958,8 +1143,9 @@
     uint32_t                                    copyCount,
     const VkCopyDescriptorSet*                  pDescriptorCopies) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	mvkUpdateDescriptorSets(writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateFramebuffer(
@@ -968,11 +1154,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkFramebuffer*                              pFramebuffer) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKFramebuffer* mvkFB = mvkDev->createFramebuffer(pCreateInfo, pAllocator);
 	*pFramebuffer = (VkFramebuffer)mvkFB;
-	return mvkFB->getConfigurationResult();
+	VkResult rslt = mvkFB->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyFramebuffer(
@@ -980,10 +1168,11 @@
 	VkFramebuffer                               framebuffer,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !framebuffer ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyFramebuffer((MVKFramebuffer*)framebuffer, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateRenderPass(
@@ -992,11 +1181,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkRenderPass*                               pRenderPass) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKRenderPass* mvkRendPass = mvkDev->createRenderPass(pCreateInfo, pAllocator);
 	*pRenderPass = (VkRenderPass)mvkRendPass;
-	return mvkRendPass->getConfigurationResult();
+	VkResult rslt = mvkRendPass->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyRenderPass(
@@ -1004,10 +1195,11 @@
 	VkRenderPass                                renderPass,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !renderPass ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyRenderPass((MVKRenderPass*)renderPass, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetRenderAreaGranularity(
@@ -1015,11 +1207,12 @@
     VkRenderPass                                renderPass,
     VkExtent2D*                                 pGranularity) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     if ( !pGranularity ) { return; }
 
     MVKRenderPass* mvkRendPass = (MVKRenderPass*)renderPass;
     *pGranularity = mvkRendPass->getRenderAreaGranularity();
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateCommandPool(
@@ -1028,11 +1221,13 @@
 	const VkAllocationCallbacks*                pAllocator,
     VkCommandPool*                              pCmdPool) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	MVKCommandPool* mvkCmdPool = mvkDev->createCommandPool(pCreateInfo, pAllocator);
 	*pCmdPool = (VkCommandPool)mvkCmdPool;
-	return mvkCmdPool->getConfigurationResult();
+	VkResult rslt = mvkCmdPool->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyCommandPool(
@@ -1040,10 +1235,11 @@
 	VkCommandPool                               commandPool,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !commandPool ) { return; }
 	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
 	mvkDev->destroyCommandPool((MVKCommandPool*)commandPool, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkResetCommandPool(
@@ -1051,9 +1247,11 @@
 	VkCommandPool                               commandPool,
 	VkCommandPoolResetFlags                     flags) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandPool* mvkCmdPool = (MVKCommandPool*)commandPool;
-	return mvkCmdPool->reset(flags);
+	VkResult rslt = mvkCmdPool->reset(flags);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkAllocateCommandBuffers(
@@ -1061,9 +1259,11 @@
 	const VkCommandBufferAllocateInfo*          pAllocateInfo,
 	VkCommandBuffer*                            pCmdBuffer) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandPool* mvkCmdPool = (MVKCommandPool*)pAllocateInfo->commandPool;
-	return mvkCmdPool->allocateCommandBuffers(pAllocateInfo, pCmdBuffer);
+	VkResult rslt = mvkCmdPool->allocateCommandBuffers(pAllocateInfo, pCmdBuffer);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkFreeCommandBuffers(
@@ -1072,35 +1272,42 @@
 	uint32_t                                    commandBufferCount,
 	const VkCommandBuffer*                      pCommandBuffers) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandPool* mvkCmdPool = (MVKCommandPool*)commandPool;
 	mvkCmdPool->freeCommandBuffers(commandBufferCount, pCommandBuffers);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkBeginCommandBuffer(
     VkCommandBuffer                             commandBuffer,
     const VkCommandBufferBeginInfo*             pBeginInfo) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
-	return cmdBuff->begin(pBeginInfo);
+	VkResult rslt = cmdBuff->begin(pBeginInfo);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkEndCommandBuffer(
     VkCommandBuffer                             commandBuffer) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
-	return cmdBuff->end();
+	VkResult rslt = cmdBuff->end();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkResetCommandBuffer(
     VkCommandBuffer                             commandBuffer,
     VkCommandBufferResetFlags                   flags) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
-	return cmdBuff->reset(flags);
+	VkResult rslt = cmdBuff->reset(flags);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdBindPipeline(
@@ -1108,9 +1315,10 @@
     VkPipelineBindPoint                         pipelineBindPoint,
     VkPipeline                                  pipeline) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdBindPipeline(cmdBuff, pipelineBindPoint, pipeline);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetViewport(
@@ -1119,9 +1327,10 @@
 	uint32_t                                    viewportCount,
 	const VkViewport*                           pViewports) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdSetViewport(cmdBuff, firstViewport, viewportCount, pViewports);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetScissor(
@@ -1130,18 +1339,20 @@
 	uint32_t                                    scissorCount,
 	const VkRect2D*                             pScissors) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdSetScissor(cmdBuff, firstScissor, scissorCount, pScissors);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetLineWidth(
 	VkCommandBuffer                             commandBuffer,
 	float                                       lineWidth) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdSetLineWidth(cmdBuff, lineWidth);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetDepthBias(
@@ -1150,18 +1361,20 @@
 	float                                       depthBiasClamp,
 	float                                       depthBiasSlopeFactor) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdSetDepthBias(cmdBuff,depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetBlendConstants(
 	VkCommandBuffer                             commandBuffer,
 	const float                                 blendConst[4]) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdSetBlendConstants(cmdBuff, blendConst);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetDepthBounds(
@@ -1169,9 +1382,10 @@
 	float                                       minDepthBounds,
 	float                                       maxDepthBounds) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdSetDepthBounds(cmdBuff, minDepthBounds, maxDepthBounds);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetStencilCompareMask(
@@ -1179,9 +1393,10 @@
 	VkStencilFaceFlags                          faceMask,
 	uint32_t                                    stencilCompareMask) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdSetStencilCompareMask(cmdBuff, faceMask, stencilCompareMask);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetStencilWriteMask(
@@ -1189,9 +1404,10 @@
 	VkStencilFaceFlags                          faceMask,
 	uint32_t                                    stencilWriteMask) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdSetStencilWriteMask(cmdBuff, faceMask, stencilWriteMask);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetStencilReference(
@@ -1199,12 +1415,12 @@
 	VkStencilFaceFlags                          faceMask,
 	uint32_t                                    stencilReference) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdSetStencilReference(cmdBuff, faceMask, stencilReference);
+	MVKTraceVulkanCallEnd();
 }
 
-
 MVK_PUBLIC_SYMBOL void vkCmdBindDescriptorSets(
     VkCommandBuffer                             commandBuffer,
     VkPipelineBindPoint                         pipelineBindPoint,
@@ -1215,10 +1431,11 @@
     uint32_t                                    dynamicOffsetCount,
     const uint32_t*                             pDynamicOffsets) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdBindDescriptorSets(cmdBuff, pipelineBindPoint, layout, firstSet, setCount,
 							 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdBindIndexBuffer(
@@ -1227,9 +1444,10 @@
     VkDeviceSize                                offset,
     VkIndexType                                 indexType) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdBindIndexBuffer(cmdBuff, buffer, offset, indexType);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdBindVertexBuffers(
@@ -1239,9 +1457,10 @@
     const VkBuffer*                             pBuffers,
     const VkDeviceSize*                         pOffsets) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdBindVertexBuffers(cmdBuff, startBinding, bindingCount, pBuffers, pOffsets);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDraw(
@@ -1251,9 +1470,10 @@
 	uint32_t                                    firstVertex,
 	uint32_t                                    firstInstance) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdDraw(cmdBuff, vertexCount, instanceCount, firstVertex, firstInstance);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDrawIndexed(
@@ -1264,9 +1484,10 @@
 	int32_t                                     vertexOffset,
 	uint32_t                                    firstInstance) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdDrawIndexed(cmdBuff, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDrawIndirect(
@@ -1276,9 +1497,10 @@
     uint32_t                                    drawCount,
     uint32_t                                    stride) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdDrawIndirect(cmdBuff, buffer, offset, drawCount, stride);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDrawIndexedIndirect(
@@ -1288,9 +1510,10 @@
     uint32_t                                    drawCount,
     uint32_t                                    stride) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdDrawIndexedIndirect(cmdBuff, buffer, offset, drawCount, stride);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDispatch(
@@ -1299,9 +1522,10 @@
     uint32_t                                    y,
     uint32_t                                    z) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdDispatch(cmdBuff, x, y, z);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDispatchIndirect(
@@ -1309,9 +1533,10 @@
     VkBuffer                                    buffer,
     VkDeviceSize                                offset) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdDispatchIndirect(cmdBuff, buffer, offset);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdCopyBuffer(
@@ -1321,9 +1546,10 @@
     uint32_t                                    regionCount,
     const VkBufferCopy*                         pRegions) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdCopyBuffer(cmdBuff, srcBuffer, destBuffer, regionCount, pRegions);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdCopyImage(
@@ -1335,12 +1561,13 @@
     uint32_t                                    regionCount,
     const VkImageCopy*                          pRegions) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdCopyImage(cmdBuff,
 					srcImage, srcImageLayout,
 					dstImage, dstImageLayout,
 					regionCount, pRegions);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdBlitImage(
@@ -1353,12 +1580,13 @@
     const VkImageBlit*                          pRegions,
     VkFilter                                    filter) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdBlitImage(cmdBuff,
 					srcImage, srcImageLayout,
 					dstImage, dstImageLayout,
 					regionCount, pRegions, filter);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdCopyBufferToImage(
@@ -1369,10 +1597,11 @@
     uint32_t                                    regionCount,
     const VkBufferImageCopy*                    pRegions) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdCopyBufferToImage(cmdBuff, srcBuffer, dstImage,
                             dstImageLayout, regionCount, pRegions);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdCopyImageToBuffer(
@@ -1383,10 +1612,11 @@
     uint32_t                                    regionCount,
     const VkBufferImageCopy*                    pRegions) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdCopyImageToBuffer(cmdBuff, srcImage, srcImageLayout,
                             dstBuffer, regionCount, pRegions);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdUpdateBuffer(
@@ -1396,9 +1626,10 @@
     VkDeviceSize                                dataSize,
     const void*                                 pData) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdUpdateBuffer(cmdBuff, dstBuffer, dstOffset, dataSize, pData);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdFillBuffer(
@@ -1408,9 +1639,10 @@
     VkDeviceSize                                size,
     uint32_t                                    data) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdFillBuffer(cmdBuff, dstBuffer, dstOffset, size, data);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdClearColorImage(
@@ -1421,9 +1653,10 @@
     uint32_t                                    rangeCount,
     const VkImageSubresourceRange*              pRanges) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdClearColorImage(cmdBuff, image, imageLayout, pColor, rangeCount, pRanges);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdClearDepthStencilImage(
@@ -1434,9 +1667,10 @@
     uint32_t                                    rangeCount,
     const VkImageSubresourceRange*              pRanges) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdClearDepthStencilImage(cmdBuff, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdClearAttachments(
@@ -1446,9 +1680,10 @@
 	uint32_t                                    rectCount,
 	const VkClearRect*                          pRects) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdClearAttachments(cmdBuff, attachmentCount, pAttachments, rectCount, pRects);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdResolveImage(
@@ -1460,10 +1695,11 @@
     uint32_t                                    regionCount,
     const VkImageResolve*                       pRegions) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdResolveImage(cmdBuff, srcImage, srcImageLayout,
                        dstImage, dstImageLayout, regionCount, pRegions);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdSetEvent(
@@ -1471,9 +1707,10 @@
     VkEvent                                     event,
     VkPipelineStageFlags                        stageMask) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	cmdBuff->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdSetEvent(): Vukan events are not supported.");
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdResetEvent(
@@ -1481,9 +1718,10 @@
     VkEvent                                     event,
     VkPipelineStageFlags                        stageMask) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	cmdBuff->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdResetEvent(): Vukan events are not supported.");
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdWaitEvents(
@@ -1499,9 +1737,10 @@
 	uint32_t                                    imageMemoryBarrierCount,
 	const VkImageMemoryBarrier*                 pImageMemoryBarriers) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	cmdBuff->reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCmdWaitEvents(): Vukan events are not supported.");
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdPipelineBarrier(
@@ -1516,12 +1755,13 @@
 	uint32_t                                    imageMemoryBarrierCount,
 	const VkImageMemoryBarrier*                 pImageMemoryBarriers) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdPipelineBarrier(cmdBuff, srcStageMask, dstStageMask,
 						  dependencyFlags, memoryBarrierCount, pMemoryBarriers,
 						  bufferMemoryBarrierCount, pBufferMemoryBarriers,
 						  imageMemoryBarrierCount, pImageMemoryBarriers);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdBeginQuery(
@@ -1530,9 +1770,10 @@
     uint32_t                                    query,
     VkQueryControlFlags                         flags) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdBeginQuery(cmdBuff, queryPool, query, flags);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdEndQuery(
@@ -1540,9 +1781,10 @@
     VkQueryPool                                 queryPool,
     uint32_t                                    query) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdEndQuery(cmdBuff, queryPool, query);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdResetQueryPool(
@@ -1551,9 +1793,10 @@
     uint32_t                                    firstQuery,
     uint32_t                                    queryCount) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdResetQueryPool(cmdBuff, queryPool, firstQuery, queryCount);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdWriteTimestamp(
@@ -1562,9 +1805,10 @@
 	VkQueryPool                                 queryPool,
 	uint32_t                                    query) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdWriteTimestamp(cmdBuff, pipelineStage, queryPool, query);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdCopyQueryPoolResults(
@@ -1577,10 +1821,11 @@
     VkDeviceSize                                destStride,
     VkQueryResultFlags                          flags) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdCopyQueryPoolResults(cmdBuff, queryPool, firstQuery, queryCount,
                                destBuffer, destOffset, destStride, flags);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdPushConstants(
@@ -1591,9 +1836,10 @@
     uint32_t                                    size,
     const void*                                 pValues) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdPushConstants(cmdBuff, layout, stageFlags, offset, size, pValues);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdBeginRenderPass(
@@ -1601,26 +1847,29 @@
     const VkRenderPassBeginInfo*                pRenderPassBegin,
     VkSubpassContents							contents) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdBeginRenderPass(cmdBuff,pRenderPassBegin, contents);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdNextSubpass(
     VkCommandBuffer                             commandBuffer,
     VkSubpassContents							contents) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdNextSubpass(cmdBuff, contents);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdEndRenderPass(
     VkCommandBuffer                             commandBuffer) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdEndRenderPass(cmdBuff);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdExecuteCommands(
@@ -1628,9 +1877,10 @@
     uint32_t                                    cmdBuffersCount,
     const VkCommandBuffer*						pCommandBuffers) {
 	
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdExecuteCommands(cmdBuff, cmdBuffersCount, pCommandBuffers);
+	MVKTraceVulkanCallEnd();
 }
 
 
@@ -1642,13 +1892,14 @@
 	uint32_t									bindInfoCount,
 	const VkBindBufferMemoryInfoKHR*			pBindInfos) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	VkResult rslt = VK_SUCCESS;
 	for (uint32_t i = 0; i < bindInfoCount; ++i) {
 		MVKBuffer* mvkBuff = (MVKBuffer*)pBindInfos[i].buffer;
 		VkResult r = mvkBuff->bindDeviceMemory2(&pBindInfos[i]);
 		if (rslt == VK_SUCCESS) { rslt = r; }
 	}
+	MVKTraceVulkanCallEnd();
 	return rslt;
 }
 
@@ -1657,13 +1908,14 @@
 	uint32_t									bindInfoCount,
 	const VkBindImageMemoryInfoKHR*				pBindInfos) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	VkResult rslt = VK_SUCCESS;
 	for (uint32_t i = 0; i < bindInfoCount; ++i) {
 		MVKImage* mvkImg = (MVKImage*)pBindInfos[i].image;
 		VkResult r = mvkImg->bindDeviceMemory2(&pBindInfos[i]);
 		if (rslt == VK_SUCCESS) { rslt = r; }
 	}
+	MVKTraceVulkanCallEnd();
 	return rslt;
 }
 
@@ -1677,12 +1929,14 @@
     const VkAllocationCallbacks*                   pAllocator,
     VkDescriptorUpdateTemplateKHR*                 pDescriptorUpdateTemplate) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
     auto *mvkDUT = mvkDev->createDescriptorUpdateTemplate(pCreateInfo,
                                                           pAllocator);
     *pDescriptorUpdateTemplate = (VkDescriptorUpdateTemplateKHR)mvkDUT;
-    return mvkDUT->getConfigurationResult();
+    VkResult rslt = mvkDUT->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyDescriptorUpdateTemplateKHR(
@@ -1690,10 +1944,11 @@
     VkDescriptorUpdateTemplateKHR               descriptorUpdateTemplate,
     const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     if (!descriptorUpdateTemplate) { return; }
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
     mvkDev->destroyDescriptorUpdateTemplate((MVKDescriptorUpdateTemplate*)descriptorUpdateTemplate, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkUpdateDescriptorSetWithTemplateKHR(
@@ -1702,8 +1957,24 @@
     VkDescriptorUpdateTemplateKHR               descriptorUpdateTemplate,
     const void*                                 pData) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     mvkUpdateDescriptorSetWithTemplate(descriptorSet, descriptorUpdateTemplate, pData);
+	MVKTraceVulkanCallEnd();
+}
+
+
+#pragma mark -
+#pragma mark VK_KHR_device_group_creation extension
+
+MVK_PUBLIC_SYMBOL VkResult vkEnumeratePhysicalDeviceGroupsKHR(
+    VkInstance                                  instance,
+    uint32_t*                                   pPhysicalDeviceGroupCount,
+    VkPhysicalDeviceGroupPropertiesKHR*         pPhysicalDeviceGroupProperties) {
+    MVKTraceVulkanCallStart();
+    MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
+    VkResult rslt = mvkInst->getPhysicalDeviceGroups(pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+    MVKTraceVulkanCallEnd();
+    return rslt;
 }
 
 
@@ -1715,9 +1986,10 @@
     const VkBufferMemoryRequirementsInfo2KHR*   pInfo,
     VkMemoryRequirements2KHR*                   pMemoryRequirements) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKBuffer* mvkBuff = (MVKBuffer*)pInfo->buffer;
     mvkBuff->getMemoryRequirements(pInfo, pMemoryRequirements);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetImageMemoryRequirements2KHR(
@@ -1725,9 +1997,10 @@
     const VkImageMemoryRequirementsInfo2KHR*    pInfo,
     VkMemoryRequirements2KHR*                   pMemoryRequirements) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     auto* mvkImg = (MVKImage*)pInfo->image;
     mvkImg->getMemoryRequirements(pInfo, pMemoryRequirements);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetImageSparseMemoryRequirements2KHR(
@@ -1736,13 +2009,14 @@
     uint32_t*                                       pSparseMemoryRequirementCount,
     VkSparseImageMemoryRequirements2KHR*            pSparseMemoryRequirements) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 
 	// Metal does not support sparse images.
 	// Vulkan spec: "If the image was not created with VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then
 	// pSparseMemoryRequirementCount will be set to zero and pSparseMemoryRequirements will not be written to.".
 
     *pSparseMemoryRequirementCount = 0;
+	MVKTraceVulkanCallEnd();
 }
 
 
@@ -1753,18 +2027,20 @@
     VkPhysicalDevice                            physicalDevice,
     VkPhysicalDeviceFeatures2KHR*               pFeatures) {
     
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     mvkPD->getFeatures(pFeatures);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceProperties2KHR(
     VkPhysicalDevice                            physicalDevice,
     VkPhysicalDeviceProperties2KHR*             pProperties) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     mvkPD->getProperties(pProperties);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceFormatProperties2KHR(
@@ -1772,9 +2048,10 @@
     VkFormat                                    format,
     VkFormatProperties2KHR*                     pFormatProperties) {
     
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     mvkPD->getFormatProperties(format, pFormatProperties);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceImageFormatProperties2KHR(
@@ -1782,9 +2059,11 @@
     const VkPhysicalDeviceImageFormatInfo2KHR*  pImageFormatInfo,
     VkImageFormatProperties2KHR*                pImageFormatProperties) {
     
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
-    return mvkPD->getImageFormatProperties(pImageFormatInfo, pImageFormatProperties);
+    VkResult rslt = mvkPD->getImageFormatProperties(pImageFormatInfo, pImageFormatProperties);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceQueueFamilyProperties2KHR(
@@ -1792,18 +2071,20 @@
     uint32_t*                                   pQueueFamilyPropertyCount,
     VkQueueFamilyProperties2KHR*                pQueueFamilyProperties) {
     
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     mvkPD->getQueueFamilyProperties(pQueueFamilyPropertyCount, pQueueFamilyProperties);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceMemoryProperties2KHR(
     VkPhysicalDevice                            physicalDevice,
     VkPhysicalDeviceMemoryProperties2KHR*       pMemoryProperties) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     mvkPD->getPhysicalDeviceMemoryProperties(pMemoryProperties);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
@@ -1812,13 +2093,14 @@
     uint32_t*                                   pPropertyCount,
     VkSparseImageFormatProperties2KHR*          pProperties) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 
 	// Metal does not support sparse images.
 	// Vulkan spec: "If VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT is not supported for the given arguments,
 	// pPropertyCount will be set to zero upon return, and no data will be written to pProperties.".
 
     *pPropertyCount = 0;
+	MVKTraceVulkanCallEnd();
 }
 
 
@@ -1830,9 +2112,10 @@
     VkCommandPool                               commandPool,
     VkCommandPoolTrimFlagsKHR                   flags) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandPool* mvkCmdPool = (MVKCommandPool*)commandPool;
     mvkCmdPool->trim();
+	MVKTraceVulkanCallEnd();
 }
 
 
@@ -1844,9 +2127,10 @@
     const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,
     VkDescriptorSetLayoutSupportKHR*            pSupport) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDevice = MVKDevice::getMVKDevice(device);
     mvkDevice->getDescriptorSetLayoutSupport(pCreateInfo, pSupport);
+	MVKTraceVulkanCallEnd();
 }
 
 
@@ -1861,9 +2145,10 @@
     uint32_t                                    descriptorWriteCount,
     const VkWriteDescriptorSet*                 pDescriptorWrites) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdPushDescriptorSet(cmdBuff, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdPushDescriptorSetWithTemplateKHR(
@@ -1873,9 +2158,10 @@
     uint32_t                                   set,
     const void*                                pData) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
     mvkCmdPushDescriptorSetWithTemplate(cmdBuff, descriptorUpdateTemplate, layout, set, pData);
+	MVKTraceVulkanCallEnd();
 }
 
 
@@ -1888,11 +2174,13 @@
     const VkAllocationCallbacks*             pAllocator,
     VkSwapchainKHR*                          pSwapchain) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
     MVKSwapchain* mvkSwpChn = mvkDev->createSwapchain(pCreateInfo, pAllocator);
     *pSwapchain = (VkSwapchainKHR)(mvkSwpChn);
-    return mvkSwpChn->getConfigurationResult();
+    VkResult rslt = mvkSwpChn->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroySwapchainKHR(
@@ -1900,10 +2188,11 @@
     VkSwapchainKHR                           swapchain,
     const VkAllocationCallbacks*             pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !swapchain ) { return; }
     MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
     mvkDev->destroySwapchain((MVKSwapchain*)swapchain, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetSwapchainImagesKHR(
@@ -1912,9 +2201,11 @@
     uint32_t*                                pCount,
     VkImage*                                 pSwapchainImages) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKSwapchain* mvkSwapchain = (MVKSwapchain*)swapchain;
-    return mvkSwapchain->getImages(pCount, pSwapchainImages);
+    VkResult rslt = mvkSwapchain->getImages(pCount, pSwapchainImages);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkAcquireNextImageKHR(
@@ -1925,27 +2216,33 @@
     VkFence                                      fence,
     uint32_t*                                    pImageIndex) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKSwapchain* mvkSwapchain = (MVKSwapchain*)swapchain;
-    return mvkSwapchain->acquireNextImageKHR(timeout, semaphore, fence, ~0u, pImageIndex);
+    VkResult rslt = mvkSwapchain->acquireNextImageKHR(timeout, semaphore, fence, ~0u, pImageIndex);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkQueuePresentKHR(
     VkQueue                                      queue,
     const VkPresentInfoKHR*                      pPresentInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKQueue* mvkQ = MVKQueue::getMVKQueue(queue);
-    return mvkQ->submit(pPresentInfo);
+    VkResult rslt = mvkQ->submit(pPresentInfo);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetDeviceGroupPresentCapabilitiesKHR(
 	VkDevice                                    device,
 	VkDeviceGroupPresentCapabilitiesKHR*        pDeviceGroupPresentCapabilities) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDevice = MVKDevice::getMVKDevice(device);
-	return mvkDevice->getDeviceGroupPresentCapabilities(pDeviceGroupPresentCapabilities);
+	VkResult rslt = mvkDevice->getDeviceGroupPresentCapabilities(pDeviceGroupPresentCapabilities);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetDeviceGroupSurfacePresentModesKHR(
@@ -1953,10 +2250,12 @@
 	VkSurfaceKHR                                surface,
 	VkDeviceGroupPresentModeFlagsKHR*           pModes) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKDevice* mvkDevice = MVKDevice::getMVKDevice(device);
 	MVKSurface* mvkSrfc = (MVKSurface*)surface;
-	return mvkDevice->getDeviceGroupSurfacePresentModes(mvkSrfc, pModes);
+	VkResult rslt = mvkDevice->getDeviceGroupSurfacePresentModes(mvkSrfc, pModes);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDevicePresentRectanglesKHR(
@@ -1965,10 +2264,12 @@
 	uint32_t*                                   pRectCount,
 	VkRect2D*                                   pRects) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	MVKSurface* mvkSrfc = (MVKSurface*)surface;
-	return mvkPD->getPresentRectangles(mvkSrfc, pRectCount, pRects);
+	VkResult rslt = mvkPD->getPresentRectangles(mvkSrfc, pRectCount, pRects);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkAcquireNextImage2KHR(
@@ -1976,13 +2277,15 @@
 	const VkAcquireNextImageInfoKHR*            pAcquireInfo,
 	uint32_t*                                   pImageIndex) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKSwapchain* mvkSwapchain = (MVKSwapchain*)pAcquireInfo->swapchain;
-	return mvkSwapchain->acquireNextImageKHR(pAcquireInfo->timeout,
-											 pAcquireInfo->semaphore,
-											 pAcquireInfo->fence,
-											 pAcquireInfo->deviceMask,
-											 pImageIndex);
+	VkResult rslt = mvkSwapchain->acquireNextImageKHR(pAcquireInfo->timeout,
+													  pAcquireInfo->semaphore,
+													  pAcquireInfo->fence,
+													  pAcquireInfo->deviceMask,
+													  pImageIndex);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 
@@ -1994,10 +2297,11 @@
     VkSurfaceKHR                                 surface,
     const VkAllocationCallbacks*                 pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !surface ) { return; }
     MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
     mvkInst->destroySurface((MVKSurface*)surface, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceSurfaceSupportKHR(
@@ -2006,10 +2310,12 @@
     VkSurfaceKHR                                surface,
     VkBool32*                                   pSupported) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     MVKSurface* mvkSrfc = (MVKSurface*)surface;
-    return mvkPD->getSurfaceSupport(queueFamilyIndex, mvkSrfc, pSupported);
+    VkResult rslt = mvkPD->getSurfaceSupport(queueFamilyIndex, mvkSrfc, pSupported);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
@@ -2017,10 +2323,12 @@
     VkSurfaceKHR                                surface,
     VkSurfaceCapabilitiesKHR*                   pSurfaceCapabilities) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     MVKSurface* mvkSrfc = (MVKSurface*)surface;
-    return mvkPD->getSurfaceCapabilities(mvkSrfc, pSurfaceCapabilities);
+    VkResult rslt = mvkPD->getSurfaceCapabilities(mvkSrfc, pSurfaceCapabilities);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceSurfaceFormatsKHR(
@@ -2029,10 +2337,12 @@
     uint32_t*                                   pSurfaceFormatCount,
     VkSurfaceFormatKHR*                         pSurfaceFormats) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     MVKSurface* mvkSrfc = (MVKSurface*)surface;
-    return mvkPD->getSurfaceFormats(mvkSrfc, pSurfaceFormatCount, pSurfaceFormats);
+    VkResult rslt = mvkPD->getSurfaceFormats(mvkSrfc, pSurfaceFormatCount, pSurfaceFormats);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceSurfacePresentModesKHR(
@@ -2041,10 +2351,12 @@
     uint32_t*                                   pPresentModeCount,
     VkPresentModeKHR*                           pPresentModes) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
     MVKSurface* mvkSrfc = (MVKSurface*)surface;
-    return mvkPD->getSurfacePresentModes(mvkSrfc, pPresentModeCount, pPresentModes);
+    VkResult rslt = mvkPD->getSurfacePresentModes(mvkSrfc, pPresentModeCount, pPresentModes);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 
@@ -2056,10 +2368,12 @@
 	const VkPhysicalDeviceSurfaceInfo2KHR*      pSurfaceInfo,
 	VkSurfaceCapabilities2KHR*                  pSurfaceCapabilities) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	MVKSurface* mvkSrfc = (MVKSurface*)pSurfaceInfo->surface;
-	return mvkPD->getSurfaceCapabilities(mvkSrfc, &pSurfaceCapabilities->surfaceCapabilities);
+	VkResult rslt = mvkPD->getSurfaceCapabilities(mvkSrfc, &pSurfaceCapabilities->surfaceCapabilities);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceSurfaceFormats2KHR(
@@ -2068,25 +2382,12 @@
 	uint32_t*                                   pSurfaceFormatCount,
 	VkSurfaceFormat2KHR*                        pSurfaceFormats) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
 	MVKSurface* mvkSrfc = (MVKSurface*)pSurfaceInfo->surface;
-	return mvkPD->getSurfaceFormats(mvkSrfc, pSurfaceFormatCount, pSurfaceFormats);
-}
-
-
-#pragma mark -
-#pragma mark VK_EXT_host_query_reset extension
-
-MVK_PUBLIC_SYMBOL void vkResetQueryPoolEXT(
-    VkDevice                                    device,
-    VkQueryPool                                 queryPool,
-    uint32_t                                    firstQuery,
-    uint32_t                                    queryCount) {
-
-	MVKTraceVulkanCall();
-    auto* mvkQueryPool = (MVKQueryPool*)queryPool;
-    mvkQueryPool->resetResults(firstQuery, queryCount, nullptr);
+	VkResult rslt = mvkPD->getSurfaceFormats(mvkSrfc, pSurfaceFormatCount, pSurfaceFormats);
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 
@@ -2099,11 +2400,13 @@
 	const VkAllocationCallbacks*                pAllocator,
 	VkDebugReportCallbackEXT*                   pCallback) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
 	MVKDebugReportCallback* mvkDRCB = mvkInst->createDebugReportCallback(pCreateInfo, pAllocator);
 	*pCallback = (VkDebugReportCallbackEXT)mvkDRCB;
-	return mvkDRCB->getConfigurationResult();
+	VkResult rslt = mvkDRCB->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyDebugReportCallbackEXT(
@@ -2111,10 +2414,11 @@
 	VkDebugReportCallbackEXT                    callback,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !callback ) { return; }
 	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
 	mvkInst->destroyDebugReportCallback((MVKDebugReportCallback*)callback, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkDebugReportMessageEXT(
@@ -2127,9 +2431,10 @@
 	const char*                                 pLayerPrefix,
 	const char*                                 pMessage) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
 	mvkInst->debugReportMessage(flags, objectType, object, location, messageCode, pLayerPrefix, pMessage);
+	MVKTraceVulkanCallEnd();
 }
 
 
@@ -2140,43 +2445,50 @@
 	VkDevice                                    device,
 	const VkDebugMarkerObjectTagInfoEXT*        pTagInfo) {
 
-	MVKTraceVulkanCall();
-	return VK_SUCCESS;
+	MVKTraceVulkanCallStart();
+	VkResult rslt = VK_SUCCESS;
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkDebugMarkerSetObjectNameEXT(
 	VkDevice                                    device,
 	const VkDebugMarkerObjectNameInfoEXT*       pNameInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKVulkanAPIObject* mvkObj = MVKVulkanAPIObject::getMVKVulkanAPIObject(pNameInfo->objectType, pNameInfo->object);
-	return mvkObj ? mvkObj->setDebugName(pNameInfo->pObjectName) : VK_SUCCESS;
+	VkResult rslt = mvkObj ? mvkObj->setDebugName(pNameInfo->pObjectName) : VK_SUCCESS;
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDebugMarkerBeginEXT(
 	VkCommandBuffer                             commandBuffer,
 	const VkDebugMarkerMarkerInfoEXT*           pMarkerInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdDebugMarkerBegin(cmdBuff, pMarkerInfo);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDebugMarkerEndEXT(
 	VkCommandBuffer                             commandBuffer) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdDebugMarkerEnd(cmdBuff);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdDebugMarkerInsertEXT(
 	VkCommandBuffer                             commandBuffer,
 	const VkDebugMarkerMarkerInfoEXT*           pMarkerInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdDebugMarkerInsert(cmdBuff, pMarkerInfo);
+	MVKTraceVulkanCallEnd();
 }
 
 
@@ -2187,63 +2499,73 @@
 	VkDevice                                    device,
 	const VkDebugUtilsObjectNameInfoEXT*        pNameInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKVulkanAPIObject* mvkObj = MVKVulkanAPIObject::getMVKVulkanAPIObject(pNameInfo->objectType, pNameInfo->objectHandle);
-	return mvkObj ? mvkObj->setDebugName(pNameInfo->pObjectName) : VK_SUCCESS;
+	VkResult rslt = mvkObj ? mvkObj->setDebugName(pNameInfo->pObjectName) : VK_SUCCESS;
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkSetDebugUtilsObjectTagEXT(
 	VkDevice                                    device,
 	const VkDebugUtilsObjectTagInfoEXT*         pTagInfo) {
 
-	MVKTraceVulkanCall();
-	return VK_SUCCESS;
+	MVKTraceVulkanCallStart();
+	VkResult rslt = VK_SUCCESS;
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkQueueBeginDebugUtilsLabelEXT(
 	VkQueue                                     queue,
 	const VkDebugUtilsLabelEXT*                 pLabelInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkQueueEndDebugUtilsLabelEXT(
 	VkQueue                                     queue) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkQueueInsertDebugUtilsLabelEXT(
 	VkQueue                                     queue,
 	const VkDebugUtilsLabelEXT*                 pLabelInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdBeginDebugUtilsLabelEXT(
 	VkCommandBuffer                             commandBuffer,
 	const VkDebugUtilsLabelEXT*                 pLabelInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdBeginDebugUtilsLabel(cmdBuff, pLabelInfo);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdEndDebugUtilsLabelEXT(
 	VkCommandBuffer                             commandBuffer) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdEndDebugUtilsLabel(cmdBuff);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdInsertDebugUtilsLabelEXT(
 	VkCommandBuffer                             commandBuffer,
 	const VkDebugUtilsLabelEXT*                 pLabelInfo) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
 	mvkCmdInsertDebugUtilsLabel(cmdBuff, pLabelInfo);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL VkResult vkCreateDebugUtilsMessengerEXT(
@@ -2252,11 +2574,13 @@
 	const VkAllocationCallbacks*                pAllocator,
 	VkDebugUtilsMessengerEXT*                   pMessenger) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
 	MVKDebugUtilsMessenger* mvkDUM = mvkInst->createDebugUtilsMessenger(pCreateInfo, pAllocator);
 	*pMessenger = (VkDebugUtilsMessengerEXT)mvkDUM;
-	return mvkDUM->getConfigurationResult();
+	VkResult rslt = mvkDUM->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL void vkDestroyDebugUtilsMessengerEXT(
@@ -2264,10 +2588,11 @@
 	VkDebugUtilsMessengerEXT                    messenger,
 	const VkAllocationCallbacks*                pAllocator) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	if ( !messenger ) { return; }
 	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
 	mvkInst->destroyDebugUtilsMessenger((MVKDebugUtilsMessenger*)messenger, pAllocator);
+	MVKTraceVulkanCallEnd();
 }
 
 MVK_PUBLIC_SYMBOL void vkSubmitDebugUtilsMessageEXT(
@@ -2276,13 +2601,48 @@
 	VkDebugUtilsMessageTypeFlagsEXT             messageTypes,
 	const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
 	mvkInst->debugUtilsMessage(messageSeverity, messageTypes, pCallbackData);
+	MVKTraceVulkanCallEnd();
 }
 
 
 #pragma mark -
+#pragma mark VK_EXT_host_query_reset extension
+
+MVK_PUBLIC_SYMBOL void vkResetQueryPoolEXT(
+    VkDevice                                    device,
+    VkQueryPool                                 queryPool,
+    uint32_t                                    firstQuery,
+    uint32_t                                    queryCount) {
+
+	MVKTraceVulkanCallStart();
+    auto* mvkQueryPool = (MVKQueryPool*)queryPool;
+    mvkQueryPool->resetResults(firstQuery, queryCount, nullptr);
+	MVKTraceVulkanCallEnd();
+}
+
+
+#pragma mark -
+#pragma mark VK_EXT_metal_surface extension
+
+MVK_PUBLIC_SYMBOL VkResult vkCreateMetalSurfaceEXT(
+	VkInstance                                  instance,
+	const VkMetalSurfaceCreateInfoEXT*          pCreateInfo,
+	const VkAllocationCallbacks*                pAllocator,
+	VkSurfaceKHR*                               pSurface) {
+
+	MVKTraceVulkanCallStart();
+	MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
+	MVKSurface* mvkSrfc = mvkInst->createSurface(pCreateInfo, pAllocator);
+	*pSurface = (VkSurfaceKHR)mvkSrfc;
+	VkResult rslt = mvkSrfc->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
+}
+
+#pragma mark -
 #pragma mark iOS & macOS surface extensions
 
 MVK_PUBLIC_SYMBOL VkResult vkCreate_PLATFORM_SurfaceMVK(
@@ -2291,11 +2651,13 @@
     const VkAllocationCallbacks*                pAllocator,
     VkSurfaceKHR*                               pSurface) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
     MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
     MVKSurface* mvkSrfc = mvkInst->createSurface(pCreateInfo, pAllocator);
     *pSurface = (VkSurfaceKHR)mvkSrfc;
-    return mvkSrfc->getConfigurationResult();
+    VkResult rslt = mvkSrfc->getConfigurationResult();
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 
@@ -2318,46 +2680,44 @@
 MVK_PUBLIC_SYMBOL VkResult vk_icdNegotiateLoaderICDInterfaceVersion(
 	uint32_t*                                   pSupportedVersion) {
 
-	MVKTraceVulkanCall();
+	MVKTraceVulkanCallStart();
 
 	// This ICD expects to be loaded by a loader of at least version 5.
+	VkResult rslt = VK_SUCCESS;
 	if (pSupportedVersion && *pSupportedVersion >= 5) {
 		*pSupportedVersion = 5;
-		return VK_SUCCESS;
+	} else {
+		rslt = VK_ERROR_INCOMPATIBLE_DRIVER;
 	}
-
-	return VK_ERROR_INCOMPATIBLE_DRIVER;
+	MVKTraceVulkanCallEnd();
+	return rslt;
 }
 
 MVK_PUBLIC_SYMBOL PFN_vkVoidFunction vk_icdGetInstanceProcAddr(
 	VkInstance                                  instance,
 	const char*                                 pName) {
 
-	MVKTraceVulkanCall();
-	if (strcmp(pName, "vk_icdNegotiateLoaderICDInterfaceVersion") == 0) { return (PFN_vkVoidFunction)vk_icdNegotiateLoaderICDInterfaceVersion; }
-	if (strcmp(pName, "vk_icdGetPhysicalDeviceProcAddr") == 0) { return (PFN_vkVoidFunction)vk_icdGetPhysicalDeviceProcAddr; }
+	MVKTraceVulkanCallStart();
 
-	return vkGetInstanceProcAddr(instance, pName);
+	PFN_vkVoidFunction func = nullptr;
+	if (strcmp(pName, "vk_icdNegotiateLoaderICDInterfaceVersion") == 0) {
+		func = (PFN_vkVoidFunction)vk_icdNegotiateLoaderICDInterfaceVersion;
+	} else if (strcmp(pName, "vk_icdGetPhysicalDeviceProcAddr") == 0) {
+		func = (PFN_vkVoidFunction)vk_icdGetPhysicalDeviceProcAddr;
+	} else {
+		func = vkGetInstanceProcAddr(instance, pName);
+	}
+	MVKTraceVulkanCallEnd();
+	return func;
 }
 
 MVK_PUBLIC_SYMBOL PFN_vkVoidFunction vk_icdGetPhysicalDeviceProcAddr(
 	VkInstance                                  instance,
 	const char*                                 pName) {
 
-	MVKTraceVulkanCall();
-	return vk_icdGetInstanceProcAddr(instance, pName);
-}
-
-
-#include "MVKOSExtensions.h"
-#ifndef MVK_CONFIG_TRACE_VULKAN_CALLS
-#   define MVK_CONFIG_TRACE_VULKAN_CALLS    false
-#endif
-static bool _mvkVulkanCallTracingInitialized = false;
-__attribute__((constructor)) static void MVKInitVulkanCallTracing() {
-	if (_mvkVulkanCallTracingInitialized ) { return; }
-	_mvkVulkanCallTracingInitialized = true;
-
-	MVK_SET_FROM_ENV_OR_BUILD_BOOL(_mvkTraceVulkanCalls, MVK_CONFIG_TRACE_VULKAN_CALLS);
+	MVKTraceVulkanCallStart();
+	PFN_vkVoidFunction func = vk_icdGetInstanceProcAddr(instance, pName);
+	MVKTraceVulkanCallEnd();
+	return func;
 }
 
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm
index 1b8af9b..e295c4a 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm
@@ -31,7 +31,7 @@
                                             char** pResultLog,
                                             bool shouldLogSPIRV,
                                             bool shouldLogMSL) {
-    SPIRVToMSLConverterContext spvCtx;
+    SPIRVToMSLConversionConfiguration spvCtx;
     SPIRVToMSLConverter spvConverter;
     spvConverter.setSPIRV(spvCode, spvLength);
     bool wasConverted = spvConverter.convert(spvCtx, shouldLogSPIRV, shouldLogMSL);
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
index 4cfc542..885bb79 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
@@ -29,26 +29,21 @@
 
 
 #pragma mark -
-#pragma mark SPIRVToMSLConverterContext
+#pragma mark SPIRVToMSLConversionConfiguration
 
 // Returns whether the vector contains the value (using a matches(T&) comparison member function). */
 template<class T>
-bool contains(const vector<T>& vec, const T& val) {
+bool containsMatching(const vector<T>& vec, const T& val) {
     for (const T& vecVal : vec) { if (vecVal.matches(val)) { return true; } }
     return false;
 }
 
-MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverterOptions::matches(const SPIRVToMSLConverterOptions& other) const {
+MVK_PUBLIC_SYMBOL bool SPIRVToMSLConversionOptions::matches(const SPIRVToMSLConversionOptions& other) const {
 	if (entryPointStage != other.entryPointStage) { return false; }
 	if (entryPointName != other.entryPointName) { return false; }
 	if (tessPatchKind != other.tessPatchKind) { return false; }
 	if (numTessControlPoints != other.numTessControlPoints) { return false; }
 	if (!!shouldFlipVertexY != !!other.shouldFlipVertexY) { return false; }
-	if (!!needsSwizzleBuffer != !!other.needsSwizzleBuffer) { return false; }
-	if (!!needsOutputBuffer != !!other.needsOutputBuffer) { return false; }
-	if (!!needsPatchOutputBuffer != !!other.needsPatchOutputBuffer) { return false; }
-	if (!!needsBufferSizeBuffer != !!other.needsBufferSizeBuffer) { return false; }
-	if (!!needsInputThreadgroupMem != !!other.needsInputThreadgroupMem) { return false; }
 
 	if (mslOptions.platform != other.mslOptions.platform) { return false; }
 	if (mslOptions.msl_version != other.mslOptions.msl_version) { return false; }
@@ -72,7 +67,7 @@
 	return true;
 }
 
-MVK_PUBLIC_SYMBOL std::string SPIRVToMSLConverterOptions::printMSLVersion(uint32_t mslVersion, bool includePatch) {
+MVK_PUBLIC_SYMBOL std::string SPIRVToMSLConversionOptions::printMSLVersion(uint32_t mslVersion, bool includePatch) {
 	string verStr;
 
 	uint32_t major = mslVersion / 10000;
@@ -91,7 +86,9 @@
 	return verStr;
 }
 
-MVK_PUBLIC_SYMBOL SPIRVToMSLConverterOptions::SPIRVToMSLConverterOptions() {
+MVK_PUBLIC_SYMBOL SPIRVToMSLConversionOptions::SPIRVToMSLConversionOptions() {
+	mslOptions.pad_fragment_output_components = true;
+
 #if MVK_MACOS
 	mslOptions.platform = CompilerMSL::Options::macOS;
 #endif
@@ -143,14 +140,14 @@
 	return true;
 }
 
-MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverterContext::stageSupportsVertexAttributes() const {
+MVK_PUBLIC_SYMBOL bool SPIRVToMSLConversionConfiguration::stageSupportsVertexAttributes() const {
 	return (options.entryPointStage == spv::ExecutionModelVertex ||
 			options.entryPointStage == spv::ExecutionModelTessellationControl ||
 			options.entryPointStage == spv::ExecutionModelTessellationEvaluation);
 }
 
 // Check them all in case inactive VA's duplicate locations used by active VA's.
-MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverterContext::isVertexAttributeLocationUsed(uint32_t location) const {
+MVK_PUBLIC_SYMBOL bool SPIRVToMSLConversionConfiguration::isVertexAttributeLocationUsed(uint32_t location) const {
     for (auto& va : vertexAttributes) {
         if ((va.vertexAttribute.location == location) && va.isUsedByShader) { return true; }
     }
@@ -158,15 +155,14 @@
 }
 
 // Check them all in case inactive VA's duplicate buffers used by active VA's.
-MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverterContext::isVertexBufferUsed(uint32_t mslBuffer) const {
+MVK_PUBLIC_SYMBOL bool SPIRVToMSLConversionConfiguration::isVertexBufferUsed(uint32_t mslBuffer) const {
     for (auto& va : vertexAttributes) {
         if ((va.vertexAttribute.msl_buffer == mslBuffer) && va.isUsedByShader) { return true; }
     }
     return false;
 }
 
-MVK_PUBLIC_SYMBOL void SPIRVToMSLConverterContext::markAllAttributesAndResourcesUsed() {
-
+MVK_PUBLIC_SYMBOL void SPIRVToMSLConversionConfiguration::markAllAttributesAndResourcesUsed() {
 	if (stageSupportsVertexAttributes()) {
 		for (auto& va : vertexAttributes) { va.isUsedByShader = true; }
 	}
@@ -174,31 +170,25 @@
 	for (auto& rb : resourceBindings) { rb.isUsedByShader = true; }
 }
 
-MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverterContext::matches(const SPIRVToMSLConverterContext& other) const {
+MVK_PUBLIC_SYMBOL bool SPIRVToMSLConversionConfiguration::matches(const SPIRVToMSLConversionConfiguration& other) const {
 
     if ( !options.matches(other.options) ) { return false; }
 
 	if (stageSupportsVertexAttributes()) {
 		for (const auto& va : vertexAttributes) {
-			if (va.isUsedByShader && !contains(other.vertexAttributes, va)) { return false; }
+			if (va.isUsedByShader && !containsMatching(other.vertexAttributes, va)) { return false; }
 		}
 	}
 
     for (const auto& rb : resourceBindings) {
-        if (rb.isUsedByShader && !contains(other.resourceBindings, rb)) { return false; }
+        if (rb.isUsedByShader && !containsMatching(other.resourceBindings, rb)) { return false; }
     }
 
     return true;
 }
 
-MVK_PUBLIC_SYMBOL void SPIRVToMSLConverterContext::alignWith(const SPIRVToMSLConverterContext& srcContext) {
 
-	options.mslOptions.disable_rasterization = srcContext.options.mslOptions.disable_rasterization;
-	options.needsSwizzleBuffer = srcContext.options.needsSwizzleBuffer;
-	options.needsOutputBuffer = srcContext.options.needsOutputBuffer;
-	options.needsPatchOutputBuffer = srcContext.options.needsPatchOutputBuffer;
-	options.needsBufferSizeBuffer = srcContext.options.needsBufferSizeBuffer;
-	options.needsInputThreadgroupMem = srcContext.options.needsInputThreadgroupMem;
+MVK_PUBLIC_SYMBOL void SPIRVToMSLConversionConfiguration::alignWith(const SPIRVToMSLConversionConfiguration& srcContext) {
 
 	if (stageSupportsVertexAttributes()) {
 		for (auto& va : vertexAttributes) {
@@ -221,9 +211,6 @@
 #pragma mark -
 #pragma mark SPIRVToMSLConverter
 
-// Populates the entry point with info extracted from the SPRI-V compiler.
-void populateEntryPoint(SPIRVEntryPoint& entryPoint, SPIRV_CROSS_NAMESPACE::Compiler* pCompiler, SPIRVToMSLConverterOptions& options);
-
 MVK_PUBLIC_SYMBOL void SPIRVToMSLConverter::setSPIRV(const uint32_t* spirvCode, size_t length) {
 	_spirv.clear();			// Clear for reuse
 	_spirv.reserve(length);
@@ -232,7 +219,7 @@
 	}
 }
 
-MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverter::convert(SPIRVToMSLConverterContext& context,
+MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverter::convert(SPIRVToMSLConversionConfiguration& context,
 													bool shouldLogSPIRV,
 													bool shouldLogMSL,
                                                     bool shouldLogGLSL) {
@@ -245,6 +232,7 @@
 	_wasConverted = true;
 	_resultLog.clear();
 	_msl.clear();
+	_shaderConversionResults.reset();
 
 	if (shouldLogSPIRV) { logSPIRV("Converting"); }
 
@@ -272,7 +260,6 @@
 
 		// Establish the MSL options for the compiler
 		// This needs to be done in two steps...for CompilerMSL and its superclass.
-		context.options.mslOptions.pad_fragment_output_components = true;
 		pMSLCompiler->set_msl_options(context.options.mslOptions);
 
 		auto scOpts = pMSLCompiler->get_common_options();
@@ -312,15 +299,15 @@
 	}
 #endif
 
-	// Populate the shader context with info from the compilation run, including
-	// which vertex attributes and resource bindings are used by the shader
-	populateEntryPoint(_entryPoint, pMSLCompiler, context.options);
-	context.options.mslOptions.disable_rasterization = pMSLCompiler && pMSLCompiler->get_is_rasterization_disabled();
-	context.options.needsSwizzleBuffer = pMSLCompiler && pMSLCompiler->needs_swizzle_buffer();
-	context.options.needsOutputBuffer = pMSLCompiler && pMSLCompiler->needs_output_buffer();
-	context.options.needsPatchOutputBuffer = pMSLCompiler && pMSLCompiler->needs_patch_output_buffer();
-	context.options.needsBufferSizeBuffer = pMSLCompiler && pMSLCompiler->needs_buffer_size_buffer();
-	context.options.needsInputThreadgroupMem = pMSLCompiler && pMSLCompiler->needs_input_threadgroup_mem();
+	// Populate the shader conversion results with info from the compilation run,
+	// and mark which vertex attributes and resource bindings are used by the shader
+	populateEntryPoint(pMSLCompiler, context.options);
+	_shaderConversionResults.isRasterizationDisabled = pMSLCompiler && pMSLCompiler->get_is_rasterization_disabled();
+	_shaderConversionResults.needsSwizzleBuffer = pMSLCompiler && pMSLCompiler->needs_swizzle_buffer();
+	_shaderConversionResults.needsOutputBuffer = pMSLCompiler && pMSLCompiler->needs_output_buffer();
+	_shaderConversionResults.needsPatchOutputBuffer = pMSLCompiler && pMSLCompiler->needs_patch_output_buffer();
+	_shaderConversionResults.needsBufferSizeBuffer = pMSLCompiler && pMSLCompiler->needs_buffer_size_buffer();
+	_shaderConversionResults.needsInputThreadgroupMem = pMSLCompiler && pMSLCompiler->needs_input_threadgroup_mem();
 
 	if (context.stageSupportsVertexAttributes()) {
 		for (auto& ctxVA : context.vertexAttributes) {
@@ -433,17 +420,17 @@
     _resultLog += "\n\n";
 }
 
-
-#pragma mark Support functions
-
-// Populate a workgroup size dimension.
-void populateWorkgroupDimension(SPIRVWorkgroupSizeDimension& wgDim, uint32_t size, SPIRV_CROSS_NAMESPACE::SpecializationConstant& spvSpecConst) {
+void SPIRVToMSLConverter::populateWorkgroupDimension(SPIRVWorkgroupSizeDimension& wgDim,
+													 uint32_t size,
+													 SPIRV_CROSS_NAMESPACE::SpecializationConstant& spvSpecConst) {
 	wgDim.size = max(size, 1u);
 	wgDim.isSpecialized = (spvSpecConst.id != 0);
 	wgDim.specializationID = spvSpecConst.constant_id;
 }
 
-void populateEntryPoint(SPIRVEntryPoint& entryPoint, SPIRV_CROSS_NAMESPACE::Compiler* pCompiler, SPIRVToMSLConverterOptions& options) {
+// Populates the entry point with info extracted from the SPRI-V compiler.
+void SPIRVToMSLConverter::populateEntryPoint(SPIRV_CROSS_NAMESPACE::Compiler* pCompiler,
+											 SPIRVToMSLConversionOptions& options) {
 
 	if ( !pCompiler ) { return; }
 
@@ -458,11 +445,14 @@
 		}
 	}
 
+	auto& ep = _shaderConversionResults.entryPoint;
+	ep.mtlFunctionName = spvEP.name;
+
 	SPIRV_CROSS_NAMESPACE::SpecializationConstant widthSC, heightSC, depthSC;
 	pCompiler->get_work_group_size_specialization_constants(widthSC, heightSC, depthSC);
 
-	entryPoint.mtlFunctionName = spvEP.name;
-	populateWorkgroupDimension(entryPoint.workgroupSize.width, spvEP.workgroup_size.x, widthSC);
-	populateWorkgroupDimension(entryPoint.workgroupSize.height, spvEP.workgroup_size.y, heightSC);
-	populateWorkgroupDimension(entryPoint.workgroupSize.depth, spvEP.workgroup_size.z, depthSC);
+	auto& wgSize = ep.workgroupSize;
+	populateWorkgroupDimension(wgSize.width, spvEP.workgroup_size.x, widthSC);
+	populateWorkgroupDimension(wgSize.height, spvEP.workgroup_size.y, heightSC);
+	populateWorkgroupDimension(wgSize.depth, spvEP.workgroup_size.z, depthSC);
 }
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
index ecaa595..82024cd 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
@@ -27,9 +27,8 @@
 
 namespace mvk {
 
-
 #pragma mark -
-#pragma mark SPIRVToMSLConverterContext
+#pragma mark SPIRVToMSLConversionConfiguration
 
 	/**
 	 * Options for converting SPIR-V to Metal Shading Language
@@ -37,24 +36,19 @@
 	 * THIS STRUCT IS STREAMED OUT AS PART OF THE PIEPLINE CACHE.
 	 * CHANGES TO THIS STRUCT SHOULD BE CAPTURED IN THE STREAMING LOGIC OF THE PIPELINE CACHE.
 	 */
-	typedef struct SPIRVToMSLConverterOptions {
+	typedef struct SPIRVToMSLConversionOptions {
 		SPIRV_CROSS_NAMESPACE::CompilerMSL::Options mslOptions;
 		std::string entryPointName;
 		spv::ExecutionModel entryPointStage = spv::ExecutionModelMax;
 		spv::ExecutionMode tessPatchKind = spv::ExecutionModeMax;
 		uint32_t numTessControlPoints = 0;
 		bool shouldFlipVertexY = true;
-		bool needsSwizzleBuffer = false;
-		bool needsOutputBuffer = false;
-		bool needsPatchOutputBuffer = false;
-		bool needsBufferSizeBuffer = false;
-		bool needsInputThreadgroupMem = false;
 
 		/**
 		 * Returns whether the specified options match this one.
 		 * It does if all corresponding elements are equal.
 		 */
-		bool matches(const SPIRVToMSLConverterOptions& other) const;
+		bool matches(const SPIRVToMSLConversionOptions& other) const;
 
 		bool hasEntryPoint() const {
 			return !entryPointName.empty() && entryPointStage != spv::ExecutionModelMax;
@@ -62,14 +56,17 @@
 
 		static std::string printMSLVersion(uint32_t mslVersion, bool includePatch = false);
 
-		SPIRVToMSLConverterOptions();
+		SPIRVToMSLConversionOptions();
 
-	} SPIRVToMSLConverterOptions;
+	} SPIRVToMSLConversionOptions;
 
 	/**
 	 * Defines MSL characteristics of a vertex attribute at a particular location.
-	 * The isUsedByShader flag is set to true during conversion of SPIR-V to MSL
-	 * if the shader makes use of this vertex attribute.
+	 *
+	 * The isUsedByShader flag is set to true during conversion of SPIR-V to MSL if the shader
+	 * makes use of this vertex attribute. This allows a pipeline to be optimized, and for two
+	 * shader conversion configurations to be compared only against the attributes that are
+	 * actually used by the shader.
 	 *
 	 * THIS STRUCT IS STREAMED OUT AS PART OF THE PIEPLINE CACHE.
 	 * CHANGES TO THIS STRUCT SHOULD BE CAPTURED IN THE STREAMING LOGIC OF THE PIPELINE CACHE.
@@ -98,6 +95,11 @@
 	 * hardcoded into the MSL as a constexpr type, instead of passed in as a runtime-bound variable.
 	 * The content of that constexpr sampler is defined in the constExprSampler parameter.
 	 *
+	 * The isUsedByShader flag is set to true during conversion of SPIR-V to MSL if the shader
+	 * makes use of this resource binding. This allows a pipeline to be optimized, and for two
+	 * shader conversion configurations to be compared only against the resource bindings that
+	 * are actually used by the shader.
+	 *
 	 * THIS STRUCT IS STREAMED OUT AS PART OF THE PIEPLINE CACHE.
 	 * CHANGES TO THIS STRUCT SHOULD BE CAPTURED IN THE STREAMING LOGIC OF THE PIPELINE CACHE.
 	 */
@@ -117,13 +119,13 @@
 	} MSLResourceBinding;
 
 	/**
-	 * Context passed to the SPIRVToMSLConverter to map SPIR-V descriptors to Metal resource indices.
+	 * Configuration passed to the SPIRVToMSLConverter.
 	 *
 	 * THIS STRUCT IS STREAMED OUT AS PART OF THE PIEPLINE CACHE.
 	 * CHANGES TO THIS STRUCT SHOULD BE CAPTURED IN THE STREAMING LOGIC OF THE PIPELINE CACHE.
 	 */
-	typedef struct SPIRVToMSLConverterContext {
-		SPIRVToMSLConverterOptions options;
+	typedef struct SPIRVToMSLConversionConfiguration {
+		SPIRVToMSLConversionOptions options;
 		std::vector<MSLVertexAttribute> vertexAttributes;
 		std::vector<MSLResourceBinding> resourceBindings;
 
@@ -140,17 +142,22 @@
 		void markAllAttributesAndResourcesUsed();
 
         /**
-         * Returns whether this context matches the other context. It does if the respective 
-         * options match and any vertex attributes and resource bindings used by this context
-         * can be found in the other context. Vertex attributes and resource bindings that are
-         * in the other context but are not used by the shader that created this context, are ignored.
+         * Returns whether this configuration matches the other context. It does if the
+		 * respective options match and any vertex attributes and resource bindings used
+		 * by this configuration can be found in the other configuration. Vertex attributes
+		 * and resource bindings that are in the other configuration but are not used by
+		 * the shader that created this configuration, are ignored.
          */
-        bool matches(const SPIRVToMSLConverterContext& other) const;
+        bool matches(const SPIRVToMSLConversionConfiguration& other) const;
 
-        /** Aligns certain aspects of this context with the source context. */
-        void alignWith(const SPIRVToMSLConverterContext& srcContext);
+        /** Aligns certain aspects of this configuration with the source context. */
+        void alignWith(const SPIRVToMSLConversionConfiguration& srcContext);
 
-	} SPIRVToMSLConverterContext;
+	} SPIRVToMSLConversionConfiguration;
+
+
+#pragma mark -
+#pragma mark SPIRVToMSLConversionResults
 
     /**
      * Describes one dimension of the workgroup size of a SPIR-V entry point, including whether
@@ -183,6 +190,25 @@
 		} workgroupSize;
 	} SPIRVEntryPoint;
 
+	/**
+	 * Contains the results of the shader conversion that can be used to populate a pipeline.
+	 *
+	 * THIS STRUCT IS STREAMED OUT AS PART OF THE PIEPLINE CACHE.
+	 * CHANGES TO THIS STRUCT SHOULD BE CAPTURED IN THE STREAMING LOGIC OF THE PIPELINE CACHE.
+	 */
+	typedef struct SPIRVToMSLConversionResults {
+		SPIRVEntryPoint entryPoint;
+		bool isRasterizationDisabled = false;
+		bool needsSwizzleBuffer = false;
+		bool needsOutputBuffer = false;
+		bool needsPatchOutputBuffer = false;
+		bool needsBufferSizeBuffer = false;
+		bool needsInputThreadgroupMem = false;
+
+		void reset() { *this = SPIRVToMSLConversionResults(); }
+
+	} SPIRVToMSLConversionResults;
+
 
 #pragma mark -
 #pragma mark SPIRVToMSLConverter
@@ -214,7 +240,7 @@
          * and optionally, the original GLSL (as converted from the SPIR_V), should be logged 
          * to the result log of this converter. This can be useful during shader debugging.
 		 */
-		bool convert(SPIRVToMSLConverterContext& context,
+		bool convert(SPIRVToMSLConversionConfiguration& context,
                      bool shouldLogSPIRV = false,
                      bool shouldLogMSL = false,
                      bool shouldLogGLSL = false);
@@ -232,14 +258,15 @@
 		 */
 		const std::string& getMSL() { return _msl; }
 
-        /** Returns information about the shader entry point. */
-        const SPIRVEntryPoint& getEntryPoint() { return _entryPoint; }
+		/** Returns information about the shader conversion. */
+		const SPIRVToMSLConversionResults& getConversionResults() { return _shaderConversionResults; }
 
         /** Sets the number of threads in a single compute kernel workgroup, per dimension. */
         void setWorkgroupSize(uint32_t x, uint32_t y, uint32_t z) {
-            _entryPoint.workgroupSize.width.size = x;
-            _entryPoint.workgroupSize.height.size = y;
-            _entryPoint.workgroupSize.depth.size = z;
+			auto& wgSize = _shaderConversionResults.entryPoint.workgroupSize;
+            wgSize.width.size = x;
+            wgSize.height.size = y;
+            wgSize.depth.size = z;
         }
         
 		/**
@@ -249,10 +276,10 @@
 		const std::string& getResultLog() { return _resultLog; }
 
         /** Sets MSL source code. This can be used when MSL is supplied directly. */
-        void setMSL(const std::string& msl, const SPIRVEntryPoint* pEntryPoint) {
-            _msl = msl;
-			if (pEntryPoint) { _entryPoint = *pEntryPoint; }
-        }
+		void setMSL(const std::string& msl, const SPIRVToMSLConversionResults* pShaderConversionResults) {
+			_msl = msl;
+			if (pShaderConversionResults) { _shaderConversionResults = *pShaderConversionResults; }
+		}
 
 	protected:
 		void logMsg(const char* logMsg);
@@ -261,11 +288,13 @@
 		bool validateSPIRV();
 		void writeSPIRVToFile(std::string spvFilepath);
         void logSource(std::string& src, const char* srcLang, const char* opDesc);
+		void populateWorkgroupDimension(SPIRVWorkgroupSizeDimension& wgDim, uint32_t size, SPIRV_CROSS_NAMESPACE::SpecializationConstant& spvSpecConst);
+		void populateEntryPoint(SPIRV_CROSS_NAMESPACE::Compiler* pCompiler, SPIRVToMSLConversionOptions& options);
 
 		std::vector<uint32_t> _spirv;
 		std::string _msl;
 		std::string _resultLog;
-		SPIRVEntryPoint _entryPoint;
+		SPIRVToMSLConversionResults _shaderConversionResults;
 		bool _wasConverted = false;
 	};
 
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.cpp b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.cpp
index b95ab6b..b7c5552 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.cpp
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.cpp
@@ -204,7 +204,7 @@
 	if ( !_shouldWriteMSL ) { return true; }
 
 	// Derive the context under which conversion will occur
-	SPIRVToMSLConverterContext mslContext;
+	SPIRVToMSLConversionConfiguration mslContext;
 	mslContext.options.mslOptions.platform = _mslPlatform;
 	mslContext.options.mslOptions.set_msl_version(_mslVersionMajor, _mslVersionMinor, _mslVersionPatch);
 	mslContext.options.shouldFlipVertexY = _shouldFlipVertexY;
@@ -387,7 +387,7 @@
 	_mslVersionMajor = 2;
 	_mslVersionMinor = 1;
 	_mslVersionPatch = 0;
-	_mslPlatform = SPIRVToMSLConverterOptions().mslOptions.platform;
+	_mslPlatform = SPIRVToMSLConversionOptions().mslOptions.platform;
 
 	_isActive = parseArgs(argc, argv);
 	if ( !_isActive ) { showUsage(); }
diff --git a/README.md b/README.md
index 72d7fd1..ab05ba1 100644
--- a/README.md
+++ b/README.md
@@ -317,6 +317,19 @@
 Property claims.  
 
 
+### Memory Management
+
+*Metal*, and other *Objective-C* objects in *Apple's SDK* frameworks, use reference counting for memory management. 
+When instantiating *Objective-C* objects, it is important that you do not rely on implied *autorelease pools* to do 
+memory management for you. Because many *Vulkan* games and apps may be ported from other platforms, they will 
+typically not include autorelease pools in their threading models.
+
+Avoid the use of the `autorelease` method, or any object creation methods that imply use of `autorelease`,
+(eg- `[NSString stringWithFormat: ]`, etc). Instead, favour object creation methods that return a retained object
+(eg- `[[NSString alloc] initWithFormat: ]`, etc), and manually track and release those objects. If you need to use 
+autoreleased objects, wrap code blocks in an `@autoreleasepool {...}` block.
+
+
 ### Code Formatting
 
 When contributing code, please honour the code formatting style found in existing **MoltenVK** source code.